渲染页面后Mongojs查询完成

Mongojs query finishing after rendering the page

var list = [];
db.posts.find({}, function(err, docs){
    //console.log(docs);
    list = docs;
});

yield this.render("index", {
    posts: list
});

我有这个函数可以在从 mongo 数据库中提取一系列帖子后呈现页面。我知道这是因为 javascript 是异步的,但我似乎无法获得正确的顺序(获取数组,然后渲染)并且我看到的解决方案似乎与 koa 不能很好地融合。我将如何编写代码以便在呈现页面之前获取数组?

尝试以下操作:

var list = yield db.posts.find({}).toArray();
console.log(list);
yield this.render("index", {posts: list});

我不知道你用的是什么 mongodb 库,但似乎该库只支持回调。

要使用 yieldsynchronous 风格编程,您必须使用 return promises、thunk、生成器等函数(如您在错误消息中看到的)。

您可以找到一个 mongodb 支持 promises 的库(我认为是 mongoosejs),或者您可以包装您正在使用的库。

这里有几个将您的库转换为可用格式的示例

// Manually change callback to promise returning function
var Promise = require('bluebird');
function find(criteria){
    var deffered, list;
    deffered = Promise.defer();
    db.posts.find(criteria, function(err, results){
        if(err){
            deffered.reject(err);
        }
        else{
            deffered.resolve(result);
        }
    }
    return deffered.promise;
}
// in your returning function do something like this
list = yield find({});
this.body = yield render('sometemplate', {posts: list});



// Thunk based solution
var thunkify = require('thunkify');
db.posts.find = thunkify(db.posts.find);
// now db.posts.find() returns a thunk which is yieldable
list = yield db.posts.find({});
this.body = yield render('sometemplate', {posts: list});