0

ユーザー入力を検証する小さな関数があります。その機能では、メールアドレスがすでに取得されているかどうかも確認します。しかし、非同期コールバックに問題があります。誰かが私にヒントを与えてくれることを願っています、私がこれをどのように解決できるか。私は、express 3フレームワーク、mongodb、およびnode-validatorライブラリでnodejsを使用しています。

これは私の検証機能の一部です:

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ステートメントemptyにあります。メールアドレスがすでにデータベースにあるかどうかを他に確認するにはどうすればよいですか?

4

2 に答える 2

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;
}
于 2013-02-01T17:49:38.287 に答える