“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回调吗?有很多。只需搜索节点和回调,并继续阅读,直到您得到它。