Ich versuche, den Überblick über Client-Sockets innerhalb eines Datenobjekts zu behalten.
var clients = {"clients":[]};
io.sockets.on("connection", function(socket) {
clients.clients.push(socket);
io.emit("updateUsers", clients);
});
Erhalte diesen Fehler: RangeError: Maximale Call-Stack-Größe überschritten.
Ich dachte, dass Clients eher ein Objekt als ein Array sind, um den Call-Stack-Fehler zu beheben, aber ich schätze, ich habe mich geirrt ... Ich bin mir nicht sicher, was ich hier übersehen habe.
Vielen Dank!
Antworten:
0 für die Antwort № 1Sie haben die socket
Objekt in den Daten, die Sie ausgeben möchten, clients
clients.clients.push(socket);
socket
Objekt ist eine komplexe Struktur, die möglicherweise Zirkelverweise enthält.
Der Weg io.emit
Das funktioniert nur, wenn zuerst die Daten konvertiert werden, die zum Senden an den JSON-String erforderlich sind JSON.stringify(clients)
. Jetzt JSON.stringify
kann nicht an Objekten arbeiten, die Zirkelverweise haben das ist die ursache deines fehlers.
Sie sollten nicht etwas so Komplexes wie socket
in die Daten, die Sie sowieso ausgeben möchten. Sie sollten nur die wichtigsten Informationen ausgeben. Wenn du nur ausstrahlen wolltest socket.id
das solltest du einfach pushen
clients.clients.push({id: socket.id})
.. oder andere solche Informationen, aber es bleibt ein einfaches Objekt, das in eine JSON-Zeichenfolge konvertiert werden kann.