Node.js登录/注册Redis问题

时间:2012-08-08 09:50:26

标签: node.js redis

};
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,file server.js

1 个答案:

答案 0 :(得分:1)

您永远不会在login内执行回调。完成后,您需要致电callback

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

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非常支持身份验证,您可能需要查看它:Authorization and handshaking