Sendgrid-nodejs: 回调函数签名不遵循Node约定

创建于 2016-06-15  ·  25评论  ·  资料来源: sendgrid/sendgrid-nodejs

这可能是你提出要做的事情一定的方式作出决定,但它与3.0.4版本库看来,回调传递给sg.API不遵循标准节点回调函数签名惯例function (error, data) 。 相反,API响应始终作为第一个对象返回。

由于我们现在负责解密原始API响应并手动分析响应头和状态代码,因此很难确定是否出了问题。

我认为这不是用户土地的责任,而是图书馆本身的责任。 如果状态代码更改怎么办? 如果响应格式更改怎么办? 如果发生错误并且返回的数据格式不同,或者为null或未定义怎么办?

解决该问题的最起码方法是让库确定是否发生错误,如果是,则用错误对象填充第一个参数(可以将响应附加到该对象)。 如果没有错误,则返回null作为第一个参数,并返回响应对象作为第二个参数。

help wanted community enhancement

最有用的评论

我当前的解决方案是检查状态码是否成功,例如:

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);

如果您对此感兴趣,那么我会考虑为此做一些公关活动。

所有25条评论

我当前的解决方案是检查状态码是否成功,例如:

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

通常,我们计划更新错误处理,但尚未对此进行范围界定。 到时候我们会考虑这些反馈。

如果要提供拉取请求,我们需要签署的CLA: https :

我们为您建议的增强功能设置了一个帮助程序结构: https :

感谢您的支持!

是的,我已经看到了邮件的帮手。 您是否要在该对象上创建邮件发送帮助器?

这对我来说听起来不错:)

@adambuczynski提出的建议很

太好了,谢谢@beldenge的验证!

请关注此问题以获取进展。 如果@adambuczynski创建拉取请求,我将在此处发布; 否则,我们会将其添加到路线图中,以进行下一个库更新。

@thinkingserious我刚刚给您邮寄了签名的CA,我希望下周有一些时间对此进行调查。

@adambuczynski我们已收到它,并感谢您的反馈!

大家好,您还没有忘记这一点,但是我忙于其他几个项目。 仍然希望在某个阶段对此进行调查:)

@thinkingserious我看过您的源代码,但看起来有点混乱。 如果我进行编辑,我的代码linter将对其进行很多自动更改(例如,添加缺少的分号,对字符串使用一致的引用样式,在语言元素之间使用一致的间距等)

你同意这种情况吗? 我认为我无法以其他方式使用该代码,因为看着它会伤我的脑筋:)

PS为什么你不使用短绒棉:)

@adambuczynski

我们使用以下代码: http :

您使用哪一个? 如果我们可以同步并使用相同的短绒棉,那就太好了。

我也使用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 :)

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

相关问题

francesco-clementi picture francesco-clementi  ·  26评论

0x80 picture 0x80  ·  19评论

antony picture antony  ·  18评论

mckravchyk picture mckravchyk  ·  20评论

julesbou picture julesbou  ·  75评论