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



我有一个关于API的问题。为什么 express 不实现 Node.js 风格的回调,即错误优先回调

例如,路由器。方法:

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

此外,我还看到了此错误处理:

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

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

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

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

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

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

那么,我的

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

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

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

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

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

最新更新