在NodeJs和Express中跟踪SocketID

时间:2018-08-26 04:20:18

标签: node.js express socket.io

经过一番尝试后,我发现socket.io将在套接字重新连接上更改socketId的困难方式。就是说,我正在寻找让我的NodeJ跟踪socketID更改的方法。 Socket在存储中有一个构建,可以跟踪SocketId,远程地址等。该存储的可靠性如何?我可以通过存储在该数据库中的UserID快速查询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);

0 个答案:

没有答案