【问题标题】:Can't remove headers after they are sent in Koa在 Koa 中发送后无法删除标头
【发布时间】:2017-02-08 15:11:10
【问题描述】:

我编写了一个极简服务器来管理 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

提前感谢您的帮助。

【问题讨论】:

    标签: node.js mongodb koa


    【解决方案1】:

    看起来你需要包装 db req 来承诺。试试这个方法

    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);

    【讨论】:

    • 令人印象深刻!你能解释一下吗?我想我没有完全理解“收益”的概念......
    • 很高兴为您提供帮助。 Koa - 使用生成器函数作为中间件。 (在这里阅读一些关于生成器的信息davidwalsh.name/es6-generators)所以,屈服了——就像生成器函数的暂停一样。我们正在等待promise的结果,然后进入下一个
    • 几乎都是简单的。非常感谢!!
    猜你喜欢
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多