发送后无法删除标题

我从我的服务器得到不一致的结果。 有时会发送正确的回复,有时会出现错误

发送后无法删除标题

使用Node.js,Koa.js和Mongoose

router .get('/events/', function* getEvent() { let eventList = []; yield Event.find({}, (error, events) => { if (error) { this.response.body = 'Unable to get events.'; this.status = 404; return; } eventList = events; eventList.sort((first, second) => { // sort implementation }); this.response.body = eventList; this.status = 200; }); }); 

这个问题是由你的callback引起的,因为你的收益率并没有等待它的完成。 在Koa v1.x中,通常只使用callbackAPI来返回承诺。

以下是你如何用Koa v1.x写你的例子:

 router .get('/events', function * () { let events try { events = yield Event.find({}) } catch (err) { this.status = 503 this.body = 'Unable to get events' return } events = sort(events) this.body = events // Implicit 200 response }) 

Event.find只需要返回一些可以承诺的东西。 检查你使用的库是否有一个承诺返回版本。

虽然通常你会这样写:

 router .get('/events', function * () { let events = yield Event.find({}) events = sort(events) this.body = events }) 

由于这是一个内部错误(500响应),如果Event.findclosures。 Koa会将未被捕获的错误转化为500个响应。

基本上,在你设置this.status为200之后,它会抛出一个错误,因为this.response.body可能是undefined. 继续和console.log() this.response.body,看看它是否定义。 如果它是undefined ,我猜想req.body没有被正确填充,或者它是一个asynchronous节点问题。 基本上,eventList.sort()是asynchronous执行的,因为this.response.body = eventList被设置。 因此,eventList在您设置时尚未sorting。 为了解决这个问题,把它放在eventList.sort()callback中。

编辑:看到你的评论后,我很确定这是asynchronous的问题。 让我知道,如果把最后两行内的sorting电话为您解决。