socket.io assigning custom socket.id

后端 未结 2 1220
别那么骄傲
别那么骄傲 2021-02-02 03:53

I keep track the list of every users connected in the array. So if there is a new connection, it will check whether the user is already on the list or not, if he was already on

2条回答
  •  轮回少年
    2021-02-02 04:12

    generateId prop of io.engine object can be used for to set the custom id.

    Using this way, the all socket ids can be created on the server side without any issue.

    Actually I wrote an answer for a similar question today.

    An example:

    var app = require('express')();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);
    
    io.engine.generateId = function (req) {
        // generate a new custom id here
        return 1
    }
    
    
    io.on('connection', function (socket) {
    
        // listing the default namespace rooms
        console.log("rooms: ", io.nsps["/"].adapter.rooms);
    
    })
    

    The console output would be as the following:
    rooms: { '/#1': Room { sockets: { '/#1': true }, length: 1 } }

    It seems to be it has been handled.

    It must be in mind that socket id must be unpredictable and unique value with considering security and the app operations!

    Extra: If socket.id is returned as undefined because of your intense processes on your generateId method, async/await combination can be used to overcome this issue on node.js version 7.6.0 and later.
    handshake method of node_modules/engine.io/lib/server.js file should be changed as following:

    former:

    Server.prototype.handshake = function (transportName, req) {
      var id = this.generateId(req);
      ...
    }
    

    new:

    Server.prototype.handshake = async function (transportName, req) {
      var id = await this.generateId(req);
      ...
    }
    

提交回复
热议问题