【问题标题】:Callback at MongoDB Operation With Node.js使用 Node.js 回调 MongoDB 操作
【发布时间】:2012-03-16 19:45:15
【问题描述】:

出于组织目的,我将源代码分成模块,例如,我的 node.js 应用程序中有 user 模块,它负责从 MongoDB 数据库中检索用户信息。我正在做这样的事情:

var mongo = require("mongodb"),
    Server = mongo.Server,
    Db = mongo.Db;

var server = new Server("localhost", 27017, { auto_reconnect: true });
var db = new Db("users", server);

module.exports = {
    login: function(user, pass, callback) {
        var reg_result = null;

        db.open(function (err, db) {
            if(!err) {
                db.collection("users", function(err, collection) {
                    collection.findOne(
                        {
                            "username": user,
                            "password": pass
                        },
                        function(err, item) {
                            if(!err) {
                                reg_result = item;
                            } else {
                                reg_result = "error";
                            }
                        }
                    );
                });
            } else {
                reg_result = "error";
                console.log("ERROR: " + err);
            }
        });

        callback(reg_result);
    }
}

并像这样在我的测试脚本上执行它:

var user = require("./user.js");

user.log("test", "test", function(msg) {
    console.log(msg);
});

它执行数据库操作并检索值,但每次它只返回null,当我不初始化reg_result 变量时它返回undefined。我应该怎么做才能纠正这个问题?

我在user.js 上使用console.log 进行了调试,并输出了item,但我想要回调以便可以在其他来源上使用该项目,例如我的测试脚本

【问题讨论】:

    标签: node.js mongodb callback


    【解决方案1】:

    您正在立即调用回调函数,但访问数据库需要时间,因此是异步完成的。相反,使用作为最后一个参数传递给.findOne() 函数的函数的结果参数在适当的时间调用您的回调。回调应该得到一个错误参数和一个结果参数:

    login: function(user, pass, callback) {
        db.open(function (err, db) {
            if(!err) {
                db.collection("users", function(err, collection) {
                    collection.findOne(
                        {
                            "username": user,
                            "password": pass
                        },
                        function(err, item) {
                            if(!err) {
                                callback(null,item);
                            } else {
                                callback("error");
                            }
                        }
                    );
                });
            } else {
                callback("error",null);
            }
        });
    }
    
    
    user.login("test", "test", function(err,msg) {
        if( err ) {
          //error occured above;
        } else {
          //success
          console.log(msg);
        }
    });
    

    这只是通过 mongodb-driver 使用的相同模式。 希望有帮助。

    【讨论】:

    • 非常感谢,完美运行!我正在从使用 Phonegap 的纯 jQuery 移动应用程序迁移到 node.js,因此有时要习惯节点上的异步有点困难。 :)
    猜你喜欢
    • 2019-03-30
    • 2015-11-20
    • 2014-09-03
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2016-01-29
    • 2023-03-03
    相关资源
    最近更新 更多