Понимание объекта wss.clients в пакете ws npm - PullRequest
1 голос
/ 29 мая 2020

Я работаю с библиотекой npm ws на сервере Node.js. Я просматривал документацию и нашел способ l oop через клиентов, например, чтобы отправить сообщение всем, используя объект wss.clients:

const WebSocket = require('ws');
const wss = new WebSocket.server({ port:8080 });
//...
wss.clients.forEach(client => {
  client.send("A message to you!");
});

Сначала я подумал, что wss.clients был массивом, потому что он позволял мне перебирать его с прототипом массива forEach(), но когда я попытался запустить на нем wss.clients.find(), чтобы отправить сообщение только на определенное соединение c, я получил ошибку:

TypeError: wss.clients.find is not a function

Я запустил console.log(Array.isArray(wss.clients)) он сказал ложь . Когда я попробовал console.log(wss.clients), я получил объект, выглядящий следующим образом:

Set { WebSocket { ... } }

Итак, мой вопрос: как объект wss.clients может запускать массив прототип forEach()? Он работал без использования Object.keys() или чего-то еще. Я также попробовал wss.clients.pop() из любопытства, и он дал другую ошибку типа.

Что на самом деле wss.clients? Объект или массив?

1 Ответ

1 голос
/ 29 мая 2020

Я обнаружил (благодаря @waiaan), что тип wss.clients - это Set . У наборов разные методы, чем у массивов, но они похожи.

Лучшей реализацией Set.prototype.find () было бы определение такого метода:

Set.prototype.find = function(cb) {
    for (const e of this) {
        if (cb(e)) {
            return e;
        }
    }
}

Подробнее о массивах и устанавливает в этот артикул .

...