У меня есть метод метеор для добавления адреса электронной почты в коллекцию, а затем отправки его в sendgrid.Метод Meteor вызывает HTTP-вызов, когда он не должен
export const insertEmail = new ValidatedMethod({
name: 'emails.insert',
validate: new SimpleSchema({
email: { type: String }
}).validator(),
run(email) {
let isPresent = Emails.find({email: email.email}).count();
var isEmailValid = function(address) {
return /^[A-Z0-9'.1234z_%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(address);
};
if(isPresent < 1 && isEmailValid(email.email)) {
Emails.insert({email: email.email, ip: '1'});
try {
HTTP.call('POST',
'https://api.sendgrid.com/v3/contactdb/recipients', {
headers: {
Authorization: "Bearer " + Meteor.settings.sendGridMarketingKey,
'Content-Type': 'application/json'
},
content: '[{\"email\": \"' + email.email + '\"}]'
}, function (error, success) {
if (error) {
// throw new Meteor.Error(500, error);
} else {
return success
}
});
} catch(error) {
// throw new Meteor.Error(500, error);
}
} else {
throw new Meteor.Error(500, 'This Email is Already Added!')
}
},
});
Представление и дополнение к коллекции электронных писем отлично работает, но у меня есть 2 вопроса:
1) Даже если это работает, я получаю POST https://api.sendgrid.com/v3/contactdb/recipients 403 (ЗАПРЕЩЕНО) Это происходит даже тогда, когда я введите электронная почта, которая уже добавлена, и сообщение «Это письмо уже добавлено» запускается. Кто-нибудь знает, почему я получаю сообщение об ошибке POST, когда не вижу соответствующего дубликата добавления электронной почты в свою коллекцию? Я бы наивно думал, что если я испортил логику, и я вызываю метод HTTP, когда не должен, я бы также запускал метод Email.insert в то же время, но метод HTTP, похоже, запускается сам по себе даже если нет электронной почты, которая дает эту запрещенную ошибку.
2) Я не могу понять, как правильно добавить чей-то IP-адрес в коллекцию. Ранее я использовал эту команду, и она работала, но это не похоже на работу здесь, потому что это в ValidateMethod:
var ipAddress = this.connection.clientAddress;
check(ipAddress, String);
Вы можете попытаться извлечь аргумент параметра и зарегистрировать его. Я думаю, что проблема исходит из контента, может быть, вы должны попытаться создать реальный объект в js и просто «JSON.stringify» вместо того, чтобы объединять строки вместе. – Ser
Спасибо! Я использовал 'let emailAddress = JSON.stringify (email.email);' и затем использовал 'emailAddress', чтобы ссылаться на это значение для остальной части сообщения, и это работало красиво! – Coherent