“Javascript正在运行”;“故障”;
我正在尝试做一个简单的用户注册,但在按照我打算的顺序进行创建重复用户的正确检查时遇到问题: 路线:“Javascript正在运行”;“故障”;,javascript,node.js,express,callback,Javascript,Node.js,Express,Callback,我正在尝试做一个简单的用户注册,但在按照我打算的顺序进行创建重复用户的正确检查时遇到问题: 路线: 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");
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');
}
};
助手函数:
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新手,希望得到一些建议/评论。谢谢。您需要仔细阅读回调,因为节点编程都是关于回调的 当您调用
DoesUserExist()
时,它会调用mongo.connect()
并立即返回。(您可以将“console.log('hi')”放在DoesUserExist()
的末尾,以验证在“if count>0”代码之前是否调用了它。)Mongo.connect()
例程接受回调,因此它不是一个简单的同步函数。它仅在查询结果就绪时调用该函数(作为回调)。因此,“return”不是从DoesUserExist返回的,而是从传递给mongo驱动程序的匿名函数返回的
您需要调用“res.redirect”逻辑,而不是“return true/false”。您可以通过在user.create
中获取“if/then”代码并将其转换为匿名函数来实现这一点。将其传递给DoesUserExist()
,它将在“count”回调中调用它
当“count”回调运行并调用匿名函数时,它将具有:1)count的值,以及2)执行重定向的req/res
对象
我可以为您编写代码,但这确实是您需要使用和阅读的东西,直到您获得理解所有回调的“aha”时刻。就指针而言:a)与其编写
if(x==true)
,不如编写if(x)
;b) 函数名的首字母不要大写,除非它们是构造函数。您的if(count>0){console.log(count);返回true;}else{console.log(count);返回false;}
也可以是console.log(count);返回计数>0代码>–但它一开始有什么作用吗?您还应该在每个回调中处理错误情况<代码>返回函数末尾的代码>是多余的。感谢您提供的信息。你有什么建议让我了解js回调吗?有很多。只需搜索节点和回调,并继续阅读,直到您得到它。