检查用户是否已存在并等待回调

时间:2013-02-01 17:41:32

标签: node.js callback mongoose

我有一个小功能来验证用户输入。在该功能中,我还将检查电子邮件地址是否已被采用。但我对异步回调有些麻烦。 我希望有人能给我一个提示,我怎么能解决这个问题。我将nodejs与express 3框架,mongodb和node-validator库一起使用。

这是我的验证功能的一部分:

function check(data, callback) {
    mongoose.model('User', User).count(data, function (err, count) {
        callback(err, !! count);
    });
};

function validate(email, password, confirm) {
    var v = new Validator(),
        errors = new Array();

    v.error = function (msg) {
        errors.push(msg);
    };

    check({email: email}, function (err, exists) {
        v.check(exists, { email: 'E-Mail is already taken' }).equals(false);
    });
    ...
    return errors;
}

基于异步回调,变量errorsreturn语句为空。我怎么能检查电子邮件地址是否已经在数据库中?

2 个答案:

答案 0 :(得分:4)

您必须向validate功能添加回调。现在,您的check函数是异步的,因此您立即返回空的errors数组。

function check(data, callback) {
    mongoose.model('User', User).count(data, function (err, count) {
        callback(err, !! count);
    });
};

function validate(email, password, confirm, callback) {
    var v = new Validator(),
        errors = new Array();

    v.error = function (msg) {
        errors.push(msg);
    };

    check({email: email}, function (err, exists) {
        if (err) {
            return callback(err);
        }

        v.check(exists, { email: 'E-Mail is already taken' }).equals(false);
        callback(null, v);
    });
};

// Calling to validate example
server.get("/validate_user_or_whatever", function(req, resp) {
    // Call validate with callback
    validate(req.param("email"), req.param("password"), true, function(err, validator) {
        if (err) {
            return resp.json({success: false, message: err.message});
        }

        var success = validator.isValid; // or something

        // Respond with the results
        resp.json({success: success});
    });
});

现在,您的下一个问题可能是如何运行所有这些验证函数并在调用validate callback之前等待它们返回。好问题,看看async module

答案 1 :(得分:2)

您需要考虑异步并传递将异步调用的回调。 快速举例:

app.get('/blah', function(req, res) {
   // Whatever
   validate(email, pass, confirm, function(errors) {
     if (errors.length == 0)
         resp.send(200, 'blah');
     else
         resp.send(400, 'blah blah');
   });
})

function validate(email, password, confirm, callback) {
    var v = new Validator(),
        errors = new Array();

    v.error = function (msg) {
        errors.push(msg);
    };

    check({email: email}, function (err, exists) {
        v.check(exists, { email: 'E-Mail is already taken' }).equals(false);
    }, function() {
        callback(errors);
    });
    // ...
    return errors;
}