Nat*_*pos 2 callback mongodb node.js
出于组织目的,我将源代码分离为模块,例如我user在node.js应用程序上有模块,该应用程序负责从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);
}
}
Run Code Online (Sandbox Code Playgroud)
并在我的测试脚本上执行它,如下所示:
var user = require("./user.js");
user.log("test", "test", function(msg) {
console.log(msg);
});
Run Code Online (Sandbox Code Playgroud)
它执行数据库操作并检索值,但每次只返回时null,当我不初始化reg_result它返回的变量时undefined.我该怎么做才能纠正这个问题?
我调试使用console.log的user.js和item被输出的,但我希望有回调,所以我可以在其他渠道使用的项目,像我的测试脚本
您正在调用回调函数,但是转到db会花费时间,因此异步完成.而是使用作为函数的最后一个参数传递的函数的result参数在适当的时间调用回调.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);
}
});
Run Code Online (Sandbox Code Playgroud)
这只是通过mongodb驱动程序使用的相同模式.希望能帮助到你.