2016-05-24 3 views
0

У меня есть метод метеор для добавления адреса электронной почты в коллекцию, а затем отправки его в 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); 
+1

Вы можете попытаться извлечь аргумент параметра и зарегистрировать его. Я думаю, что проблема исходит из контента, может быть, вы должны попытаться создать реальный объект в js и просто «JSON.stringify» вместо того, чтобы объединять строки вместе. – Ser

+0

Спасибо! Я использовал 'let emailAddress = JSON.stringify (email.email);' и затем использовал 'emailAddress', чтобы ссылаться на это значение для остальной части сообщения, и это работало красиво! – Coherent

ответ

0

Заменить:

content: '[{\"email\": \"' + email.email + '\"}]' 

в

const content = JSON.stringify([{email: email.email}]) 
const options = { 
    headers: {...}, 
    content: content 
} 
[...] 
HTTP.call(type, url, options, function (err, data) {}); 

в убедитесь, что ваши данные будут правильно отправлены.