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。