Sendgrid-nodejs: 图书馆不可转让

创建于 2016-01-22  ·  18评论  ·  资料来源: sendgrid/sendgrid-nodejs

为了使我的应用程序的结构和方法保持一致,我使用了Bluebird的promisify函数将回调转换为Promise。

不幸的是,这似乎是由于在sendgrid.js中使用了“ this”,使SendGrid上的“ send”方法混杂化导致“ this”变得不确定,因此无法获取“ api_user”,也无法发送电子邮件。

这很遗憾,因为它迫使我回到回调方法。

我可以建议使用此库时,库的内部绑定正确的上下文,或者使用_this(因为它似乎在sendgrid.js中定义)。

如果您提出请求,我很乐意亲自进行这些修复。

help wanted community enhancement

最有用的评论

@antony @dslounge实际上已经通过使用Bluebird的promisify方法通过传递上下文供Bluebird使用“ this”的内置方法来处理此问题

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

所有18条评论

你好@安东尼

我们将这个请求添加到我们的后台日志中。

是的,我们确实接受请求请求,并很乐意审核您的更改。

谢谢!

太好了-谢谢!

我只是想第二个问题。 我希望我能承诺,但是没有用。 @antony,如果您最终进行了更改,它将使我的生活更轻松:D

顺便说一句,如果有人真的需要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实际上已经通过使用Bluebird的promisify方法通过传递上下文供Bluebird使用“ this”的内置方法来处理此问题

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

我根本不想使用Bluebird。 如果未提供sendgrid.send()的回调,则只需返回一个promise。 蓝鸟实际上是一个临时解决方法

@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 :

感谢您的支持!

最诚挚的问候,

埃尔默

@thinkingserious您是否考虑过@ manuel-di-iorio的建议? 例如,如果没有提供回调,则从您的API返回承诺? 这将消除完全使用混杂的需要。

尚未@adambuczynski ,但我绝对愿意对此库进行任何改进。

目前,我们刚刚发布了新的v3 / mail / send端点,但其测试版已经过测试,并且在不久的将来,我们将修复自昨天重新启动所有库以来出现的所有错误。

我把这张票留待进一步考虑。 感谢您提供任何其他反馈!

@thinkingserious是的,我已经研究了代码,建议进行一些改进。 我将看看是否有时间为他们创建一些PR,包括此PR。

我现在已经创建了这个包装器,以便能够在promise链中使用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 :

为了帮助将其移到队列中进行合并,我们需要添加注释和+1

感谢大家!

@thinkingserious我认为您的意思是链接到PR,#261 :)

@adamreisnz ,对代码的一个修正:根据文档,该函数将错误作为第一个参数:

sg.API(请求,功能(错误,响应){

无论如何,谢谢分享!

好的,也许已经改变了,或者我错过了,谢谢:)
此后,我创建了这个简单的包装器库,以简化与Sendgrid程序包的交互: https ://www.npmjs.com/package/sendgrid-mailer

此页面是否有帮助?
0 / 5 - 0 等级