我试图用express运行错误处理,但不是像我期望的那样看到“error!!!”的响应,而是在控制台上看到“some exception”,然后进程被杀死。这是错误处理应该设置的方式吗?如果是这样,是否有其他方法来捕获错误?
var express = require('express');
var app = express();
app.use(function(err, req, res, next) {
console.log("error!!!");
res.send("error!!!");
});
app.get('/', function(request, response) {
throw "some exception";
response.send('Hello World!');
});
app.listen(5000, function() {
console.log("Listening on 5000");
});
6条答案
按热度按时间z9gpfhce1#
https://expressjs.com/en/guide/error-handling.html上有一个关于错误处理的示例应用程序/指南,但是应该修复你的代码:
p5fdfcr12#
几个小技巧:
1)您的代码无法工作,因为您的错误处理程序中间件在到达您的路由之前运行,因此错误处理程序从未有机会将错误传递给它。这种风格称为延续传递。将错误处理程序放在中间件堆栈的最后。
2)当出现未处理的错误时,应该关闭服务器。
这意味着,你应该这样做:
你可能还应该让server.close()超时,以防它无法完成(毕竟你的应用处于未定义状态):
我做了一个库,可以为你做所有这些,并允许你定义自定义响应,包括专门的错误视图,要服务的静态文件等。
https://github.com/ericelliott/express-error-handler
r6hnlfcb3#
我也遇到了同样的问题,但不知道是哪里出了问题。问题是,如果你定义了express errorHandler,那么你的自定义错误处理程序就永远不会被调用。如果你有下一段代码,只需删除它:
为我工作:)
rggaifut4#
安装express install connect-domain,然后执行如下操作:
//我们的错误处理程序
然后在设置端点时,在use()中将errorHandler添加到端点:
cs7cruho5#
创建错误函数:
例如
我们将
name
分配给''
,以便当我们toString
错误时,它不会在它前面加上"Error: "
如前所述,如果你使用express,你可以通过指定4个参数来创建一个特殊的错误处理中间件:
如果您不使用express或其他首选项,请将该代码添加到
catch
处理程序中。为什么
1.现代应用程序处理JSON,在JSON中抛出错误更有意义,并导致更干净的UI代码。
1.你不应该仅仅因为解析不精确而抛出错误消息。如果UI是一个多语言应用程序呢?在这种情况下,他们可以使用
code
来显示本地化消息。m3eecexj6#
发现食谱从这里,甚至在官方文档制动记录高级日志,如
pino-http
(至少对于最新的express4)。问题出现时,你这样写:Express“认为”这是正常结果,记录器未记录错误。
在这里修复(第一行):
修复后的日志输出: