Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js和socket.io的Redis身份验证错误_Node.js_Redis_Socket.io - Fatal编程技术网

Node.js和socket.io的Redis身份验证错误

Node.js和socket.io的Redis身份验证错误,node.js,redis,socket.io,Node.js,Redis,Socket.io,我可以在没有密码的情况下将我的节点应用程序连接到Redis,但当我添加密码时,我所做的一切都是错误的 这是我现在的代码,取自: 运行应用程序时,我得到以下堆栈跟踪: /home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:506 throw callback_err; ^ Error: Ready check fail

我可以在没有密码的情况下将我的节点应用程序连接到Redis,但当我添加密码时,我所做的一切都是错误的

这是我现在的代码,取自:

运行应用程序时,我得到以下堆栈跟踪:

/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:506
                throw callback_err;
                      ^
Error: Ready check failed: ERR operation not permitted
    at RedisClient.on_info_cmd (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:319:35)
    at Command.RedisClient.ready_check.send_anyway [as callback] (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:367:14)
    at RedisClient.return_error (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:502:25)
    at RedisReplyParser.RedisClient.init_parser (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:262:14)
    at RedisReplyParser.EventEmitter.emit (events.js:93:17)
    at RedisReplyParser.send_error (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/lib/parser/javascript.js:266:14)
    at RedisReplyParser.execute (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/lib/parser/javascript.js:125:22)
    at RedisClient.on_data (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:478:27)
    at Socket.<anonymous> (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:79:14)
    at Socket.EventEmitter.emit (events.js:93:17)
如果我关闭密码、注释掉上面的验证行并成功运行应用程序,redis cli monitor将显示以下内容:

1353227252.401667 [0 127.0.0.1:56771] "info"
1353227252.402020 [0 127.0.0.1:56770] "info"
1353227252.402131 [0 127.0.0.1:56769] "info"
1353227252.402423 [0 127.0.0.1:56768] "info"
1353227252.402611 [0 127.0.0.1:56767] "info"
1353227252.406254 [0 127.0.0.1:56770] "subscribe" "handshake"
1353227252.406287 [0 127.0.0.1:56770] "subscribe" "connect"
1353227252.406314 [0 127.0.0.1:56770] "subscribe" "open"
1353227252.406321 [0 127.0.0.1:56770] "subscribe" "join"
1353227252.406326 [0 127.0.0.1:56770] "subscribe" "leave"
1353227252.406337 [0 127.0.0.1:56770] "subscribe" "close"
1353227252.406354 [0 127.0.0.1:56770] "subscribe" "dispatch"
1353227252.406372 [0 127.0.0.1:56770] "subscribe" "disconnect"
成功的(无密码的)连接生成5个“info”命令,而我不成功的(密码的)命令生成2个-然后在调用“on_info_cmd”方法时终止


有人能理解这一点吗?感谢您提供的帮助。

尝试调用
redisClient.auth(密码,函数(err){if(err)throw err;})仅一次,redis存储每次调用的身份验证信息,调用两次可能会抛出错误。

我通过将redis模块本身作为选项传递给RedisStore构造函数解决了这个问题

io.set('store', new RedisStore({redis: redis, redisPub: redisClient, redisSub: redisSubscriber, redisClient: redisClient }));
这对于客户端对象通过RedisClient的
instanceof
测试是必要的,并且在没有密码的情况下不会重新初始化。显然,当
redistore
re需要redis模块时,使用
createClient
方法创建的redis客户机是某个新类或其他对象的成员


我通过查看某人在socket.io上遇到的一个相关问题发现了这一点。

实际上每个客户端只调用一次-第一次是在redisClient上,第二次是在redisSubscriber上,一个单独的实例上。是的,我理解,但客户端“隐藏”密码,因此不需要为多个实例调用它。请看,这是不正确的-它存储每个实例,而不是整个类。我所看到的每一个创建发布、订阅和商店客户端的redis的auth示例都使用这种模式。示例:@是的,隐藏是为了重新连接同一个客户端实例AFAIK,它不是在不同的客户端之间共享的。我解决了这个问题(下面的答案),并更新了Socket.io wiki以提供一个具有授权的Redistore示例:有不同的错误,但相同的解决方案有帮助。。。发生错误的原因可能是Redis也用于Express会话,可能是存储和客户端使用了不同的模块?
1353227252.401667 [0 127.0.0.1:56771] "info"
1353227252.402020 [0 127.0.0.1:56770] "info"
1353227252.402131 [0 127.0.0.1:56769] "info"
1353227252.402423 [0 127.0.0.1:56768] "info"
1353227252.402611 [0 127.0.0.1:56767] "info"
1353227252.406254 [0 127.0.0.1:56770] "subscribe" "handshake"
1353227252.406287 [0 127.0.0.1:56770] "subscribe" "connect"
1353227252.406314 [0 127.0.0.1:56770] "subscribe" "open"
1353227252.406321 [0 127.0.0.1:56770] "subscribe" "join"
1353227252.406326 [0 127.0.0.1:56770] "subscribe" "leave"
1353227252.406337 [0 127.0.0.1:56770] "subscribe" "close"
1353227252.406354 [0 127.0.0.1:56770] "subscribe" "dispatch"
1353227252.406372 [0 127.0.0.1:56770] "subscribe" "disconnect"
io.set('store', new RedisStore({redis: redis, redisPub: redisClient, redisSub: redisSubscriber, redisClient: redisClient }));