使用Node.js在MongoDB操作中进行回调

时间:2012-03-16 19:45:16

标签: node.js mongodb callback

出于组织目的,我将源代码分离为模块,例如我在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。我该怎么做才能纠正这个问题?

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

1 个答案:

答案 0 :(得分:5)

您正在调用回调函数,但是转到db会花费时间,因此异步完成。而是使用作为.findOne()函数的最后一个参数传递的函数的result参数在适当的时间调用回调。回调应该得到一个错误参数和一个结果参数:

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驱动程序使用的相同模式。 希望它有所帮助。