【问题标题】:Mongojs query finishing after rendering the page渲染页面后Mongojs查询完成
【发布时间】:2015-06-16 17:22:25
【问题描述】:
var list = [];
db.posts.find({}, function(err, docs){
    //console.log(docs);
    list = docs;
});

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

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

【问题讨论】:

    标签: javascript node.js mongodb koa


    【解决方案1】:

    尝试以下方法:

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

    【讨论】:

    • 它给了我TypeError: You may only yield a function, promise, generator, array, or object, but the following object was passed: "[object Object]"。我相信这是因为 find() 返回一个游标(流?),但我不知道如何从中读取。
    • 你可以做list = yield db.posts.find({}).toArray();
    【解决方案2】:

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

    要使用yield 以synchronous 风格进行编程,您必须使用返回promise、thunk、生成器等的函数(正如您在错误消息中看到的那样)。

    您可以找到一个支持 Promise 的 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});
    

    【讨论】:

    • 我使用的是 mongojs,但无论哪种方式 thunkify 方法都有效!谢谢
    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2012-12-23
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多