Как реализовать систему уведомлений в nodejs?

Делаю уведомления о новых сообщениях. Я думаю, что мне нужен открытый сокет для каждого пользователя, и сервер будет отправлять уведомления при появлении нового сообщения. Я хочу использовать socket.io и redis pub/sub. Когда пользователь отправляет сообщения, он публикует это событие на сервере redis и nodejs, который будет подписчиком, и уведомит клиента о новом сообщении. Но в этом случае сообщение сразу будет удалено из очереди, а когда пользователь обновит страницу, он получит уведомление о том, что все сообщения прочитаны, потому что очередь пуста, но на самом деле сообщения не прочитаны. Как решить эту проблему?


person Dmitro    schedule 18.07.2012    source источник


Ответы (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);
    }
});
person cricardol    schedule 15.08.2012
comment
emitConfirm отправляет сообщение, в котором сообщается, что это уведомление о прочтении .... если оно отвечает на ваш вопрос, можете ли вы его принять? - person cricardol; 20.08.2012

Если я правильно понимаю, все пользователи держат открытым веб-сокет с помощью socket.io, любые новые сообщения немедленно отправляются всем пользователям и помечаются как непрочитанные. Проблема просто в том, что если пользователь обновляется, то приложение не знает, какие сообщения помечать как прочитанные, а какие непрочитанные.

В этом случае ваши сообщения могут иметь метку времени, и вы можете записать метку времени последнего сообщения, которое фактически прочитал каждый пользователь (например, отправить событие чтения сообщения от клиента к серверу), чтобы, когда пользователь обновляет страницу, все еще информация, из которой можно восстановить список прочитанных и непрочитанных сообщений.

person webjprgm    schedule 18.07.2012