【问题标题】:Return mongojs query result from function从函数返回 mongojs 查询结果
【发布时间】:2012-04-23 23:23:38
【问题描述】:

我创建了下面的函数来从 id 获取用户名。它工作不正常。 我可以写 console.log(result.first_name);在查询功能中,用户名显示在我的终端中,而不是浏览器中。我尝试添加“return 'something';”在函数的末尾,看看它是否出现在浏览器中——它确实出现了。如何编写函数以便返回查询结果?

函数(app.js 中的全局函数)

function usernameFromId(id, callback){
    db.users.findOne({ _id: ObjectId(id.toString()) }, function(err, result) {
        var first_name = result.first_name;
        console.log(first_name); // names show up in the console…
        callback(first_name);
    });
};

页面处理程序(在 app.js 中)

app.get('/books', function(req, res){
    function timeSince(dato){
        moment.lang('nb');
        return moment(dato).fromNow();
    };
    db.books.find().sort({ added:-1 }, function(err, docs) {
        var books = docs;
        db.activity.find().limit(9).sort({ time:-1 }, function(err, docs) {
            var activity = docs;
            res.render('books', {
                books: books,
                activity: activity,
                timeSince: timeSince,
                usernameFromId: usernameFromId
            })
        });
    });
});

模板(books.jade)

- each a in activity
    p=usernameFromId(a.user_id, function(name){return name;})

【问题讨论】:

    标签: node.js mongodb express pug


    【解决方案1】:

    不,因为 JavaScript 的异步特性。我在您的代码中添加了一些 cmets 来指示实际的执行顺序。这就是您收到错误的原因。

    function usernameFromId(id){
        var id = id.toString(); // 1
        db.users.findOne({ _id: ObjectId(id) }, function(err, result) {
            var first_name = result.first_name; // 3
        });
        return first_name; // 2
    };
    

    编辑:您可能想要以下内容

    function usernameFromId(id, callback){
        var id = id.toString();
        db.users.findOne({ _id: ObjectId(id) }, function(err, result) {
            var first_name = result.first_name; 
            callback(first_name);
        });
    };
    

    【讨论】:

    • 我得到这个:“错误:TypeError: undefined is not a function”
    • 你是不是在 id 后面输入回调函数?例如usernameFromId(4, function(name) {console.log(name);});
    • 谢谢,终端中显示了名称,但是如何从回调函数返回字符串?
    • 我试过了,我看到没有错误,但是名字没有显示出来。
    • 您不应该在 Jade 中调用 usernameFromId。从 app.js 中调用它并捕获输出并馈送到您的 Jade 模板
    【解决方案2】:

    好的,我找到了解决方案。不确定它是否有任何好处,但它有效。不需要函数。

    页面处理程序(在 app.js 中):

    app.get('/books', function(req, res){
        db.activity.find().limit(9).sort({ time:-1 }, function(err, docs) {
            var activity = docs;
            db.users.find(function(err, docs) {
                var users = docs;
                res.render('books', {
                    page_title:'books',
                    activity: activity,
                    users: users
                })
            });
        });
    });
    

    模板(books.jade):

    - each a in activity
        - for u in users
            - if (a.user_id == u._id.toString())
                | #{u.first_name}
    

    【讨论】:

    • 您可以将您的响应包装在一个闭包中以使其更具可测试性。然后将闭包作为回调传递给查询——这样你就可以用一个模拟或不需要 HTTP 的东西来代替它。在stackoverflow.com/questions/11972763/… 上查看我对我自己的类似问题的回复
    • 这似乎是一个非常老套的解决方案。我认为会有比重复嵌套的 mongojs 查询更直观的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多