发送后无法删除标头

时间:2016-07-19 05:34:29

标签: javascript node.js mongoose koa

我的服务器结果不一致。有时会发送正确的响应,有时我会收到错误

  

发送邮件后无法删除邮件

使用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;
  });
});

2 个答案:

答案 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()回调中。

编辑:看到你的评论后,我很确定它现在是异步问题。如果将最后两行放在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个回复。