【问题标题】:why Express does not implement Node.js style callbacks?为什么 Express 没有实现 Node.js 样式的回调?
【发布时间】:2017-03-21 10:15:07
【问题描述】:

我有一个关于 API 的问题。为什么 express 不实现 Node.js 样式的回调,即 Error-First Callbacks

例如router.METHOD:

router.get('/', function(req, res){
  res.send('hello world');
});

此外,我还看到了这个Error handling

app.use(function (err, req, res, next) {
  // logic
})

那么,我的问题是:像上面那样添加错误处理中间件后,我的代码可以认为如下吗?

router.get('/', function(err, req, res, next){
  res.send('hello world');
});

如果是这样,我可以使用Q.denodeify 将回调样式转换为承诺样式对吗?因为Q.denodeify,如here 所述,仅处理Node.js 样式(err, result) 回调API

【问题讨论】:

  • 在操作 API 请求之前您预计会出现什么错误?
  • @Rayon 我的第一个问题是:为什么 express 没有实现 Node.js 样式的回调,即 Error-First Callbacks? 还是我不明白它的实现?回答您的问题:我想将嵌套回调迁移到 Promise。但可能你是对的,这并不意味着我必须从router.get的最开始回调开始。
  • 在任何API请求的处理函数中都不可能出现error...
  • @ChangLiu 它不使用仅仅因为它不是结果回调而被调用一次的node.js 样式的结果回调。这与EventEmitter 也不使用 node.js 样式的回调的原因相同。

标签: javascript node.js express callback q


【解决方案1】:

Express 路由处理程序不能表示为 Promise,因为 Promise 运行一次,而路由处理程序需要运行多次

Express 实际上会在适当的时候使用 Node 风格的回调——例如next(err).

那么,我的问题是:在添加了上面的错误处理中间件之后,我可以认为我的代码如下吗?

你可以,但首先你会打败错误处理程序。在传统的 Express 应用中,当请求因错误而失败时,可以安全地跳过之后的路由处理程序,以便将其传递给错误处理程序。

如果您将所有路由都编写为错误处理程序,则处理成功的代码部分和处理失败的部分之间没有语义区别。如果路由处理程序抛出或调用next(err),则错误将传递给下一个匹配的应用程序路由处理程序,而不是专用的错误处理程序。

顺便说一句,这更多是关于 Connect 的问题,Express 所基于的 HTTP 中间件实现。

【讨论】:

  • “你可以”:你的意思是说,当我这样做时Q.denodeify(router.get.bind.(router))Q.denodeify 会认为router.get 有像function(err, req, res, next){...} 这样的回调?
  • 不,你不能包装路由器,因为它不是一个函数。您也不能将 denodeify 与错误处理程序一起使用,因为它 returns a 0 argument function,其中 connect will treat as a route handler 因为参数少于 4 个。
  • 如果您想要一个关于 express 的合理承诺集成的示例,请查看 express-promise-router
【解决方案2】:

确实如此,但在这种情况下,您使用的是路由器,如果您想处理这些错误,您应该在文件末尾声明错误中间件。 done() 回调接受第一个参数 err 和第二个 done,这与 node.js 使用的回调样式完全相同。

【讨论】:

    猜你喜欢
    • 2023-02-24
    • 2013-04-27
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2014-04-05
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多