Koa下ctx.throw有个问题
发布于 1 年前 作者 hyper-god 2276 次浏览 来自 问答
	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.statuserr.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不会序列化原型里的东西.

回到顶部