我可以不用密码就可以将Node应用程序连接到Redis,但是添加密码后,我无所事事。
这是我的代码,摘自一个示例:
var redis = require('redis')
, sio = require('socket.io')
, RedisStore = sio.RedisStore
, io = sio.listen();
var port = 6379
, hostname = 'localhost'
, password = 'password';
var redisClient = redis.createClient(port, hostname);
redisClient.auth(password, function (err) { if (err) throw err; });
var redisSubscriber = redis.createClient(port, hostname);
redisSubscriber.auth(password, function (err) { if (err) throw err; });
io.set('store', new RedisStore({ redisPub: redisClient, redisSub: redisSubscriber, redisClient: redisClient }));
在运行应用程序时,我得到以下堆栈跟踪:
/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)
生成该行的行是最后一个-如果我注释掉尝试设置RedisStore的尝试,则不会出现任何错误。
我确定密码正确(我可以在redis-
cli中进行验证,如果我将密码更改为错误,则可以验证auth回调不会触发)。如果我删除密码并注释掉两条身份验证行,此代码也将起作用。
博客文章和文档等上的所有工作示例均表明这应该可行,但我不知道为什么我的不可行。我不知道要看堆栈的哪一部分。
这是我运行上面的代码时redis-cli监视器的外观:
1353227107.912512 [0 127.0.0.1:56759] "auth" "password"
1353227107.912719 [0 127.0.0.1:56758] "auth" "password"
1353227107.913470 [0 127.0.0.1:56759] "info"
1353227107.913639 [0 127.0.0.1:56758] "info"
如果我关闭密码,注释掉上面的auth行并成功运行该应用程序,则这是redis-cli监视器显示的内容:
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”方法时死掉。
任何人都可以理解吗?谢谢你提供的所有帮助。
我通过将redis模块本身作为选项传递给RedisStore构造函数来解决此问题。
io.set('store', new RedisStore({redis: redis, redisPub: redisClient, redisSub: redisSubscriber, redisClient: redisClient }));
这对于客户端对象通过instanceof RedisClient
测试是必要的,并且没有密码就不能重新初始化。显然,当RedisStore
重新需要redis模块时,使用该createClient
方法创建的redis客户端是某个新类或某些类的成员。
我通过查看某人在socket.io的问题#808上遇到的一个相关问题来弄清这一点。
问题内容: 我有一个在Rails和Backbone.js上运行的单页应用程序。我正在通过Redis使用Node.js将数据推送并同步到客户端。我正在尝试了解,保护和优化套接字通信。 使用console.log编写时,我看到一些日志行()正在重复(请参见下面的内容)。 有人能解释我为什么吗?通过我的代码实现,我是否不了解某些特定的Node.js行为? 这是我的Node.js代码: 这是我测试的方式,
问题内容: 我正在尝试在Node.js中使用Socket.IO,并试图允许服务器为每个Socket.IO客户端赋予一个身份。由于套接字代码不在http服务器代码的范围内,因此无法轻松访问已发送的请求信息,因此我假设在连接期间需要将其发送出去。什么是最好的方法 1)将有关谁通过Socket.IO连接到服务器的信息 2)验证他们说的是谁(如果正在使事情变得更容易,我目前正在使用Express) 问题答
我将尝试对 socket.io 上的连接进行身份验证。 目前,用户首先通过REST API进行身份验证,然后,我向用户发送一个,其中包含经过身份验证的用户的用户名。打开客户端和服务器之间的连接后,我的计划是从连接的套接字列表中临时删除该套接字,以防止在执行身份验证时在服务器之间接收和发送数据。 在这个身份验证中,我验证令牌,如果令牌有效,我将套接字的id重新添加到已连接套接字的列表中。唯一的问题是
我想知道socket.io身份验证的最佳实践是什么。 Alice发出事件'message',参数包括Bobs、唯一标识符等。Bob在监听Socket.on('message')事件时接收消息。
问题内容: 是否存在node.js的现有用户身份验证库?特别是,我正在寻找可以对用户进行密码身份验证的东西(使用自定义后端身份验证数据库),并将该用户与会话相关联。 在编写身份验证库之前,我认为我会看看人们是否知道现有的库。通过Google搜索找不到任何明显的内容。 -Shreyas 问题答案: 看起来连接中间件的connect-auth插件正是我所需要的:http : //wiki.github
我在本地配置了redis sentinel,在两个不同的端口10001和10002上运行。我有相同的sentinel身份验证设置。 Redis哨兵配置 使用的JAR版本 Spring-data-redis:2.0.10。发布 莴苣(io.莴苣.莴苣芯):5.0.5.RELEASE 在尝试连接到redisSentinelConfiguration时,我一直收到NOAUTH身份验证请求错误 使用Spr