我认为奇怪的是,Socket.IO似乎没有提供明确的内置支持以有意义的方式传递Error对象。
如果你想在Socket.IO回调中正确序列化Error对象,你可以定义一个方法来指定如何处理Error消息的序列化,例如:
.toJSON
。
if (!('toJSON' in Error.prototype)) {
Object.defineProperty(Error.prototype, 'toJSON', {
value: function () {
let result = {}
Object.getOwnPropertyNames(this).forEach((key) => {
if (key === 'stack') return
result[key] = this[key];
}, this)
return result
},
configurable: true,
writable: true
})
}
如果您正在从服务器发送消息,您需要在服务器上定义它;如果从客户端向服务器抛出错误,则还需要在客户端上定义它。
注意:在此示例中,返回错误时会剥离“stack”属性(以避免将内部信息暴露给客户端),但这可能是值得保留的内容,至少对于开发模式是如此。
更新:使用ES6更加容易
改编自我最近撰写的一篇博客文章:
https://medium.com/@iaincollins/error-handling-in-javascript-a6172ccdf9af
我很高兴地说,使用ES6可以更轻松/更清晰地完成此操作。
如果您像这样定义类来扩展Error:
class ValidationError extends Error {
constructor(message) {
super(message)
this.name = 'ValidationError'
this.message = message
}
toJSON() {
return {
error: {
name: this.name,
message: this.message,
stacktrace: this.stack
}
}
}
}
这个对象被传回来:
{ name: 'ValidationError' }
现在它看起来像这样:
{
error: {
name: 'ValidationError',
message: 'A validation error',
stacktrace: '…'
}
}
你可以通过这样做来了解预期结果:
console.log(JSON.stringify(new ValidationError('A validation error'))
JSON.stringify(new Error()) === '{}'
这样是没有用的。 - loganfsmyth