Javascript 在node.js中使用call()时获取返回值

Javascript 在node.js中使用call()时获取返回值,javascript,node.js,function,object,Javascript,Node.js,Function,Object,我目前正在node.js中使用json套接字模块编程一个套接字服务器,遇到了一些问题 当前,当客户端连接到服务器时,它们会在json对象中发送一个命令,其中包含一些数据,例如,登录名如下所示 { type : 'login', data : { username: 'Spero78' } } 为了处理这些请求,我有一个commands对象 var commands = { 'login' : authUser, 'register' : userRegister } 这些函数

我目前正在node.js中使用json套接字模块编程一个套接字服务器,遇到了一些问题

当前,当客户端连接到服务器时,它们会在json对象中发送一个命令,其中包含一些数据,例如,登录名如下所示

{ type : 'login', data : { username: 'Spero78' } }
为了处理这些请求,我有一个commands对象

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;
    });
}
函数authUser(数据){
console.log('Auth:'+data.username);
database.query('SELECT*FROM player WHERE username=?',[data.username],function(err,results){
如果(结果长度<1){
log('Bad Login!');
var响应={
键入:“badlogin”,
数据:{
//...
}
}
返回响应;
}
var player=结果[0];
var响应={
键入:“玩家”,
数据:{
//...
}
}
返回响应;
});
}
有更好的方法吗?或者我遗漏了导致对象不返回数据库的内容。query()是异步的,因此在调用此函数时,NodeJ不会等待回调响应转到下一条指令

因此,在您的条件下测试的值不是回调中的返回值,而是整个
authUser
函数的返回值,这就是为什么它总是未定义的原因


您可能需要重构您的代码。

啊,这让您的代码变得清晰了很多,谢谢。我想我可以创建一个sendResponse()函数并在database.query()中调用它,而不是返回一个值