Javascript运行“乱序”

我正在尝试做一个简单的用户注册,但无法正确检查创build重复的用户运行顺序,我打算:

路线:

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'); } }; 

帮手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显示重复的logging。 程序的stream程并不遵循我所认为的。 在这种情况下,我是否没有正确使用callback? 我仍然是新来的JavaScript,并希望一些指针/批评。 谢谢。

你需要阅读callback,因为节点编程都是关于callback的。

当你调用DoesUserExist() ,它会调用mongo.connect()立即返回 。 (你可以把“console.log('hi')”放在DoesUserExist()的末尾来validation它在你的“if count> 0”之前被调用。) Mongo.connect()例程需要一个callbackMongo.connect() ,所以它是不是一个简单的同步function。 只有在查询结果准备就绪的情况下,它才会调用该函数(作为callback函数) 因此,“返回”不是从DoesUserExist返回,而是从传递给mongo驱动程序的匿名函数返回。

而不是“返回true / false”,你需要调用你的“res.redirect”逻辑。 你可以通过在user.create的“if / then”代码来做到这一点,并把它变成一个匿名函数。 将它传递给DoesUserExist() ,它将在“count”callback中调用它。

当“count”callback运行并调用匿名函数时,它将具有:1)count的值,2) req/res对象进行redirect。

我可以为你编写代码,但这确实是你需要玩的东西,然后再阅读,直到你明白所有的callback。