首页 > 解决方案 > Socketio 动态命名空间连接事件有时不会触发命名空间范围

问题描述

我遇到了 Socket io 动态命名空间 Kubernetes 的一个奇怪问题。客户端连接到 socketio 服务器,但有时连接事件永远不会触发命名空间实例。

将正则表达式用于动态命名空间时,我遇到了间歇性问题。

但是,如果:

=> 正常工作!!!

代码大部分时间都运行良好。仅当 socket.io 客户端未能触发命名空间连接事件时才失败。

注意

包裹

"socket.io": "^4.1.1",

"socket.io-client": "^4.1.1",

服务器代码:

const tenantWorkspaces: socketio.Namespace = chatServer.io.of(/^\/\w+$/);
tenantWorkspaces.on('connection', async (socket: socketio.Socket) => {
    const tenantWorkspace = socket.nsp;
    console.log('========children namespace======');

    socket.on('clientEmit', (data) => {
      console.log('clientEmit', data);
    });

    tenantWorkspace.to(socket.id).emit('serverEmit', {data: 'server emitted !!!'});

    workspaceId = isString(socket.handshake.query.workspace_id) ? socket.handshake.query.workspace_id : null;

    console.log(`workspace: ${workspaceId}, contact: ${contactId} connected!`); // debug
};

客户端代码

     const options = {
      query: {
        'workspace_id': window.LINEBASE_WORKSPACE_ID || '',
      },
      resource: "socket.io",
      transports: ['websocket'],
      upgrade: false,
    };
    socket = io(`${socketUrl}/${namespace}`, options);

    socket.on("connect", () => {
      console.log('socket connected: ' + socket.connected); // true
      console.log('socketID:', socket.id);
    });
    
    socket.on('serverEmit', (data) => {
      console.log(`================ Connect namespace ${namespace} successfully ==============`, data);
    })

我花了将近两周的时间找到解决方案,但仍然没有结果。这个问题有什么解决方案吗?我的应用程序有很多命名空间,所以我需要使用动态命名空间而不是硬代码。

标签: node.jskubernetessocket.ionamespaces

解决方案


推荐阅读