Ao definir io.engine.generateId
na v2.3.0, os IDs de soquete são definidos de acordo.
No 3x (testado em 3.0.0 e 3.0.3) eles não são.
Em 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 na v2.3.0, o formato esperado dos ids de soquete deve ser, neste caso, "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", sendo x alfanumérico. Em vez disso, obtenho o formato de ID de soquete padrão.
Nenhum erro é lançado, o formato simplesmente não está definido.
Sim, isso é esperado.
Aqui está o commit relacionado: https://github.com/socketio/socket.io/commit/2875d2cfdfa463e64cb520099749f543bbc4eb15
Portanto, o método generateId
ainda está funcionando na v3, mas agora afetará apenas o parâmetro de consulta sid
, não o atributo id
do soquete.
Posso perguntar qual é o seu caso de uso?
Oh, tudo bem! Obrigado pela informação.
Eu estava reutilizando id
para transmiti-lo a outros clientes para chamadas de vídeo usando peer.js, mas peer.js não gosta de seu formato.
Mas acabei de ver no commit que você mencionou que eu não deveria fazer isso por motivos de segurança, então acho que posso encerrar este problema.
Obrigado!
Acho que esse problema deve ser reaberto (ou um novo problema criado), pois na versão 3.0, não parece que a função generateId alguma vez seja chamada. Eu entendo que ele não está mais substituindo a propriedade socket.id, mas o comentário anterior de @darrachequesne sugere que ele está alterando uma propriedade diferente.
No entanto, de acordo com a documentação, faça o seguinte:
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');
});
A função nunca é chamada.
@BrianHVB Acho que há um erro de digitação em seu exemplo de código:
io.engine.generateId = ((req) => {
console.log('This line is never executed');
return new Date().valueOf().toString()
});
Você poderia confirmar se isso corrige o problema?
@darrachequesne - Opa, sim, é isso mesmo. Obrigada.