Express为什么不实现Node.js样式的回调?

时间:2017-03-21 10:15:07

标签: javascript node.js express callback q

我对API有疑问。为什么express不实现Node.js样式回调,即 错误优先回调

例如,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

2 个答案:

答案 0 :(得分:3)

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

Express确实在适当的时候使用Node样式的回调 - 例如。 next(err)

  

然后,我的问题是:在添加如上所述的错误处理中间件之后,我可以将我的代码视为以下内容吗?

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

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

作为旁注,这是一个关于Connect的问题,这是构建Express的HTTP中间件实现。

答案 1 :(得分:0)

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