当在该频道中发布新消息时如何将 Redis 消息发送到客户端
How to send Redis message to client side when a new message is published in that channel
我正在尝试实现一项功能,其中当用户查看页面时,他应该自动订阅该用户独有的 Redis 频道。并且所有发布到该 Redis 频道的消息都应该被客户端接收。
以下是客户端代码,
var socket = io.connect('localhost:5000');
socket.on('connect', function(){
socket.emit("subscribe",$("#app_id").text());
});
socket.on('message', function(message) {
$("#lst").append("<li>" + message + "</li>")
});
在 nodejs 服务器上,我有以下代码,
var client = redis.createClient();
io.sockets.on('connection', function (socket) {
socket.on("subscribe",function(channel){
client.subscribe(channel);
socket.join(channel);
});
client.on("message", function(channel, message){
socket.broadcast.to(channel).emit('message', message);
});
});
当我在两个不同的浏览器中打开客户端页面时,它正确地订阅了两个频道,并在客户端显示了发布到这些 Redis 频道的消息。但是如果我刷新页面,我收到的消息数量是两倍,如果我再次刷新,它会加起来。我想听众在每次刷新时都会累加起来。
我已经在 socket.io 连接侦听器中编写了 Redis 侦听器,因为我想将消息发送到 socket.This 可能是我面临的问题的原因。不要做其他事情,因为我需要套接字实例将消息发送到客户端。请帮忙解决这个问题。
如您所说:断开连接时删除侦听器。
查看 how-to-remove-redis-on-message-listeners and socket-io-handling-disconnect-event 进一步阅读。
未测试样本
var client = redis.createClient();
io.sockets.on('connection', function (socket) {
var broadcast = function(channel, message){
socket.broadcast.to(channel).emit('message', message);
}
socket.on("subscribe",function(channel){
client.subscribe(channel);
socket.join(channel);
});
socket.on('disconnect', function() {
client.unsubscribe(channel);
client.removeListener(broadcast)
})
client.on("message", broadcast);
});
我正在尝试实现一项功能,其中当用户查看页面时,他应该自动订阅该用户独有的 Redis 频道。并且所有发布到该 Redis 频道的消息都应该被客户端接收。
以下是客户端代码,
var socket = io.connect('localhost:5000');
socket.on('connect', function(){
socket.emit("subscribe",$("#app_id").text());
});
socket.on('message', function(message) {
$("#lst").append("<li>" + message + "</li>")
});
在 nodejs 服务器上,我有以下代码,
var client = redis.createClient();
io.sockets.on('connection', function (socket) {
socket.on("subscribe",function(channel){
client.subscribe(channel);
socket.join(channel);
});
client.on("message", function(channel, message){
socket.broadcast.to(channel).emit('message', message);
});
});
当我在两个不同的浏览器中打开客户端页面时,它正确地订阅了两个频道,并在客户端显示了发布到这些 Redis 频道的消息。但是如果我刷新页面,我收到的消息数量是两倍,如果我再次刷新,它会加起来。我想听众在每次刷新时都会累加起来。
我已经在 socket.io 连接侦听器中编写了 Redis 侦听器,因为我想将消息发送到 socket.This 可能是我面临的问题的原因。不要做其他事情,因为我需要套接字实例将消息发送到客户端。请帮忙解决这个问题。
如您所说:断开连接时删除侦听器。
查看 how-to-remove-redis-on-message-listeners and socket-io-handling-disconnect-event 进一步阅读。
未测试样本
var client = redis.createClient();
io.sockets.on('connection', function (socket) {
var broadcast = function(channel, message){
socket.broadcast.to(channel).emit('message', message);
}
socket.on("subscribe",function(channel){
client.subscribe(channel);
socket.join(channel);
});
socket.on('disconnect', function() {
client.unsubscribe(channel);
client.removeListener(broadcast)
})
client.on("message", broadcast);
});