我的服务器结果不一致。有时会发送正确的响应,有时我会收到错误
发送邮件后无法删除邮件
使用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;
});
});
答案 0 :(得分:1)
基本上,在将this.status
设置为200之后,它会抛出一个错误,因为this.response.body可能是undefined.
继续前进console.log()
this.response.body并查看是否被定义为。如果是undefined
,我猜测req.body
没有正确填充或者它是异步节点问题。基本上,eventList.sort()是异步执行的,因为this.response.body = eventList已设置。因此,当您设置eventList时,它还没有排序。要解决此问题,请将其置于eventList.sort()回调中。
答案 1 :(得分:1)
这个问题是由你的回调引起的,因为你的收益并没有等到它完成,所以引入了竞争条件。在Koa v1.x中,通常只使用回调API来返回一个promise。
以下是使用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
})
如果Event.find
关闭,则内部错误(500响应)。 Koa会将未捕获的错误转换为500个回复。