今天在开发的时候,Node服务器端报了这个错误,根据他的提示不难发现,我在响应之后又去执行了设置响应头部的操作,导致了这一错误,下面我把代码发一下,给大家做个参考:
user.save((err,rst) => {
if (err) {
console.log("Error:" + err);
ctx.response.type = 'json';
ctx.response.body = { error: err };
}
else {
console.log("Res:" + rst);
ctx.response.type = 'json';
ctx.response.body = { success: 'regist success!' };
}
})
这里呢,是执行了一个Post注册的操作,使用的mongoose连接mongodb 进行用户存储,就在这里操作,看似我并没有提前设置headers,但是他实际上在执行save完成之前就已经执行了回调函数中的内容了,导致报错。这里多说一句,其实如果你不返回一个response,他会默认返回一个404 Not Found,故你再次设置response他就会给你报这个错误。解决办法这里我使用了es6的新特性 async … await。
var obj = await user.save();
if (obj.err) {
ctx.response.type = 'json';
ctx.response.body = { error: err };
} else {
ctx.response.type = 'json';
ctx.response.body = { success: 'regist success!' };
}
这一操作可以保证执行完成save操作,然后获取到save之后返回的信息,再进行返回执行结果,他也不回给你返回not found了,从而不会报错 set headers after they are sent to client.
更多示例可以参考:koa not found