我对Express内置错误处理程序感到困惑。
我没有提供自定义错误处理程序,但我确实通过next(err)
传递了错误,就像文档说的那样,Express只记录一个[object object]
字符串。
以下是一些简化的代码:
var express = require('express');
var app = express();
app.get('/', function(req, res){
next({})
});
app.listen(3000);
当我在终端中curl http://localhost:3000
时,只有[object object]
。
所以我的问题是:
[object object]
是什么意思? 答案 0 :(得分:1)
Express使用节点模块finalhandler,该节点模块在next
处理程序中指定时也处理错误。每当error
中的next
不是null
或undefined
时,它都会尝试从error
对象status
,{{1} }和headers
本身。我想与message
响应有关的是放置在[object Object]
响应中的错误消息,如果该消息的类型为html
,则将Object
表示为强制为[object Object]
时的结果。
从错误中获取消息时,String
查找env(是否生成),并根据该消息检索消息。如果正在开发中(默认设置),则将从“ error.stack”中检索消息,因此请执行以下操作:
finalhandler
将给出next(new Error('Unauthorized'));
的html错误响应,因为在开发环境中Unauthorized
会寻找'error.stack'作为消息。
在生产中,指定状态代码将根据状态代码给出错误消息:
finalhandler
礼物:
NODE_ENV=production node server.js
next({ status: 401 });
将空对象文字放入错误中(开发中):
<title>Error</title>
</head>
<body>
<pre>Unauthorized</pre>
</body>
</html>
最终next({});
从finalhandler
收到undefined
(尝试从错误中提取消息时),然后调用error.stack
。
为什么没有关于错误堆栈的输出?
通过为debug设置环境变量可以接收到一些有用的信息。 error.toString()
也使用finalhendler
模块。为了不以不必要的信息污染终端,可以使用其命名空间来启用调试:
degub
答案 1 :(得分:0)
<强> 1 强>
[object Object]
是JSON对象的toString()
。
尝试JSON.stringify(object)
查看内部内容。
2,3
express中没有内置的错误处理程序。
如果您通读here
您将看到他们已经定义了错误处理中间件,在所有app.use
之后有四个参数。
var express = require('express');
var app = express();
app.get('/', function(req, res){
next({}) // try change to next(new Error('Something wrong')) and see the log
});
app.use(function (err, req, res, next) {
console.error(err)
res.status(500).send('Something broke!')
})
app.listen(3000);