我想知道是否有将内部服务器错误传播回用户的最佳实践。 IE。不是实际的错误(我记录服务器端),但至少有 500 和一条消息。
我目前有:
app.use(function(err, req, res, next) {
console.error(err.stack);
res.send(500, 'Internal server error, please contact server administrator.');
});
这很好,除了如果抛出错误我的服务器崩溃(预期)。
因此,我目前正在将所有错误传播回快速路线,即。
app.get('/api/users', function (req, res, next) {
User.getUsers(function (err, users) { // err comes back in function
// dont throw err here in callback
// throw err;
// Instead call next with the error to let express now something bad happened
if (err) return next(err);
res.json(users);
});
});
这非常有效,只是我有 30 条路线具有相同的代码行。
if (err) return next(err);
没什么大不了的,但让我想知道是否有“更好”的方法。
谢谢。
最佳答案
编辑:OP希望避免将错误传播回快速路线。
从node.js 0.6.x开始,您可以使用domains ,其行为类似于本地 process.on('uncaughtException
, …)`。已经有几个问题涉及这个问题,例如 Unable to handle exception with node.js domains using express .
诀窍是为每个请求附加一个单独的域:
app.use(function(req, res, next) { var reqDomain = domain.create(); reqDomain.add(req); reqDomain.add(res); reqDomain.on('error', function(err) { console.log("Req Domain Error: " + err); res.send(500, err.message); }); next(); });
每当发生异常时,都会调用域错误处理,并且您仍然可以访问响应对象来发送 5XX 代码。
但是,正如文档所述,发生这种情况时,您应该在清理当前连接后快速终止您的 Node.js 进程。
要考虑的另一件事是您需要确保留在同一个域中。每当我调用外部模块时我都会使用它:
exports.preserveDomain = function (fun) { var d = process.domain; return function () { var args = arguments; d.run(function () { fun.apply(null, args); }); }; };
关于node.js - Nodejs Express 应用程序,传播错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17473823/