gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:16:54 24 4
gpt4 key购买 nike

在我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com