Beim Setzen von io.engine.generateId
in v2.3.0 werden die Socket-IDs entsprechend gesetzt.
In 3x (getestet auf 3.0.0 und 3.0.3) sind sie es nicht.
In 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();
}
Da in v2.3.0 funktioniert, sollte das erwartete Format der Socket-IDs in diesem Fall "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" sein, wobei x alphanumerisch ist. Stattdessen erhalte ich das Standard-Socket-ID-Format.
Es werden keine Fehler geworfen, das Format ist einfach nicht eingestellt.
Ja, das wird erwartet.
Hier ist der zugehörige Commit: https://github.com/socketio/socket.io/commit/2875d2cfdfa463e64cb520099749f543bbc4eb15
Die Methode generateId
funktioniert also noch in v3, aber sie wirkt sich jetzt nur noch auf den Abfrageparameter sid
aus, nicht auf das Attribut id
des Sockets.
Darf ich fragen, was dein Anwendungsfall ist?
Oh ok! Danke für die Information.
Ich habe id
wiederverwendet, um es mit peer.js für Videoanrufe an andere Clients zu übertragen, aber peer.js mag sein Format nicht.
Aber ich habe gerade in dem Commit gesehen, dass Sie erwähnt haben, dass ich dies aus Sicherheitsgründen nicht tun sollte, also kann ich dieses Problem wohl schließen.
Vielen Dank!
Ich denke, dieses Problem sollte erneut geöffnet werden (oder ein neues Problem erstellt werden), da in Version 3.0 die Funktion "generateId" anscheinend nie aufgerufen wird. Ich verstehe, dass es die socket.id-Eigenschaft nicht mehr ersetzt, aber der frühere Kommentar von @darrachequesne deutet darauf hin, dass eine andere Eigenschaft
Gehen Sie jedoch gemäß der Dokumentation wie folgt vor:
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');
});
Die Funktion wird nie aufgerufen.
@BrianHVB Ich denke, in Ihrem Codebeispiel ist ein Tippfehler:
io.engine.generateId = ((req) => {
console.log('This line is never executed');
return new Date().valueOf().toString()
});
Könnten Sie bitte bestätigen, dass es das Problem behebt?
@darrachequesne -