Nodejs - захватить событие OPEN на стороне сервера - PullRequest
0 голосов
/ 20 июня 2020

Клиент отправляет данные, используя один раз. Но я хочу зафиксировать событие OPEN на стороне сервера ...

Код на стороне клиента:

const ws = new WebSokcet('ws://localhost:7887');

ws.once('open', () => {
    ws.send('TEST|1234\0')
})

На стороне сервера я пробовал следующее, но оно не срабатывает.

websocket.on('open', data => {

    console.log("test");

});

На основании комментария в https://github.com/espruino/Espruino/issues/1227#issuecomment -325630041 кажется, что open является только клиентским.

Как я могу сохранить данные, отправленные только один раз?

1 Ответ

0 голосов
/ 20 июня 2020

Я думаю, что вы путаете события. «открыть», «веб-сокет», «закрыть» - все они относятся к жизненному циклу соединения. Вы не получите там информацию.

С другой стороны, «сообщение» предназначено для получения информации.

На сервере отсутствует событие сообщения:

websocket.on('message', function (msg) {
   console.log('test')
})

РЕДАКТИРОВАТЬ: отвечая на расширенный вопрос в комментариях. По сути, вы хотите создать протокол поверх библиотеки websocket, чтобы включить аутентификацию или другие. Если вы хотите реализовать это самостоятельно, вам следует добавить сообщения другого типа. Скажите:

websocket.on('mmessage', function (msg) {
  try {
    // JSON parse must always be try catch, since string might not be a json and async errors are really bad
    const data = JSON.parse(msg.toString())
    if (!('type' in data')) {
       // We require type in property, probably go on the error route
       throw new Error(...)
    }
    const type = data.type
    if (type === AUTH) {
       /// ....
    } else if (type == MSG) {
       const token = data.token
       // check token, which is required in every message
    }
  } catch (e) {
    // TODO log and probably return feedback to the client
  }
})

На клиенте вы бы сделали что-то подобное:

ws.once('open', () => {
   ws.send(JSON.stringify({type: AUTH, data: {pass: '1234', user: 'TEST'}}))
})

Если вы используете оболочку поверх веб-сокета, тогда у вас будет более простой код. Я думаю, что с socket.io, например, вы можете отправить объект, и он будет вами преобразован в строку

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