我编写了一个简约服务器来管理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
提前感谢您的帮助。
答案 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);