};
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/