Делаю уведомления о новых сообщениях. Я думаю, что мне нужен открытый сокет для каждого пользователя, и сервер будет отправлять уведомления при появлении нового сообщения. Я хочу использовать socket.io и redis pub/sub. Когда пользователь отправляет сообщения, он публикует это событие на сервере redis и nodejs, который будет подписчиком, и уведомит клиента о новом сообщении. Но в этом случае сообщение сразу будет удалено из очереди, а когда пользователь обновит страницу, он получит уведомление о том, что все сообщения прочитаны, потому что очередь пуста, но на самом деле сообщения не прочитаны. Как решить эту проблему?
Как реализовать систему уведомлений в nodejs?
Ответы (2)
Я уже делал что-то подобное для многостраничного веб-приложения, но теперь оно одностраничное и мне это больше не нужно:
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);
}
});
Если я правильно понимаю, все пользователи держат открытым веб-сокет с помощью socket.io, любые новые сообщения немедленно отправляются всем пользователям и помечаются как непрочитанные. Проблема просто в том, что если пользователь обновляется, то приложение не знает, какие сообщения помечать как прочитанные, а какие непрочитанные.
В этом случае ваши сообщения могут иметь метку времени, и вы можете записать метку времени последнего сообщения, которое фактически прочитал каждый пользователь (например, отправить событие чтения сообщения от клиента к серверу), чтобы, когда пользователь обновляет страницу, все еще информация, из которой можно восстановить список прочитанных и непрочитанных сообщений.