0

ここでの問題は、Node.js に必要な非同期の方法をまだ考えていないことだと確信しています。

電子メールが渡されたときにユーザーがデータベースにいるかどうかをチェックし、またはを返すuserExists()モジュールに関数があります。dbtruefalse

関連部分:

userExists : function(email) {
    var client = new pg.Client(app.conString);
    var query;
    var result = false;

    client.connect();

    query = client.query(
        "SELECT * FROM users WHERE email = $1",
        [email]
    );

    query.on('row', function(row) {
        result = true;
    });

    query.on('end', function() {
        client.end();
        return result;
    });

私はそれを次のように呼んでいます:

if (!db.userExists(req.session.email)) {
        newUser();
    } else {
        updateUser();
    }
}

newUser()userExists()が返されても、呼び出されるのは常にです。どうすればこれを解決できますか?

4

1 に答える 1

1

時間を間違えた。関数の実行後にクエリが終了するため、コールバック関数を渡して結果を「待機」する必要があります。

userExists = function(email, cb) {
    var client = new pg.Client(app.conString);
    var query;
    var result = false;

    client.connect();

    query = client.query(
        "SELECT * FROM users WHERE email = $1",
        [email]
    );

    query.on('row', function(row) {
        result = true;
    });

    query.on('end', function() {
        client.end();
        cb(result);
    });
}


// Time 1: ask is the user exists
db.userExists(req.session.email, function(exists) {
    // Time 3: Yeah result came back
    if (exists) {
        updateUser()
    }
    else {
        newUser();
    }
});
// Time 2: I've asked, let's wait for the result
// The following code will likely be executed before you get the result back
于 2013-04-15T11:17:14.697 に答える