使用JSON.strgify无法对错误进行字符串化吗?再现问题在试图使用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并在各种浏览器中运行它。ChromeVersion 28给了我同样的结果,有趣的是,Firefox至少尝试了一下,但忽略了这个信息:>>> JSON.stringify(error); // Firebug, Firefox 23{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}替换函数然后我看了看错误原型..它显示了原型包含的方法,如托斯特林和到源..我知道函数不能被压缩,所以我包括了一个替换函数当调用JSON.strgify来删除所有函数时,却意识到它也有一些奇怪的行为:var error = new Error('simple error message');JSON.stringify(error, function(key, value) {
console.log(key === ''); // true (?)
console.log(value === error); // true (?)});它似乎不像通常那样在对象上循环,因此我无法检查键是否是函数而忽略它。问题是否有任何方法将本机错误消息压缩为JSON.stringify?如果没有,为什么会发生这种行为?绕过这件事的方法坚持使用简单的基于字符串的错误消息,或者创建个人错误对象,而不依赖于本机错误对象。拉力特性:JSON.stringify({ message: error.message, stack: error.stack })
3 回答
撒科打诨
TA贡献1934条经验 获得超2个赞
Error.prototype.toJSONObjectError:
if (!('toJSON' in Error.prototype))Object.defineProperty(Error.prototype, 'toJSON', {
value: function () {
var alt = {};
Object.getOwnPropertyNames(this).forEach(function (key) {
alt[key] = this[key];
}, this);
return alt;
},
configurable: true,
writable: true});var error = new Error('testing');error.detail = 'foo bar';console.log(JSON.stringify(error));// {"message":"testing","detail":"foo bar"}Object.defineProperty()toJSONenumerable
Error.prototypetoJSON()Error
JSON.stringify()replacer
function replaceErrors(key, value) {
if (value instanceof Error) {
var error = {};
Object.getOwnPropertyNames(value).forEach(function (key) {
error[key] = value[key];
});
return error;
}
return value;}var error = new Error('testing');error.detail = 'foo bar';console.log(JSON.stringify(error, replaceErrors));
婷婷同学_
TA贡献1844条经验 获得超8个赞
var stringifyError = function(err, filter, space) {
var plainObject = {};
Object.getOwnPropertyNames(err).forEach(function(key) {
plainObject[key] = err[key];
});
return JSON.stringify(plainObject, filter, space);};var error = new Error('testing');error.detail = 'foo bar';console.log(stringifyError(error, null, '\t'));
DIEA
TA贡献1820条经验 获得超3个赞
JSON.stringify
> JSON.stringify(error);'{}'回答
对于所有其他对象实例(包括Map、Set、WeakMap和WeakSet),只有它们的可枚举属性才会被序列化。
Error
添加回答
举报
0/150
提交
取消
