【问题标题】:Why can't I see the keys of an Error object?为什么我看不到 Error 对象的键?
【发布时间】:2013-08-16 16:20:39
【问题描述】:

我很困惑,当我创建一个新的 Error 对象时,我可以看到它的消息或名称,但我无法使用标准方式看到它的键列表。这是为什么呢?

> err = new Error("an error")
[Error: an error]
> err.message
'an error'
> err.name
'Error'
> Object.keys(err)
[]
> JSON.stringify(err)
'{}'

【问题讨论】:

  • 尝试Object.getOwnPropertyNames() 而不是Object.keys()。它们可能是不可枚举的。
  • 例如,Object.getOwnPropertyDescriptor(err, 'stack') 显示enumerable: false

标签: javascript node.js


【解决方案1】:

JavaScript 属性可能不可枚举,这意味着它们不会出现在for..in 循环或Object.keys 结果中。

您可以使用Object.getOwnPropertyNames 直接获取对象的所有属性(可枚举或不可枚举)。我说“直接”是因为普通枚举会查找对象的原型链以获取父原型上的可枚举属性,而 getOwnPropertyNames 不会。

因此,Object.getOwnPropertyNames(err) 只显示

['stack',
 'arguments',
 'type',
 'message']

name 属性是Error.prototype 的不可枚举属性,并且永远不会直接在Error 实例上设置。 (原型回顾:当您尝试访问 err.name 时,查找 err 没有结果,因此解释器查看 Error.prototype,它确实具有 name 属性。)

【讨论】:

  • 我仍然看不到 Firefox 45 中的 stack 属性:e = new Error("Hi!"); Object.getOwnPropertyNames(e); // Array [ "fileName", "lineNumber", "columnNumber", "message" ]
  • @kiroh 我没有 Firefox 可以测试,但是Object.getOwnPropertyNames(Object.getPrototypeOf(err)) 会产生什么?在 Firefox 中,stack 可能是一个继承的访问器属性。 (通过Object.getOwnPropertyDescriptor(Object.getPrototypeOf(err), "stack") 确认这一点并检查getset 属性。)
  • @apsillers 谢谢!它实际上是原型的访问器属性。
【解决方案2】:

这是我用来通过 http 请求发送整个错误对象的方法:

// Creating a custom error
const newError = new Error('This is a new error!');
newError.name = 'Error Name';

// Function that re-create error as a regular JS Object
const getErrorObject = (error) =>
  Object.getOwnPropertyNames(error).reduce((acc, curr) => {
    acc[curr] = error[curr];
    return acc;
  }, {});

getErrorObject(newError);

/** Output:
{
  message: 'This is a new error!',
  name: 'Error Name',
  stack: 'Error Name: This is a new error!\n    at <anonymous>:1:20',
};
*/

这会捕获所有错误对象的值,即使在接收自定义错误对象时也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多