最佳答案
我遇到了一个问题时,试图传递错误消息周围使用web套接字。我可以使用JSON.stringify
来复制我所面临的问题,以迎合更广泛的受众:
// node v0.10.15
> var error = new Error('simple error message');
undefined
> error
[Error: simple error message]
> Object.getOwnPropertyNames(error);
[ 'stack', 'arguments', 'type', 'message' ]
> JSON.stringify(error);
'{}'
问题是我最终得到了一个空对象。
浏览器
我首先尝试离开node.js,并在各种浏览器中运行它。Chrome 28给了我同样的结果,有趣的是,Firefox至少做了一个尝试,但遗漏了这条信息:
>>> JSON.stringify(error); // Firebug, Firefox 23
{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}
替代者函数
然后我看了Error.prototype。它显示原型包含toString和toSource等方法。因为知道函数不能被字符串化,所以我在调用JSON时包含了替代者函数。Stringify删除所有函数,但随后意识到它也有一些奇怪的行为:
var error = new Error('simple error message');
JSON.stringify(error, function(key, value) {
console.log(key === ''); // true (?)
console.log(value === error); // true (?)
});
它似乎不像通常那样遍历对象,因此我不能检查键是否为函数并忽略它。
有任何方法来stringify本机错误消息与JSON.stringify
?如果不是,为什么会发生这种行为?
JSON.stringify({ message: error.message, stack: error.stack })
@Ray Toal在评论中建议我看看属性描述符. c。现在很清楚为什么它不起作用了:
var error = new Error('simple error message');
var propertyNames = Object.getOwnPropertyNames(error);
var descriptor;
for (var property, i = 0, len = propertyNames.length; i < len; ++i) {
property = propertyNames[i];
descriptor = Object.getOwnPropertyDescriptor(error, property);
console.log(property, descriptor);
}
输出:
stack { get: [Function],
set: [Function],
enumerable: false,
configurable: true }
arguments { value: undefined,
writable: true,
enumerable: false,
configurable: true }
type { value: undefined,
writable: true,
enumerable: false,
configurable: true }
message { value: 'simple error message',
writable: true,
enumerable: false,
configurable: true }
关键:enumerable: false
。
公认的答案为这个问题提供了一个变通办法。