У меня есть веб-сервер nodejs с socket.io и на стороне клиента angular2.
Я пытаюсь управлять несколькими через подключенных к socket.io клиентов, но только тех, кто вошел в свои учетные записи.
Например, у меня есть зона поддержки для пользователей и администраторов. при получении заявки от пользователя пользователь должен получить частное уведомление socket.io, т. е. заявка была обработана администратором. Это хорошо работает, если администратор и пользователь входят в систему должным образом и администратор видит заявку. (оставив свой билет на тестирование)
Но если администратор обновит страницу (по F5), а awnsers снова получит свой билет, уведомление не появится.
Это та часть, где пользователь подключается к веб-серверу по angular2:
io.on('connection', function (socket) {
console.log('a user connected ', socket.id);
io.sio_id = socket.id; // set socket id for client
socket.emit('sio_id', io.sio_id); // send it to client
socket.on("disconnect", function () {
console.log('a user disconnected');
User.findOne({
where: {sio_id: socket.id}
})
.then((user) => {
if (user) {
user.update({sio_id: null});
}
});
});
// receive the userId to update users sio_id in database
socket.on('set_sio_id', function (uData) {
User.findOne({where: {id: uData.uid}})
.then((user) => user.update({sio_id: uData.sid}))
.then(() => {
let socket = io.sockets.connected[uData.sid];
socket.join(uData.sid)
})
})
});
Идентификатор клиента будет отправлен клиентскому приложению, которое затем отправит обратно на сервер снова clientId И userId. Затем clientId будет сохранен в базе данных. После этого я хочу использовать этот «sio» -id для связи с Пользователем с помощью socket.io следующим образом:
ticket.update({status: 0, awnser_text: awnser}).then((result) => {
const socketId = ticket.dataValues.creator.dataValues.sio_id;
let socket = io.sockets.connected[socketId];
// if user is online, emit
io.to(socketId).emit('support_awnser', 'ok');
res.send({status: true, data: result});
Итак, я получаю Id пользователя, которому принадлежит билет, и получает его sio-id из базы данных и что-то испускает.
Вот как угловое приложение слушает и издает:
/**
* Listen to an event
* @param to
*/
listen(to: string) {
return new Observable(observer => {
this.socket = io(this.SERVER_URL);
this.socket.on(to, data => {
observer.next(data);
});
return () => {
this.socket.disconnect();
};
});
}
/**
* Send something to the server
* @param event
* @param msg
*/
send(event, msg) {
this.socket.emit(event, msg);
}
Как уже говорилось, он работает правильно при входе в систему, а НЕ при обновлении страницы. Если я обновил страницу, он не работает и ничего не отправляется (или не получает)