你应该永远不会丢这样的错误! :)原因是,在某些时候,您的整个节点应用程序将停止工作,因为某些数据库查询失败。这应该被处理,而不是只是死。
而且因为这是一个route
处理程序 - 处理用户正在获取的特定url(例如/
),应该有一些输出。如果出现这样一个你无法处理的错误,或者你的内部状态可能混乱,你总是可以显示状态为500
的页面和一个不错的设计。
所以基本上只是没有任何事情发生 - 返回任何一种respones
,甚至render
页面,但提供的信息出了问题。
另外,一个常见的场景就像Alon Oz提供的一样。所有express的路由实际上都是一个中间件函数,它们被一个接一个地调用。如果路线与请求路线不匹配,则该功能会跳过并调用下一个路线。你可以手动控制。路由器的实际模式是这样的:
app.get('/', function(req, res, next) {
// you can have the request
// you can send response like res.send('hello')
// OR you can skip this function using NEXT
});
接下来的实际签名是next(err)
。所以,如果你没有任何争论的话,它只会跳到下一个中间件。如果使用参数调用它,它将跳过所有常规函数并转到堆栈中的最后一个函数,或者更具体地说,处理错误的函数。他们就像普通的人,但采取四个参数,而不是三个:
app.use(function (err, req, res, next) { });
明白,这个函数将被调用,如果你电话下一个有争论这是非常重要的。抛出一个错误将无济于事!当然,如果你的路线都不符合特定的标准(url),那么最后一个路线将被调用,所以你仍然可以处理“not found”错误。
这是您将使用一个常见的场景:
// development error handler, will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
debug('ERROR [ip: %s]:: dev env -> ', req.ip, err); // I'm using debug library - very helpful
res.status(err.status || 500);
res.render('deverr', { // I render custom template with the whole stack beautifully displayed
errMessage: err.message,
error: err
});
});
}
// production error handler, no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('pages/error', { // custom error page with nice design and a message
errMessage: err.message,
error: {}
});
});
希望帮助!:)
我发现迄今为止在Express和Node中异步错误处理的最佳资源是StrongLoop的这篇博文https://strongloop.com/strongblog/async-error-handling-expressjs-es7-promises-generators/团队落后于Express。 – korun