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 回答