我正在收到有关新邮件的通知。我想我需要为每个用户打开套接字,服务器会在收到新消息时发送通知。我想使用socket.io和redis pub / sub。当用户发送消息时,它会将此事件发布到将成为订阅者的redis和nodejs服务器,并将通知客户端有关新消息的信息。但在这种情况下,消息会立即从队列中删除,当用户更新页面时,他会收到通知,因为队列为空,所以读取了所有消息,但实际上不会读取消息。如何判断这个问题?
答案 0 :(得分: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);
}
});
答案 1 :(得分:0)
如果我理解正确,所有用户都使用socket.io打开Web套接字,任何新邮件都会立即发送给所有用户并标记为未读。问题很简单,如果用户刷新,则应用程序不知道要标记为已读和未读的消息。
在这种情况下,您的消息可能有一个时间戳,您可以记录每个用户实际读取的最后一条消息的时间戳(例如,从客户端向服务器发出消息读取事件),以便在用户刷新页面时仍有信息可用于重建已读和未读消息的列表。