Express throw [object object]错误消息

时间:2018-03-22 08:31:16

标签: node.js express

我对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]

所以我的问题是:

  1. [object object]是什么意思?
  2. 内置错误处理程序如何处理错误?
  3. 为什么没有关于错误堆栈的输出?

2 个答案:

答案 0 :(得分:1)

Express使用节点模块finalhandler,该节点模块在next处理程序中指定时也处理错误。每当error中的next不是nullundefined时,它都会尝试从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);