Al configurar io.engine.generateId
en v2.3.0, los identificadores de socket se configuran en consecuencia.
En 3x (probado en 3.0.0 y 3.0.3) no lo son.
En Node.js:
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const { v4: uuidv4 } = require('uuid');
io.engine.generateId = function (req)
{
return uuidv4();
}
Como funciona en v2.3.0, el formato esperado de los ID de socket debe ser, en este caso, "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", siendo x alfanumérico. En su lugar, obtengo el formato de identificación de socket predeterminado.
No se arrojan errores, simplemente no se establece el formato.
Sí, eso se espera.
Aquí está el compromiso relacionado: https://github.com/socketio/socket.io/commit/2875d2cfdfa463e64cb520099749f543bbc4eb15
Por lo tanto, el método generateId
todavía funciona en v3, pero ahora solo afectará al parámetro de consulta sid
, no al atributo id
del socket.
¿Puedo preguntar cuál es su caso de uso?
¡Ah, vale! Gracias por la info.
Estaba reutilizando id
para transmitirlo a otros clientes para videollamadas usando peer.js, pero a peer.js no le gusta su formato.
Pero acabo de ver en el compromiso que mencionaste que no debería estar haciendo esto por razones de seguridad, así que supongo que puedo cerrar este problema.
¡Gracias!
Creo que este problema debería reabrirse (o crearse un nuevo problema), ya que en la versión 3.0, no parece que se haya llamado a la función generateId. Entiendo que ya no reemplaza la propiedad socket.id, pero el comentario anterior de @darrachequesne sugiere que está cambiando una propiedad diferente.
Sin embargo, según la documentación, haga lo siguiente:
const content = require('fs').readFileSync(__dirname + '/index.html', 'utf8');
const httpServer = require('http').createServer((req, res) => {
// serve the index.html file
res.setHeader('Content-Type', 'text/html');
res.setHeader('Content-Length', Buffer.byteLength(content));
res.end(content);
});
const io = require('socket.io')(httpServer);
io.engine.generateId((req) => {
console.log('This line is never executed');
return new Date().valueOf().toString()
});
io.on('connection', socket => {
console.log('connect');
console.log(socket.sid);
});
httpServer.listen(3000, () => {
console.log('go to http://localhost:3000');
});
La función nunca se invoca.
@BrianHVB Creo que hay un error tipográfico en su ejemplo de código:
io.engine.generateId = ((req) => {
console.log('This line is never executed');
return new Date().valueOf().toString()
});
¿Podría confirmar que soluciona el problema?
@darrachequesne - Vaya, sí, eso es