0
};
var login = function(name, socket, passcode, callback) { 
    db.get(name + ':name', function(res) {
        db.get(name + ':pin', function(pin) {
            if (name === res) {
                if (passcode === pin) {
                    players[sockets.indexOf(socket)] = name;
                }
            }
        });
    });
};
var register = function(name, socket, passcode, callback) {
    if (name === null) {
        callback('Name null!');
        return;
    }
    if (name === '') {
        callback('Name empty!');
        return;
    }
    db.get(name + ':name', function(data) {
        if (data !== null) {
        callback('This name has been taken!');
    }
    else {
        db.set(name + ':name', name, function() {
            db.set(name + ':pin', passcode, function() {
                players[sockets.indexOf(socket)] = name;
                callback('Logged in as: ' + players[sockets.indexOf(socket)]);
            });
        });
    }
});
};

为什么登录部分让我使用任何 PIN 登录任何用户,而注册部分不回调?

他们被称为通过

   login(args[1], socket, args[2], function(data) {
        callback(null, data)
    }

db 是一个 redis 客户端。

完整代码:github.com/creativemud,文件 server.js

4

1 回答 1

1

你永远不会在内部执行回调login。完成后你需要打电话callback

此外,您似乎缺乏一些错误处理。是dbredis客户端吗?在这种情况下,每个回调的第一个参数是一个错误,这是 node.js 领域的自定义。我会做类似的事情:

var login = function(name, socket, passcode, callback) { 
    db.get(name + ':name', function(err, res) {
        if(err) return callback(err);

        if(res !== name) return callback(new Error('invalid result'));

        db.get(name + ':pin', function(err, pin) {
            if(err) return callback(err);

            if(pin !== passcode) return callback(new Error('invalid passcode'));

            players[sockets.indexOf(socket)] = name;
            callback(null, name);
        });
    });
};

可能不是很干净,但我希望你能赶上潮流。

编辑:您没有显示如何调用这些函数。Socket.io 对身份验证有很好的支持,你可能想看看:授权和握手

于 2012-08-08T09:59:24.440 回答