node.js - openshift 上的 socket.io redis 存储

标签 node.js redis socket.io store openshift

我正在尝试在 node.js 上设置 socket.io 以使用 redisstore,以便我可以与 pubsub 与 opeshift 平台上的多个 Node 进行通信,但我无法连接到 redis 服务器。我正在使用 this cartridge . 我试着连接

var pub    = redis.createClient(process.env.OPENSHIFT_REDIS_DB_PORT,
                                process.env.OPENSHIFT_REDIS_DB_HOST);

但它不起作用(我发现了原因:createClient() only accept IP addresses)并且它回退到默认端口和主机,然后我运行了rhc port-forward:

$ rhc port-forward appname
Checking available ports ... done
Forwarding ports ...
Address already in use - bind(2) while forwarding port 8080. Trying local port 8081

To connect to a service running on OpenShift, use the Local address

Service         Local                OpenShift
--------------- --------------- ---- ----------------------------------------------
haproxy         127.0.0.1:8080   =>  127.5.149.130:8080
haproxy         127.0.0.1:8081   =>  127.5.149.131:8080
s_redis_db_host 127.0.0.1:54151  =>  blabla.appname.rhcloud.com:54151

Press CTRL-C to terminate port forwarding

所以我认为我做错了,我不得不像这样设置端口:

var pub = redis.createClient(process.env.OPENSHIFT_REDIS_DB_PORT);

但我得到的只是这个

info: socket.io started
events.js:72
     throw er; // Unhandled 'error' event
           ^
Error: Redis connection to 127.0.0.1:54151 failed - connect ECONNREFUSED
 at RedisClient.on_error (/var/lib/openshift/532c3790e0b8cd9bb000006b/app-root/runtime/repo/node_modules/socket.io/node_modules/redis/index.js:149:24)
 at Socket.<anonymous> (/var/lib/openshift/532c3790e0b8cd9bb000006b/app-root/runtime/repo/node_modules/socket.io/node_modules/redis/index.js:83:14)
 at Socket.EventEmitter.emit (events.js:95:17)
 at net.js:426:14
 at process._tickCallback (node.js:415:13)
 DEBUG: Program node server.js exited with code 8

我尝试连接

telnet $OPENSHIFT_REDIS_DB_HOST $OPENSHIFT_REDIS_DB_PORT

而且效果很好...您有什么建议吗?我做错了吗? (我还是 redis 和 socket.io 的新手) (我省略了其余代码,因为我知道它可以工作,我在本地机器上没有问题,我只是无法连接...) 非常感谢

最佳答案

but it doesn't work (and I found out why: createClient() only accept IP addresses) and it fallback to the default port and host

它确实支持主机, createClient 使用 net.createConnection(port, host);确实支持主机名。

以下代码将帮助您找到问题:

console.log(process.env);
var pub    = redis.createClient(process.env.OPENSHIFT_REDIS_DB_PORT,
                                process.env.OPENSHIFT_REDIS_DB_HOST, {auth_pass: process.env.OPENSHIFT_REDIS_DB_PASSWORD});
pub.on('error', console.log.bind(console));
pub.on('ready', console.log.bind(console, 'redis ready'));

您的 openshift Redis 实例是否需要 AUTH

关于node.js - openshift 上的 socket.io redis 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22562849/

相关文章:

javascript - Node.js 浏览器化实现

ruby-on-rails - Sidekiq 工作流

python - get 上的 Redis 通配符键

javascript - Socket.IO 客户端 .js 文件位于何处?

node.js - 将windows1252转换为NodeJS特殊字符中的utf-8

node.js - 检查 req.files 对象是否为空

jquery - 使用 click() 时选择第二个 jQuery 匹配

nosql - 我应该使用哪个键值数据库?

javascript - 使用 socket.io node.js 的事件发射器内部的事件发射器

android - NodeJS + SocketIO 推送到移动应用