这可能是你提出要做的事情一定的方式作出决定,但它与3.0.4版本库看来,回调传递给sg.API
不遵循标准节点回调函数签名惯例function (error, data)
。 相反,API响应始终作为第一个对象返回。
由于我们现在负责解密原始API响应并手动分析响应头和状态代码,因此很难确定是否出了问题。
我认为这不是用户土地的责任,而是图书馆本身的责任。 如果状态代码更改怎么办? 如果响应格式更改怎么办? 如果发生错误并且返回的数据格式不同,或者为null或未定义怎么办?
解决该问题的最起码方法是让库确定是否发生错误,如果是,则用错误对象填充第一个参数(可以将响应附加到该对象)。 如果没有错误,则返回null
作为第一个参数,并返回响应对象作为第二个参数。
我当前的解决方案是检查状态码是否成功,例如:
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
));
});
});
}
如您所见,这非常冗长,并且需要很多样板来简单地发送电子邮件并检查其是否有效。
拟议的API将如下所示:
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, (error, response) => {
if (error {
reject(new SendMailError(error);
}
resolve(response);
});
});
}
或更妙的是,有了承诺的回报:
function sendMail(mail) {
//Build request
let request = sg.emptyRequest();
request.method = 'POST';
request.path = '/v3/mail/send';
request.body = mail.toJSON();
//Send request
return sg.API(request);
}
并且,理想情况下,我们会看到专用的邮件发送帮助器的返回,该发送器将在后台为我们创建正确的请求,从而完全不需要sendMail帮助器和样板:
sg.sendMail(mail);
如果您对此感兴趣,那么我会考虑为此做一些公关活动。
是的,我已经看到了邮件的帮手。 您是否要在该对象上创建邮件发送帮助器?
这对我来说听起来不错:)
@adambuczynski提出的建议很
太好了,谢谢@beldenge的验证!
请关注此问题以获取进展。 如果@adambuczynski创建拉取请求,我将在此处发布; 否则,我们会将其添加到路线图中,以进行下一个库更新。
@thinkingserious我刚刚给您邮寄了签名的CA,我希望下周有一些时间对此进行调查。
@adambuczynski我们已收到它,并感谢您的反馈!
大家好,您还没有忘记这一点,但是我忙于其他几个项目。 仍然希望在某个阶段对此进行调查:)
@thinkingserious我看过您的源代码,但看起来有点混乱。 如果我进行编辑,我的代码linter将对其进行很多自动更改(例如,添加缺少的分号,对字符串使用一致的引用样式,在语言元素之间使用一致的间距等)
你同意这种情况吗? 我认为我无法以其他方式使用该代码,因为看着它会伤我的脑筋:)
PS为什么你不使用短绒棉:)
我也使用ESLiint,但是似乎您并没有应用很多规则,因为代码中仍然有很多不一致之处。
这是我使用的配置: https: //gist.github.com/adambuczynski/1fa24bcfc5d17b8d26e4c39ffca7560e#file -eslintrc-node-yaml
我认为它在一致性和最佳实践之间提供了很好的平衡,但又不会太烦人。
您的项目中没有.eslintrc.yaml
配置文件。 您可以使用首选规则添加/创建一个规则,以便我也可以使用它吗?
@adambuczynski ,
我很高兴使用您的,看起来很不错:)
请添加它作为提交的一部分。
@thinkingserious它是为ES6功能设置的,例如,当您使用var
而不是let
并使用ES6解析器时发出警告。
可以吗,还是您只想向后兼容使用ES5?
我们需要支持Node.js版本:“ 0.10”,“ 0.12”,“ iojs”,“ 4”
如果我们不破坏对这些版本的支持,我会采用更现代的方法。
好的,我保留了var的问题,只是解决了出现的固定代码样式问题。 为此创建了一个PR。
@thinkingserious我也在实现Promise API,但是本机承诺仅在Node 0.11.13中引入。
有几种解决方案,请让我知道您更喜欢哪种(或结合使用):
bluebird
promises作为依赖sendgrid.Promise
为任何值,即可允许用户设置他们要使用的Promise实现。2和3的组合可能最简单,最灵活。
同意
我喜欢这个选项:“检查是否支持承诺,如果不支持则抛出错误,但是如果人们尝试使用它们,则允许用户指定他们想要的实现。
@thinkingserious完美。 我已经准备好要审查的内容,您是否要我将其推送到相同的PR或为其创建单独的PR?
@adambuczynski,您可以保持不变的PR,谢谢!
参见#261
@beldenge您介意在PR上添加+1 https://github.com/sendgrid/sendgrid-nodejs/pull/261,以便Sendgrid团队可以继续进行并考虑将其合并吗? 谢谢!
@adambuczynski我现在要添加+1 :)
最有用的评论
我当前的解决方案是检查状态码是否成功,例如:
如您所见,这非常冗长,并且需要很多样板来简单地发送电子邮件并检查其是否有效。
拟议的API将如下所示:
或更妙的是,有了承诺的回报:
并且,理想情况下,我们会看到专用的邮件发送帮助器的返回,该发送器将在后台为我们创建正确的请求,从而完全不需要sendMail帮助器和样板:
如果您对此感兴趣,那么我会考虑为此做一些公关活动。