3
app.post('/login', function (req, res) {

    var login = req.body.login;
    var pass = req.body.pass;

    var ret = CheckUserValid(login, pass);

  res.send(ret);
})

function CheckUserValid(login, pass,callback) {
    var sql = "SELECT * FROM `user` WHERE login = ? AND pass= ?";
    client.query(sql, [login, pass], function selectResutl(err, results, fields) {
         console.log(results);
        if (!err) return true;
        else
            throw err;
    });
}

最初の関数はリクエストに関するもので、2番目の関数はmysqlの呼び出しに関するものです。非同期なので動作しません。誰かがC#のように同期的に動作させる方法を教えてもらえますか?

4

3 に答える 3

4

メソッドのシグニチャはCheckUserValidすでにを意味しcallbackます。これを使用して、db-requestが実行されたときに、次のように何かを呼び出すことができます。

app.post('/login', function (req, res) {
  var login = req.body.login;
  var pass  = req.body.pass;

  // use a closure here for the callback of checkUserValid
  checkUserValid(login, pass, function(err, isValid) {
    // send the response when checkUserValid is done
    res.send(isValid)
  });
})

function checkUserValid(login, pass, callback) {
  var sql = "SELECT * FROM `user` WHERE login = ? AND pass= ?";
  client.query(sql, [login, pass], function(err, results, fields) {
    console.log(results);
    if (!err) {
      // there is no error, pass null for the error
      // and true for the result
      callback(null, true);
    } else {
      // an error occurred in the db-query
      // pass it to the callback
      callback(err)
    }
  });
}

慣例によりerr、最初の引数としてasを渡す必要がありますが、最終的にはそれはあなた次第です。ただし、元のエラーを最初の関数に渡して、そこで処理することができます。

于 2012-05-31T20:30:48.187 に答える
3

ファイバーモジュールをご覧ください。

于 2012-06-01T13:07:28.403 に答える
1

呼び出したい関数を順番に連鎖させることができます

たとえば、あなたres.send(ret);はあなたのコールバックとして作ることができますCheckUserValid

于 2012-05-31T20:22:48.460 に答える