Koa下ctx.throw有个问题
try {
await next();
} catch (err) {
ctx.response.body = {
code: err.status,
errMsg: err.message
};
// JSON.stringify(err) === '{"message":"Custom Error."}'
// ctx.body = JSON.stringify(err);
}
ctx.throw(406, 'Custom Error.');
上面是请求入口处捕获错误,下面是某个中间件抛出错误.
err序列化之后是{"message":"Custom Error."}
,为什么上面还能从err里取到err.status
和err.statusCode
呢?
我看koa使用了一个http-errors
的库,其它就不知道了…
4 回复
试了试,结果是new Error
生成的对象不能正常使用JSON.stringify
序列化,是个{}
.但是可以对生成的实例正常赋值取值.还不知道是为啥子.
原因似乎就在 http-errors 库里
ctx.throw 弄出来的 error 能看到 message 是因为,这个库把 message 定义成了可枚举的,而通常的 Error 对象,message 属性是不可枚举的。 参考 http-errors L193 根据 mdn 上对 JSON.stringify 的说法,不可枚举的属性会被忽略。
而同样能看到 status 和 statusCode 是定义到 Error 的 prototype 上面去的,所以取自身属性也取不到啦。 参考 http-errors L213
我觉得throw出来的error是个全局对象,所以可以取得到
@rrbe 谢谢,你说的是对的.JSON.stringify
不会序列化原型里的东西.