我在error handling in node上阅读了Joyent的出色指南。我也熟悉在Express中使用错误中间件来处理错误。但是,有一个细节让我感到困惑:你如何决定何时将错误渗透给调用者(例如使用cb(err)
或throw new Error()
)而不是传递给错误处理程序中间件(next(err)
)?
我将使用Joyent文章中的fetchConfig
示例函数来说明我的问题。该功能的途径如下:
我们假设有一个快速错误处理程序(function(err, res, req, next) {}
模式),用于记录错误消息并将其传递给客户端。
(仍然借用Joyent的文章......)假设1.1.2
中的连接失败:myserver: Error: connect ECONNREFUSED
。在步骤1.1.2
中,如果您通过调用next(err)
来处理该模块中的错误,那么您将记录一条相当神秘的错误消息。
相反,您首先希望错误通过步骤1.1
和1
进行渗透,并在出现错误消息时生成更明确的错误消息:myserver: failed to start up: failed to load configuration: failed to connect to database server: failed to connect to 127.0.0.1 port 1234: connect ECONNREFUSED
对我来说,这表明程序员必须在错误的每个阶段做出决定a)包装并将错误传递给其调用者,或者b)将错误传递给快速错误处理程序。我的问题集中在这个决定上:指导决策的是什么,如何在逻辑上和一致地选择?
感谢任何可能有所帮助。
答案 0 :(得分:0)
这是使用express命令在init项目中由express生成的错误处理代码。
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: 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('error', {
message: err.message,
error: {}
});
});