gpt4 book ai didi

node.js - 使用 Node.js 进行 MongoDB 操作时的回调

转载 作者:可可西里 更新时间:2023-11-01 09:59:46 30 4
gpt4 key购买 nike

出于组织目的,我将源代码分成模块,例如,我的 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,但我想要回调,以便我可以在其他来源上使用该项目,例如我的测试脚本

最佳答案

您正在立即调用回调函数,但转到数据库需要时间,因此是异步完成的。相反,使用作为最后一个参数传递给 .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 驱动程序使用的相同模式。希望对您有所帮助。

关于node.js - 使用 Node.js 进行 MongoDB 操作时的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9743564/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com