node.js - SocketIo 和 Redis 多重发射处理

标签 node.js redis socket.io

我正在尝试创建一个通知系统来存储和向用户显示实时通知,但我似乎无法弄清楚如何使用我当前的 Socket-Io 为单个用户存储和显示多个通知和 Redis 设置。我无法实现这一目标的部分原因可能是我缺乏使用 Redis 和 Pub/Sub 功能的经验,但我不确定是否需要调整 SocketIo 和 Redis 存储关系或者这是通常在这些模块之外使用数组之类的东西处理的东西。

这是我的服务器端代码:

    var redisAdapter = require('socket.io-redis');
    var io = require("socket.io").listen(server);
    io.adapter(redisAdapter({
        host: process.env.REDIS_ENDPOINT || 'localhost',
        port: 6379
    }));
    var userNotification = {};

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

        io.of('/').adapter.clients((err, clients) => {
            console.log("Socket IO Clients")
            console.log(clients); // an array containing all connected socket ids
        });

        socket.emit('notification', userNotification);


        //Client Notification
        socket.on('client-notification', function(data) {
          userNotification.data = data;
         });
});

客户端:

$(document).ready(function() {

    var socket = io.connect('http://localhost:3000');  
    socket.on('notification', function (data) {

     console.log(data);
   });
});

使用当前设置,会生成以下套接字客户端 ID,但我不确定如何解释。

1) session 开始

[ 'GMs7nTrAHQ4z9o7KAAAC' ]

2) 用户提交表单触发notification

[ 'GMs7nTrAHQ4z9o7KAAAC', 'e4U1kcC6Jg0Ey45IAAAD' ]

3) 刷新页面或加载新页面。 通知 现在出现在导航栏中

[ '_T8oFXhrUyfwWpjqAAAF' ]

这是使用 redis-cli 运行 PUBSUB CHANNELS 的响应:

1) "socket.io-response#/#"
2) "socket.io-request#/#"

最佳答案

您当前仅在客户端连接时发出一个通知。要为每个 client-notification 事件发出通知,请使用以下内容:

var redisAdapter = require('socket.io-redis');
var io = require("socket.io").listen(server);

io.adapter(redisAdapter({
    host: process.env.REDIS_ENDPOINT || 'localhost',
    port: 6379
}));

var userNotification = {};

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

    io.of('/').adapter.clients((err, clients) => {
        console.log("Socket IO Clients")
        console.log(clients); // an array containing all connected socket ids
    });

    socket.emit('notification', userNotification);

    //Client Notification
    socket.on('client-notification', function(data) {
        userNotification.data = data;

        socket.emit('notification', userNotification);
    });
});

关于node.js - SocketIo 和 Redis 多重发射处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52928180/

相关文章:

javascript - 如何从PayPal SDK服务器端获取交易信息

lua - Redis并发访问简单Ip控制

redis - TYPE 选项不适用于 REDIS SCAN 命令

node.js - Nodejs实时在线人数统计

node.js - 使用 socketio 心跳的优点/缺点

node.js - AngularJS:通过 https 使用 socket.io 聊天应用程序

node.js - node-posix setrlimit 崩溃,EINVAL - 无效参数

node.js - "TypeError: failed to fetch"用于 Wso2 apim 存储中的 api 调用

jquery - npm install jquery 错误/saveError ENOENT/无效依赖

java - redis中java的setIfAbsent(K,V, ExpiryTimeout)是原子的吗?