Javascript 呈现页面后Mongojs查询完成

Javascript 呈现页面后Mongojs查询完成,javascript,node.js,mongodb,koa,Javascript,Node.js,Mongodb,Koa,我有这个函数用于在从mongo db中提取一组帖子后呈现页面。我知道这是因为JavaScript是异步的,但是我似乎无法得到正确的顺序(get数组,然后渲染),而且我所看到的解决方案似乎与膝关节炎没有很好的融合。为了在呈现页面之前获取数组,我应该如何编写此代码?请尝试以下操作: var list = []; db.posts.find({}, function(err, docs){ //console.log(docs); list = docs; }); yield thi

我有这个函数用于在从mongo db中提取一组帖子后呈现页面。我知道这是因为JavaScript是异步的,但是我似乎无法得到正确的顺序(get数组,然后渲染),而且我所看到的解决方案似乎与膝关节炎没有很好的融合。为了在呈现页面之前获取数组,我应该如何编写此代码?

请尝试以下操作:

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

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

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

要使用
yield
synchronous
风格编程,必须使用返回承诺、thunk、生成器等的函数(如错误消息中所示)

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

下面是几个将库转换为可行格式的示例

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

它给了我
TypeError:您可能只生成一个函数、承诺、生成器、数组或对象,但传递了以下对象:“[object object]”
。我相信这是因为find()返回一个游标(流?),但我不知道如何从中读取我使用的是mongojs,但thunkify方法无论如何都有效!谢谢
// 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});