我从服务器上得到了不一致的结果。有时发送正确的响应,有时我得到错误。
无法删除发送后的标头
使用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;
});
});
发布于 2016-07-20 14:47:44
这个问题是由您的回调引起的,它引入了一个竞赛条件,因为您的产量没有等待它完成。在Koav1.x中,通常只使用回调API来返回承诺。
下面是如何用KoaV1.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.find
关闭。Koa将把未明的错误转化为500个响应。
发布于 2016-07-18 21:45:19
基本上,在您将this.status
设置为200之后,它会抛出一个错误,因为this.response.body可能是undefined.
,请继续使用console.log()
this.response.body,并查看是否定义了它。如果是undefined
,我猜req.body
没有被正确填充,或者是异步节点问题。基本上,eventList.sort()是在设置this.response.body = eventList时异步执行的。因此,在设置eventList时,还没有对其进行排序。要解决这个问题,把它放在eventList.sort()回调中。
编辑:看到你的评论后,我很确定这是异步问题。如果把最后两行放进排序电话中,请告诉我。
https://stackoverflow.com/questions/38450258
复制相似问题