渲染页面后Mongojs查询完成

时间:2015-04-10 21:12:04

标签: javascript node.js mongodb koa

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

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

我有这个函数用于在从mongo db中提取一系列帖子后呈现页面。我知道这是因为javascript是异步的,但我似乎无法获得正确的订单(获取数组,然后呈现),而我所看到的解决方案似乎并不相似和koa一起为了在呈现页面之前获取数组,我将如何对其进行编码?

2 个答案:

答案 0 :(得分:2)

尝试以下方法:

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

答案 1 :(得分:0)

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

要使用synchronousyield样式进行编程,您必须使用返回promises,thunk,generator等的函数(正如您在错误消息中看到的那样)。

您可以找到支持promises的mongodb库(我认为是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});