运行“乱序”的Javascript

时间:2014-04-07 02:06:43

标签: 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");
    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的新手,想要一些指点/批评。感谢。

1 个答案:

答案 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"了解所有回调的时刻。