2012-07-18 144 views
2

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

回答

0

如果我理解正确,所有用户使用socket.io打开web套接字,任何新消息都会立即发送给所有用户并标记为未读。问题很简单,如果用户刷新,那么应用程序不知道标记为已读还是未读的消息。

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

1

我已经做了这样的事情的多页面的Web应用程序,但现在它的单页,我不需要这个了:

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); 
    } 
}); 
+0

emitConfirm发送消息,告诉它是一个读通知....如果它回答你的问题,你能接受吗? – cricardol 2012-08-20 19:01:12