Node.js 登录/注册 Redis 问题

标签 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,文件server.js

最佳答案

您永远不会在 login 中执行回调。完成后需要调用 callback

此外,您似乎缺少一些错误处理。 db 是redis客户端吗?在那种情况下,每个回调的第一个参数是一个错误,这是 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 对身份验证有很好的支持,你可能想看看:Authorization and handshaking .

关于Node.js 登录/注册 Redis 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11861919/

相关文章:

redis - 如何使用 go-redis 运行 SENTINEL slaves 命令?

node.js - AWS Lambda(Node.js,8.10 版)和 Mongoose : MongoNetworkError connection to DB timed out

Javascript - 从字符串中删除特定字母

javascript - 是否可以在 mongoDB 2.6 上的聚合内使用来自不同集合的数据

asp.net - 如何在Redis中进行包含搜索?

redis - Redis 如何跟踪每个客户端?

c# - 当哈希键为 GUID 时,StackExchange.Redis HGET/HGETASYNC 返回 null

python - 如何使用python压缩字符串并存储在redis中

node.js - 在同一域和 "URL"上运行 Node.js 和 Apache

Javascript:通过检查对象的属性从数组中删除对象