Próbuję samodzielnie śledzić gniazda klienta w obiekcie danych.
var clients = {"clients":[]};
io.sockets.on("connection", function(socket) {
clients.clients.push(socket);
io.emit("updateUsers", clients);
});
Otrzymuję ten błąd: RangeError: Przekroczono maksymalny rozmiar stosu wywołań.
Myślałem, że uczynienie klientów obiektami, a nie tablicą, rozwiąże błąd stosu wywołań, ale zgaduję, że się myliłem ... Nie jestem pewien, co tutaj przeoczam.
Dzięki!
Odpowiedzi:
0 dla odpowiedzi № 1Umieściłeś socket
obiekt w danych, które chcesz emitować, clients
clients.clients.push(socket);
socket
obiekt jest złożoną strukturą, prawdopodobnie zawierającą odwołania kołowe.
Droga io.emit
Działa w ten sposób, że najpierw konwertuje dane potrzebne do przesłania na ciąg JSON JSON.stringify(clients)
. Teraz JSON.stringify
nie może działać na obiektach, które mogą mieć odwołania cykliczne to jest przyczyną twojego błędu.
Nie powinieneś stawiać czegoś tak złożonego jak socket
w dane, które i tak chcesz wysłać. Powinieneś emitować tylko najważniejsze informacje. Gdybyś tylko chciał emitować socket.id
powinieneś to popchnąć
clients.clients.push({id: socket.id})
.. lub inne takie informacje, ale zachowując je jako prosty obiekt, który można przekształcić w ciąg JSON.