在Koa中发送标题后无法删除标题

时间:2017-02-08 15:11:10

标签: node.js mongodb 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

当我尝试访问它时,收到错误消息“发送后无法删除标题”。我设法理解程序(类型)完成在find()结束之前发送回响应。因此,当调用_this.body = {...}时,会导致错误。

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

我测试了这里提出的解决方案:Can't remove headers after they are sent但它不起作用。我收到以下错误消息:

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

看起来你需要将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);