Node.js Socket.io:将执行重写的generateId(),但返回的id似乎被忽略

Node.js Socket.io:将执行重写的generateId(),但返回的id似乎被忽略,node.js,socket.io,Node.js,Socket.io,我正试图覆盖这个页面。我使用了来自。但这种行为很奇怪generateId被执行,但socket.id类似于常规id,而不是所需的结果“custom:id:”+1 代码 const express=require('express'); const socketIO=require('socket.io'); const http=require('http'); 常量app=express(); 应用程序集('端口',5000); const server=http.server(app); 常

我正试图覆盖这个页面。我使用了来自。但这种行为很奇怪
generateId
被执行,但
socket.id
类似于常规id,而不是所需的结果
“custom:id:”+1

代码
const express=require('express');
const socketIO=require('socket.io');
const http=require('http');
常量app=express();
应用程序集('端口',5000);
const server=http.server(app);
常量io=socketIO(服务器);
io.engine.GENATEID=(请求)=>{
console.log('在这里打印')
返回“自定义:id:+1;
}
io.on('连接',套接字=>{
console.log(socket.id);
})
侦听(5000,异步()=>{
log('在端口5000上启动服务器');
});
预期输出:
custom:id:1

实际输出:
MNWAC86CdPXB7thTAAAA

package.json依赖项
“依赖项”:{
“base64id”:“^2.0.0”,
“清理网页包插件”:“^3.0.0”,
“cookie”:“^0.4.1”,
“css加载器”:“^5.0.1”,
“快车”:“^4.17.1”,
“文件加载器”:“^6.2.0”,
“html网页包插件”:“^4.5.0”,
“jquery”:“^3.5.1”,
“ngrok”:“^3.4.0”,
“sass”:“^1.29.0”,
“sass加载程序”:“^10.1.0”,
“套接字io”:“^1.0.0”,
“socket.io”:“^3.0.3”,
“socket.io客户端”:“^3.0.3”,
“样式加载器”:“^2.0.0”,
“网页包”:“^5.7.0”,
“网页包开发中间件”:“^4.0.2”
}

我也遇到了这个问题。显然,这是由于socket.io版本4发生了更改。下面的代码来自node_modules/socket.io/dist/socket.js。看来,更改是出于安全原因

if (client.conn.protocol === 3) {
    // @ts-ignore
    this.id = nsp.name !== "/" ? nsp.name + "#" + client.id : client.id;
}
else {
    this.id = base64id_1.default.generateId(); // don't reuse the Engine.IO id because it's sensitive information
}
client.id将具有您在generateId中返回的值,但不会像我们预期的那样使用它

查看源代码并进行调试后,看起来可以在io.use中设置套接字id(下面的示例)


对于初学者,
return“custom:id:”+1不是唯一的。它每次都生成相同的值。至少尝试使用一个计数器(如文档中所示)生成一个唯一的值。@jigirend00我已经尝试过了,不管你是否这样做,都没有什么区别。事实上,我在另一个项目中遇到了这个bug,在那里我尝试了这个解决方案。我创建此文件只是为了“隔离”错误并使其更清楚。@Atr0x您能按照jfriend00的建议显示用于唯一ID的代码吗?我也认为这个问题可能与返回的idI的独特性有关,我正在努力解决同样的问题!
var idIndex = 0
io.use((socket, next) => {
    socket.id = `ID_${idIndex++}`;
    next();
});