返回的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; }