node.js - 将 redis pubsub 消息转发到 express 中的特定 socket.io 客户端

标签 node.js express redis socket.io

在我的 express 服务器中,我使用的是 socket.io 和 Redis pubsub。 服务端订阅一个Redis消息 channel ,当有人通过Redis发布新消息时,将Redis消息转发给特定的websocket客户端。

根据我从 socket.io 和 Redis 文档中读到的内容,我可以使用变量 socket 向特定客户端发送消息并调用 socket.broadcast.to(mySocketID).emit

但在下面的代码中,如果我想向 redis 订阅者内部的 mySocketID 发送消息,我该怎么办,这超出了 io.on('connection') 的范围?

var redis = require('redis');
var server = require('http').createServer(app);
var io = require("socket.io")(server);

io.on('connection', function (socket) {

   socket.on('whatever_event', function() {
       socket.broadcast.to(mySocketID).emit('TEST', 'hello ' + mySocketID);
   }
}

var subscriber = redis.createClient();

subscriber.on('message', function (channel, redisMessage) {

// I want to send redisMessage to the websocket client
// Can I access to "socket" in io.on('connection' ...) ? 

});

最佳答案

不久前我用 WebSockets 做过类似的事情(如果我明白你想做什么的话)。实际上,我不得不在 Redis Pub/Sub(普通的 EventEmitter)和 websocket 之间创建一个进程内事件代理层。如果没有这一层,您将有很多不必要的连接开销,通过使用它,您可以限制与 Redis 的打开连接数。

因此,subscriber.on 部分发送一个 EventEmitter 事件 (yourEventsObject.emit(/*...*/))。然后在您的 socket.io 连接回调中,您使用监听器响应这些事件 (yourEventsObject.on(/*...*/))。当您的 socket.io 连接关闭时,您需要确保并清理这些 EventEmitter 监听器,这样您就不会在关闭套接字时出现错误。

这是 full source on 上的完整文件和 article describing the problem/solution with websockets .

关于node.js - 将 redis pubsub 消息转发到 express 中的特定 socket.io 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45844863/

相关文章:

Node.js 代码提示

javascript - css 未在 nodejs 网络应用程序中呈现

node.js - Express js 为明显存在的 .js 文件生成 404

javascript - Node.JS 中的 HTTP DELETE 动词

node.js - 找不到模块 "express"- docker-compose nodejs 服务

node.js - 在 ubuntu 13.10 上安装 cloud9

c# - GetEvalStr 方法未实现 ServiceStack.Redis RedisClient

node/redis : returning from inside callback? 中的 JavaScript 控制流

node.js - NodeJS 在计算质数时比 D 更快。如何?

node.js - 使用字符串键和函数值定义对象的类型