【问题标题】:How to implement notification system in nodejs?如何在 nodejs 中实现通知系统?
【发布时间】:2012-07-18 23:01:25
【问题描述】:

我正在做有关新消息的通知。我想我需要为每个用户打开套接字,并且服务器会在收到新消息时发送通知。我想使用 socket.io 和 redis pub/sub。当用户发送消息时,它会将此事件发布到将成为订阅者的 redis 和 nodejs 服务器,并将通知客户端新消息。但是在这种情况下,消息会立即从队列中删除,当用户更新页面时,他会收到通知说所有消息都已读取,因为队列为空,但实际上消息没有被读取。如何判断这个问题?

【问题讨论】:

    标签: node.js redis websocket socket.io


    【解决方案1】:

    我已经为多页网络应用程序做了类似的事情,但现在它是单页的,我不再需要它了:

    var notifications=[]
    ...
    socket.on('notify', function(message)
    {
        console.log('new notification received!');
        if(notifications[message.notificationId]!==message.notificationId){
            //notification never received in the current page
    
            notifications[message.notificationId]=message.notificationId;
    
            //display the notification code here
    
    
            //In a closure instead of 3 params in order to keep compatibility with IE
            setTimeout(function(){Confirm(message.notificationId);}, CONFIRM_INTERVAL);
    
    
        }
        else{
            //notification already received
            emitConfirm(message.notificationId);
            //or setTimeout(function(){Confirm(message.notificationId);}, CONFIRM_INTERVAL);
        }
    });
    

    【讨论】:

    • emitConfirm 发送一条消息,告知它是一条已读通知....如果它回答了您的问题,您可以接受吗?
    【解决方案2】:

    如果我理解正确,所有用户都使用 socket.io 保持一个网络套接字打开,任何新消息都会立即发送给所有用户并标记为未读。问题很简单,如果用户刷新,则应用不知道将哪些消息标记为已读和未读。

    在这种情况下,您的消息可能具有时间戳,您可以记录每个用户实际阅读的最后一条消息的时间戳(例如,从客户端向服务器发出消息读取事件),以便在用户刷新页面时仍有信息可用于重建已读和未读消息列表。

    【讨论】:

      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 2021-02-14
      相关资源
      最近更新 更多