Как запустить отправку websocket из другой функции в Node? - PullRequest
0 голосов
/ 19 сентября 2019

Прошло много времени с тех пор, как я работал с Node и Websockets.В основном, как заставить socket.send () работать из другой функции, я застрял на этом.

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', socket => {
  socket.on('message', message => {
    console.log(`received from a client: ${message}`);
  });
  socket.send('yo world!');
});

function onMessageHandler (target, context, msg, self) {
    client.say(target, response);
    server.socket.send(response);
    console.log(response);
  }
}

Как мне заставить мой onMessageHandler инициировать отправку сокета, это не удалось ...server.socket.send (ответ);

1 Ответ

0 голосов
/ 19 сентября 2019

Видя твой вопрос, я думаю, что нет понимания того, как работают Websockets.Я предполагаю, что вы используете https://github.com/websockets/ws

Есть две вещи.Во-первых, это WebSocketerver, который вы назвали server, а затем индивидуальный сокет, который вы назвали socket

Теперь нужно понять, что сокет недоступен снаружи server.on() callback Причинаэто может быть 1000 сокетов, подключенных к данному экземпляру, и не было бы способа однозначно идентифицировать конкретный сокет, на который вы хотите отправить сообщение.

Поэтому задайте себе вопрос, что ваше приложение хочет отправить сообщениена отдельный сокет для отправки всем, кто подключен к вашему серверу (в основном, широковещательный)

Если вы хотите отправить отдельному человеку, вам нужно будет однозначно идентифицировать пользователя

this._wss = new WebSocket.Server({
            port: ENV_APP_PORT_WS
        });

        this._wss.on("connection", async (ws: AppWebSocket, req: IncomingMessage) => {
            // const ipAddress = req.connection.remoteAddress; // IP Address of User
            logger.info(req);

            const queryParams = url.parse(req.url, true).query;

            let authUser: User;
            try {
                authUser = await this._authenticateWebSocket(queryParams);
            } catch (e) {
                // Terminate connection and return...
            }

            // WS User INIT
            ws.isAlive = true;
            ws.userId = authUser.id;
            ws.uuid = Helpers.generateUUIDV4();

            ws.send(JSON.stringify({
                type: "connected",
                env: ENV
            }));
        });

Приведенный выше код добавит свойство к каждому объекту сокета, которое позволит ему однозначно идентифицировать конкретного пользователя / сокета.

При отправке =>

    onMessageHandler(targetUserId: number, message: string) {
        const allSockets = <AppWebSocket[]>Array.from(this._wss.clients.values());
        const targetSocket = allSockets.find(w => w.userId === targetUserId);

        targetSocket.send(message);
    }

Если вы хотите отправить всем подключенным пользователям, это довольно просто: https://github.com/websockets/ws#server-broadcast

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...