JSON.stringify输出空对象但错误对象实际非空,如何获取其真实内容?
问题原因
JS内置的Error类型实例的核心属性(name、message、stack)都是不可枚举属性,JSON.stringify默认仅序列化对象的可枚举自有属性,所以直接序列化Error实例会得到空对象。
解决方案
以下三种方案可根据你的业务场景选择:
方法1:手动提取属性构造可序列化对象(最稳妥,无副作用)
直接把需要的错误字段提取到新对象中再序列化,不会对全局逻辑产生影响:
// 提取你需要的所有错误字段 const serializeErr = { name: err.name, message: err.message, stack: err.stack, // 如有自定义错误属性也可在此补充,比如错误码、状态码等 code: err.code } // 序列化后即可正常通过axios发送 const errStr = JSON.stringify(serializeErr)
方法2:使用JSON.stringify的replacer参数指定序列化字段
不需要构造新对象,直接在序列化时指定要提取的属性即可:
const errStr = JSON.stringify(err, ['name', 'message', 'stack', 'code'])
方法3:给Error原型添加toJSON方法(全局生效,适合项目统一处理)
如果项目中多处需要序列化错误,可以全局注入toJSON逻辑,之后所有Error实例序列化都会自动包含核心属性:
if (!Error.prototype.toJSON) { Error.prototype.toJSON = function() { return { name: this.name, message: this.message, stack: this.stack, code: this.code } } } // 配置后直接序列化Error实例即可得到完整内容 const errStr = JSON.stringify(err)
注意:如果需要保留完整的错误调用栈信息,必须将
stack属性加入序列化字段中。
内容的提问来源于stack exchange,提问作者mykoman
相关产品推荐
相关产品推荐

