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

标签 javascript node.js express ecmascript-6

我问了另一个与错误有关的问题。不确定我是否应该编辑该问题。

无论如何,对于下面的代码:

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。

有人能解释一下这是怎么发生的以及为什么会发生吗?

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

目前我这样做是为了解决这个问题:

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

最佳答案

Shouldn't the err object when return contain all its properties?

对于大多数 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;
}

关于javascript - 返回的 express err 对象不包含 err.message,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37347619/

相关文章:

javascript - 更改没有 id/class 的选择选项值

javascript - 如何为同一 jquery 对话框的不同实例调用不同的操作?

javascript - 是否可以更改 ngrx/entities 中的 id?

javascript - 将函数定义为对象参数

node.js - 单元测试 Node.js 和 WebSockets (Socket.io)

javascript - Nodejs/Mongoose 将变量传递给 mongoose 函数

javascript - 最好的写法是什么? Node JS

node.js - 对同一服务器上的多个工作区使用共享的 npm node_modules/

node.js - MongoDB/Mongoose 在特定日期查询?

node.js - 尝试连接到 Azure 中的 API 但允许来源时出错