Socket.io: GenerateId funktioniert nicht auf 3x

Erstellt am 23. Nov. 2020  ·  5Kommentare  ·  Quelle: socketio/socket.io

Ich möchte:

  • [x] einen Fehler melden
  • [ ] Feature anfordern request

Aktuelles Verhalten

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.

Schritte zum Reproduzieren

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();
}

Erwartetes Verhalten

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.

Einrichten

  • Betriebssystem: Windows 10, läuft auf Node.js
  • socket.io-Version: 3.0.0 und 3.0.3

Sonstige Informationen (z. B. Stacktraces, verwandte Probleme, Vorschläge zur Behebung)

Es werden keine Fehler geworfen, das Format ist einfach nicht eingestellt.

question

Alle 5 Kommentare

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 -

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen