我正在尝试进行简单的用户注册,但我无法正确检查是否创建了重复用户以按照我想要的顺序运行:
路线:
app.post('/user/new', user.create);
user.create:
exports.create = function(req, res) {
var exists = DoesUserExist(req, res);
console.log(exists);
if (exists === true){
console.log("exists");
res.redirect('/user/new');
}
else{
//good to create user since it does not exist yet
CreateUser(req, res);
console.log("does not");
res.redirect('/user/new');
}
};
helper funcs:
function DoesUserExist(req, res){
var post = req.body;
mongo.connect("mongodb://localhost:27017/db", function(err, db){
if(err) { return console.dir(err); }
var collection = db.collection("users");
collection.find({username: post.username}).count( function( err, count ){
if (count > 0){
console.log(count);
return true; //already exists
}
else{
console.log(count);
return false; //does not exist
}
});
});
}
function CreateUser(req, res){
var post = req.body;
//connect to db server
mongo.connect("mongodb://localhost:27017/", function(err, db){
if(err) { return console.dir(err); }
var collection = db.collection("users");
collection.insert({username: post.username, password : post.password}, function(error, doc){});
});
return;
}
再次运行程序以查看是否可以添加重复的用户名后,我的控制台日志会返回:
undefined
does not
POST /user/new 302 4ms - 74b
1
我的mongodb显示重复记录。程序的流程并不符合我的认识。在这种情况下,我是否未能正确使用回调?我还是javascript的新手,想要一些指点/批评。感谢。
答案 0 :(得分:2)
你需要阅读回调,因为节点编程都是关于回调的。
当您致电DoesUserExist()
时,会拨打mongo.connect()
,会立即返回。 (您可以在DoesUserExist()
的末尾添加" console.log(' hi')"以验证在您的"之前调用它? > 0"代码。)Mongo.connect()
例程采用回调,因此它不是简单的同步函数。它仅在查询结果准备就绪时调用该函数(作为回调)。因此,"返回"不是从DoesUserExist
返回,而是从你的匿名函数传递给mongo驱动程序。
而不是"返回true / false",你需要打电话给你" res.redirect"逻辑。你可以通过" if / then"来做到这一点。 user.create
中的代码并将其转换为匿名函数。将其传递给DoesUserExist()
,这将在"计数"回调。
当"计数"回调运行并调用您的匿名函数,它将具有:1)count的值,以及2)要重定向的req/res
对象。
我可以为你编写代码,但它确实是你需要和你一起阅读的内容,直到你得到了#34; aha"了解所有回调的时刻。