我对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
答案 0 :(得分:3)
Express路由处理程序不能表示为promise,因为promises 运行一次,而路由处理程序需要多次运行。
Express确实在适当的时候使用Node样式的回调 - 例如。 next(err)
。
然后,我的问题是:在添加如上所述的错误处理中间件之后,我可以将我的代码视为以下内容吗?
你可以,但是你首先要打败错误处理程序。在传统的Express应用程序中,当请求因错误而失败时,可以安全地跳过它之后的路由处理程序,以便将其传递给错误处理程序。
如果您将所有路由都写为错误处理程序,那么处理成功的代码部分与处理失败的部分之间没有语义上的区别。如果路由处理程序抛出或调用next(err)
,则错误将传递给下一个匹配的应用程序路由处理程序,而不是传递给专用的错误处理程序。
作为旁注,这是一个关于Connect的问题,这是构建Express的HTTP中间件实现。
答案 1 :(得分:0)
确实如此,但在这种情况下,您使用的是路由器,如果您想处理这些错误,则应在文件末尾声明错误中间件。 有一个done()回调,它接受第一个参数err和第二个完成,这是node.js使用的完全相同的回调样式。