0

現在、json-socket モジュールを使用して node.js でソケット サーバーをプログラミングしていますが、問題が発生しています。

現在、クライアントがサーバーに接続すると、json オブジェクトでコマンドが送信され、いくつかのデータが含まれます。たとえば、ログインは次のようになります

{ type : 'login', data : { username: 'Spero78' } }

これらのリクエストに対処するために、コマンド オブジェクトがあります

var commands = {
    'login' : authUser,
    'register' : userRegister
}

これらの関数はserver.onによって呼び出されます

server.on('connection', function(socket) {
    console.log('Client Connected');
    socket = new JsonSocket(socket);
    socket.on('message', function(message) {
        if(message.type != undefined) {
            if(commands[message.type]){
                var response = commands[message.type].call(this, message.data);
                if(response != undefined){
                    console.log(response);
                    socket.sendMessage(response);
                } else {
                    console.log("No Response!");
                }
            } else {
                console.log('Unexpected Command!');
            }
        }
    });
});

関数は JavaScript オブジェクトを返しますが、応答変数は常に未定義であり、「応答がありません!」メッセージは常に出力されます

ここに authUser 関数があります

function authUser(data){
    console.log('Auth: ' + data.username);
    database.query('SELECT * FROM players WHERE username = ?', [data.username], function(err, results) {
        if(results.length < 1){
            console.log('Bad Login!');
            var response = {
                type : 'badlogin',
                data : {
                    //...
                }
            }
            return response;
        }
        var player = results[0];
        var response = {
            type : 'player',
            data : {
                //...
            }
        }
        return response;
    });
}

これを行うより良い方法はありますか?または、オブジェクトが返されない原因となっている何かが不足していますか

4

1 に答える 1

0

database.query()非同期なので、この関数を呼び出すと、nodejs はコールバックの応答を待たずに次の命令に進みます。

したがって、条件でテストされる値は、コールバックの戻り値ではなく、authUser関数全体の戻り値であるため、常に未定義です。

おそらくコードをリファクタリングする必要があります。

于 2013-07-21T18:30:20.937 に答える