Немного поиграв, я выяснил, каким образом socket.io будет изменять socketId при переподключении сокета. Тем не менее, я ищу способ для моих NodeJ отслеживать изменения в socketID. Socket имеет встроенное хранилище, которое отслеживает SocketId, удаленные адреса и т. Д. Насколько надежно это хранилище и могу ли я быстро запросить socketID по идентификатору пользователя, который я храню в этой базе данных?
Я также нашел несколько документов, в которых можно установить свой собственный SocketID, который должен быть уникальным, но позволяет ли это мне избежать выдачи нового SocketID при обновлении, или это все еще невозможно.
Вместо SocketID, есть ли способ отправить сообщение клиенту на основе USERID?
Если ничего из вышеперечисленного не сработает, я вернусь к чертежной доске, сохраню информацию о сеансе в таблице БД и обновлю данные.
Множество вопросов, но, надеюсь, кто-то может поделиться со мной некоторыми из них
Вот мой вспомогательный класс SocketIO, которым я пользуюсь
const io = require('socket.io');
class ioWrapper {
constructor(app, { middlewares, updateSession, clearSession } = {}) {
this.io = io(app);
this.connected = {};
if (middlewares && middlewares.length) {
for (const middleware of middlewares) {
this.io.use(middleware);
}
}
this.io.on('connect', client => {
//put callback to constructor to update your session
if (updateSession) {
updateSession(client.id);
console.log('Updated: ' + client.id)
}
client.jwt = client.id
this.connected[client.id] = client;
console.log('Connected: ' + client.id + ' ' )// + this.io.socket.request.connection.remoteAddress)
client.on('disconnect', () => {
if (clearSession) {
clearSession(client.id);
}
if (this.connected[client.id]) {
delete this.connected[client.id];
}
console.log('Disconnect: ' + client.id )
});
client.on('error', e => console.log(e));
client.on('connect_error', e => console.log('connect_error', e));
});
this.ioEmit = this.ioEmit.bind(this);
this.ioInject = this.ioInject.bind(this);
}
ioEmit(socketId, event) {
try {
if (this.connected[socketId]) {
this.connected[socketId].emit(...event);
}
}
catch (e) {
console.log(e);
}
}
ioInject(socketId, handler) {
try {
if (this.connected[socketId]) {
this.connected[socketId].on(...handler);
}
}
catch (e) {
console.log(e);
}
}
}
module.exports = (app, middleware, updateSession) => new ioWrapper(app, middleware, updateSession);