为什么 Express 没有实现 Node.js 风格的回调?

why Express does not implement Node.js style callbacks?

我对 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
})

那么,我的问题是:如上添加了Error Handling中间件后,我的代码可以看成下面这样吗?

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

如果是这样,我可以使用 Q.denodeify converting the callback style to promise style right? Because Q.denodeify, as stated here,仅处理 Node.js 样式 (err, result) 回调 API

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

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

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

Then, my question is: after add the Error Handling middleware as above, can I regard my code as following?

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

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

附带说明一下,这更多是关于 Connect 的问题,Express 所基于的 HTTP 中间件实现。