Извлечение всех объектов сокета в io.socket

#javascript #node.js #socket.io

#javascript #node.js #socket.io

Вопрос:

Я хочу извлечь все отдельные объекты сокета из io.sockets и выполнить итерацию по каждому из них.

Что-то вроде:

 for (socket in io.sockets.something()) {
   // do something with each socket
}
  

Либо я делаю это неправильно, либо я, должно быть, что-то упускаю. Мысли?

Комментарии:

1. Итак, в чем проблема или вопрос?

2. Мне просто любопытно, каков был бы вариант использования для этого?

Ответ №1:

Официальный метод:

 io.sockets.clients().forEach(function (socket) { .. });
  

Или фильтр по комнатам:

 io.sockets.clients('roomname') .. same as above ..
  

Это рекомендуется по сравнению с предложением, приведенным выше, как сокет.внутренняя структура данных io всегда может быть изменена и потенциально нарушить весь ваш код при будущих обновлениях. Вы гораздо меньше рискуете, когда используете этот official метод.

Комментарии:

1. Это моя единственная жалоба на то, что в остальном фантастическое Socket.io : несмотря на множество примеров , нет краткой документации по API, что позволяет мне самостоятельно выбирать путь к моему первому предложению.

2. josh3736 да, документация — это немного больное место в банкомате. вероятно, нам следует запустить инструмент JSDoc над нашим кодом, чтобы создать небольшую документацию по API.

3. @3rdEden Я нахожу действительно ироничным, что это было предложено в качестве официального метода и было быстро удалено в Socket. IO 1.0 🙂 — Это должно добавить его обратно…

Ответ №2:

Это может быть или не быть «документировано», но работает:

 for (var id in io.sockets.sockets) {
    var s = io.sockets.sockets[id];
    if (!s.disconnected) {
        // ...
        // for example, s.emit('event', { ... });
    }
}
  

Использовать io.sockets.clients() :

 io.sockets.clients().forEach(function(s) {
    // ...
    // for example, s.emit('event', { ... });
});
  

Вы можете использовать отличный инспектор узлов для подключения к вашему приложению и проверки содержимого s .

Комментарии:

1. Это именно то, что мне было нужно. Проверка io.sockets сделала это очевидным для меня. Я понимаю, что мой вопрос не был ясен, спасибо за ответ.

Ответ №3:

Получить все сокеты, в которых нет места:

 for (let s of io.of('/').sockets) {
let socket = s[1];
socket.emit(...);}