在 Koa 中发送后无法删除 headers

Can't remove headers after they are sent in Koa

我编写了一个极简服务器来管理 REST 服务。唯一的编码路由应该从 mongo 检索数据,然后将其发送给客户端。代码如下。

var kr = require('koa-route');
var koa = require('koa');
var app = koa();

var MongoClient = require("mongodb").MongoClient;

var events = function * ()
{
    var _this = this;

    MongoClient.connect("mongodb://localhost/eventdata", function(error, db) {
        if (error) throw(error);
        console.log("Connecté à la base de données");

        db.collection('events').find().toArray(function(err, array)
        {
            console.log('returning %d objects', array.length);
            db.close();
            _this.body = {eventsArray : array};

        });
    });
}

app.use(kr.get('/events', events));

app.listen(3000);

Koa 是 1.2.4 版本

当我尝试访问它时,收到错误消息 "Can't remove headers after they are sent"。我设法理解程序(某种程度上)在 find() 结束之前完成发送回响应。因此,当 _this.body = { ... } 被调用时,这会导致错误。

现在的问题是:如何解决? 我刚开始练习Koa,所以有很多不习惯的地方。

我测试了此处提出的解决方案: 但它不起作用。我收到以下错误消息:

eventsArray = yield db.collection('events').find({})
                    ^^
SyntaxError : unexpected identifier

在此先感谢您的帮助。

看来您需要包装 db req 才能 promise。这样试试

var kr = require('koa-route');
var koa = require('koa');
var app = koa();

var MongoClient = require("mongodb").MongoClient;
var eventsPromise = function(){
  return new Promise(function(resolve, reject){
        MongoClient.connect("mongodb://localhost/eventdata", function(error, db) {
        if (error){ 
           return reject(error);
        }
        console.log("Connecté à la base de données");

        db.collection('events').find().toArray(function(err, array)
        {
            console.log('returning %d objects', array.length);
            db.close();
            return reslove({eventsArray : array});
        });
    });
  });
}
var events = function * ()
{
    var event = yiled eventsPromise();
    this.body = event;
}

app.use(kr.get('/events', events));

app.listen(3000);