返回的express err对象不包含err.message

我已经问了另一个有关错误的问题。 不知道我是否应该编辑这个问题。

无论如何,下面的代码:

app.use((err, req, res, next) => { res.status(err.status || 500); res.json({ message: err.message, err // this err object doens't have err.message property }); next(); }); 

我不明白,如果这是一个节点的事情或expression的事情。

有人可以解释如何以及为什么发生这种情况?

返回时不应该包含err对象的所有属性?

目前我正在做这个来解决它:

 res.json({ err: Object.assign(err, { message: err.message }) }); 

返回时不应该包含err对象的所有属性?

对于大多数JSON序列化器,这完全取决于属性是否可枚举

在规范中, Error对象的message属性被定义为不可枚举的 ,所以它不会出现在JSON中。

我很惊讶地听到你的assign方法有效,因为根据规范,它应该回写到现有的属性,这是不可枚举的,将保持如此。 这就是V8在Chrome 50中所做的:

 var err = new Error("the error"); console.log("err.message is enumerable? " + getPropDesc(err, "message").enumerable); var obj = Object.assign(err, {message: "updated"}); console.log("obj === err? " + (obj === err)); // should be true console.log("obj.message is enumerable? " + getPropDesc(obj, "message").enumerable); console.log("JSON for err: " + JSON.stringify(err)); if (obj !== err) { // shouldn't be true console.log("JSON for obj: " + JSON.stringify(obj)); } function getPropDesc(o, prop) { var desc; while (o) { desc = Object.getOwnPropertyDescriptor(o, prop); if (desc) { return desc; } o = Object.getPrototypeOf(o); } return null; }