1

現在、サーバーで NodeJS、Express、Socket.io、node-mysql を使用しています。現在、サーバー上の関数の 1 つがデータをまったく返さないという問題があります。私はこれを理解しようとしています。

機能コード;

「c」を返すはずですが、機能していません。console.log は、実際には ID とユーザー名を示しています。

function LOGIN_USER(a,b) {
    // a    = username
    // b    = password
    var c = [];
    connection.query("SELECT ID FROM GAME_PLAYER WHERE USR = '" + a + "' AND PWD = '" + b + "'", function(err,rows,field) {
        if (err) throw err;

            for (var i in rows) {
                c.ID = rows[i].ID;
                c.USR = a;
            }
            console.log(c.ID + " " + c.USR);
            return c;
    });

}

その他のコード。

socket.on('login user', function(data) {
        var c;

        c = LOGIN_USER(data.username,data.password);
        console.log(c.ID,c.USR);
    });

このconsole.logの後、nodeJSサーバーがクラッシュします。未定義などを表示できないと言っています..など.私の人生ではこれを理解することはできません.どんな助けも大歓迎です!! :)

4

1 に答える 1

5

MySQL クエリは非同期であるため、戻り値を使用することはできません。非同期プログラミングでは、return ステートメントが実行を停止するため、コールバックを使用する必要があります。

function LOGIN_USER(a, b, callback) {
  // a    = username
  // b    = password
  var c = [];
  connection.query("SELECT ID FROM GAME_PLAYER WHERE USR = '" + a + "' AND PWD = '" + b + "'", function (err, rows, field) {
    if (err) throw err;
    for (var i in rows) {
      c.ID = rows[i].ID;
      c.USR = a;
    }
    console.log(c.ID + " " + c.USR);
    callback(c);
  });
}

そして、これはあなたがそれを使用する方法です:

socket.on('login user', function(data) {
  LOGIN_USER(data.username, data.password, function(c) {
    console.log(c.ID, c.USR);
  });
});

コールバック関数で return ステートメントを使用すると、 を使用したかのように動作しreturn;、関数の実行を停止するだけです。コールバックの仕組みは次のとおりです。

関数と別の関数に値を渡しています。

var func = function() {
  // do something
};

LOGIN_USER(a, b, func);

ユーザーのログインが完了すると、ログイン関数は渡された関数を呼び出します。

function LOGIN_USER(a, b, callback) {
  // do some work
  callback();
};

に渡しfunc()、完了時LOGIN_USER()LOGIN_USER()呼び出しfunc()ました。

于 2013-09-20T03:37:32.810 に答える