Sendgrid-nodejs: Библиотека не подлежит обещанию

Созданный на 22 янв. 2016  ·  18Комментарии  ·  Источник: sendgrid/sendgrid-nodejs

Чтобы структура и подход моего приложения были согласованными, я использую функцию Promisify Bluebird, чтобы превратить обратные вызовы в обещания.

К сожалению, и, похоже, это связано с использованием this внутри sendgrid.js, обещание метода send в SendGrid приводит к тому, что this становится неопределенным, и, следовательно, api_user не может быть получен, а электронная почта не может быть отправлена .

Это позор, поскольку это заставляет меня вернуться к подходу обратного вызова.

Могу я предложить, чтобы внутреннее устройство библиотеки связывало правильный контекст при использовании this, или использовалось _this (поскольку он, похоже, определен в sendgrid.js).

Если вы примете запросы на вытягивание, я буду рад внести эти исправления самостоятельно.

help wanted community enhancement

Самый полезный комментарий

@antony @dslounge на самом деле уже есть встроенный способ справиться с этим с использованием метода Promisify Bluebird путем передачи контекста, который Bluebird использует для "this"

const Promise = require('bluebird');
const sendgrid = require('sendgrid')(sendgridKey);
const sendEmail = Promise.promisify(sendgrid.send, { context: sendgrid });

Все 18 Комментарий

Привет @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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

thinkingserious picture thinkingserious  ·  4Комментарии

wooyah picture wooyah  ·  4Комментарии

polkhovsky picture polkhovsky  ·  3Комментарии

thidasapankaja picture thidasapankaja  ·  4Комментарии

murphman300 picture murphman300  ·  4Комментарии