我问过另一个与错误有关的问题。不确定我是否应该编辑这个问题。
无论如何,对于以下代码:
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();
});
我不明白这是Node事物还是Express事件。
有人可以解释一下这种情况发生的原因和原因吗?
当return包含其所有属性时,不应该是err
对象吗?
目前我这样做是为了解决它:
res.json({
err: Object.assign(err, { message: err.message })
});
答案 0 :(得分:2)
当return包含其所有属性时,不应该是
err
对象吗?
对于大多数JSON序列化程序,这完全取决于属性是否为可枚举。
在规范中,Error
对象message
属性is defined as non-enumerable,因此它不会显示在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;
}

我希望这个可以工作:
res.json({
err: Object.assign({}, err, { message: err.message })
// Note -----------^^^^
});
...但不是你引用的内容。您所获得的err
对象可能不是Error
个实例。 Error
(在ES5及更早版本中)很难分类,因此您使用的代码可能不会尝试,而是执行以下操作:
var err = Object.create(new Error("the error"));
会导致您看到的行为:
var err = Object.create(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;
}