Чтобы структура и подход моего приложения были согласованными, я использую функцию Promisify Bluebird, чтобы превратить обратные вызовы в обещания.
К сожалению, и, похоже, это связано с использованием this внутри sendgrid.js, обещание метода send в SendGrid приводит к тому, что this становится неопределенным, и, следовательно, api_user не может быть получен, а электронная почта не может быть отправлена .
Это позор, поскольку это заставляет меня вернуться к подходу обратного вызова.
Могу я предложить, чтобы внутреннее устройство библиотеки связывало правильный контекст при использовании this, или использовалось _this (поскольку он, похоже, определен в sendgrid.js).
Если вы примете запросы на вытягивание, я буду рад внести эти исправления самостоятельно.
Привет @antony!
Мы добавим этот запрос в наш бэк-лог.
Да, мы принимаем запросы на вытягивание и будем рады рассмотреть ваши изменения.
Спасибо!
Отлично - спасибо за это!
Я просто хотел поддержать этот вопрос. Я надеялся, что смогу обещать, но это не сработало. @antony, если ты
Кстати, не составляет большого труда заключить sendgrid.send
в обещание, если это кому-то действительно нужно. Все, что вам нужно сделать, это (пример es6):
const Promise = require('bluebird');
const sendgrid = require('sendgrid')(sendgridKey);
const sendEmail = (params) => {
return new Promise((resolve, reject) => {
sendgrid.send(params, (err, json) => {
if (err) {
reject(err);
} else {
resolve(json);
}
});
});
};
sendEmail(emailParams)
.then((json) => {
//success
})
.catch((err) => {
//error
});
@antony @dslounge на самом деле уже есть встроенный способ справиться с этим с использованием метода Promisify Bluebird путем передачи контекста, который Bluebird использует для "this"
const Promise = require('bluebird');
const sendgrid = require('sendgrid')(sendgridKey);
const sendEmail = Promise.promisify(sendgrid.send, { context: sendgrid });
Я бы вообще не хотел использовать Bluebird. Если обратный вызов sendgrid.send () не предоставляется, просто верните обещание. Bluebird - это временный обходной путь
@mynameiscoffey, ваше решение выглядит правильным.
Эй, люди,
Может быть, что-то полезное для людей, использующих Parse и Sendgrid вместе и перешедших на свой собственный сервер, потому что Parse закрывается. Вот версия кода @dslounge " Parse.Promified" (которую я хочу, чтобы вы
return new Parse.Promise(function (resolve, reject) {
sendgrid.send({
to: xxx,
from: xxx,
subject: xxx,
text: xxx,
replyto: xxx
}, function (err, json) {
if (err) {
reject(err);
} else {
resolve(json);
}
});
});
Здравствуйте все,
Я не уверен, что проблема «эта» сохраняется в новой версии этой библиотеки, поэтому пока оставляю ее открытой.
Вы можете ознакомиться с новой библиотекой здесь: https://github.com/sendgrid/sendgrid-nodejs/tree/v3beta. Бета-версия выйдет через несколько недель.
Спасибо за вашу поддержку!
С наилучшими пожеланиями,
Элмер
@thinkingserious Вы когда-нибудь задумывались о предложении @manuel-di-iorio? Например, возвращать обещания из вашего API, если не предусмотрен обратный вызов? Это полностью избавит от необходимости использовать обещание.
Еще нет @adambuczynski , но я определенно открыт для любых улучшений в этой библиотеке.
В настоящее время мы только что выпустили нашу новую конечную точку v3 / mail / send из бета-версии, и в ближайшем будущем мы исправим все ошибки, которые появляются после вчерашнего повторного запуска всех наших библиотек.
Я оставляю этот билет открытым для дальнейшего рассмотрения. Любые дополнительные отзывы приветствуются!
@thinkingserious да, я изучил код, есть некоторые улучшения, которые я бы предложил. Я посмотрю, успею ли я создать для них пиар, в том числе и этот.
Я создал эту оболочку сейчас, чтобы иметь возможность работать с sendgrid в цепочке обещаний:
/**
* Send email (wrapped in promise)
*/
function sendMail(mail) {
return new Promise((resolve, reject) => {
//Build request
let request = sg.emptyRequest();
request.method = 'POST';
request.path = '/v3/mail/send';
request.body = mail.toJSON();
//Send request
sg.API(request, response => {
if (response && response.statusCode &&
response.statusCode >= 200 && response.statusCode <= 299) {
resolve(response);
}
reject(new SendMailError(
'Sendgrid response error ' + response.statusCode
));
});
});
}
@adambuczynski добавил поддержку здесь: https://github.com/sendgrid/sendgrid-nodejs/issues/261
Чтобы помочь переместить его в очередь на слияние, нам нужны комментарии и +1
Всем спасибо!
@thinkingserious Думаю, вы имели в виду ссылку на PR, # 261 :)
@adamreisnz , одно исправление в вашем коде: согласно документации функция получает ошибку в качестве первого параметра:
sg.API (запрос, функция (ошибка, ответ) {
В любом случае, спасибо, что поделились!
Хорошо, может быть, это изменилось, а может я это пропустил, спасибо :)
С тех пор я создал эту простую библиотеку-оболочку, чтобы упростить взаимодействие с пакетом Sendgrid: https://www.npmjs.com/package/sendgrid-mailer
Самый полезный комментарий
@antony @dslounge на самом деле уже есть встроенный способ справиться с этим с использованием метода Promisify Bluebird путем передачи контекста, который Bluebird использует для "this"