Почему полученные данные websocket выводятся в виде буфера?

#node.js #websocket #ws

Вопрос:

Я пытаюсь сделать очень простой веб-сайт, но я не понимаю, почему я не получаю строку обратно.

Я использую ws модуль из npm для сервера. https://github.com/websockets/ws

клиент:

     let socket = new WebSocket('wss://upload.lospec.com');

    socket.addEventListener('open', function (event) {
        socket.send('test');
    });
 

сервер:

 const wss = new WebSocket.Server({ server });

wss.on("connection", function (ws) {
    ws.on("message", function (asdfasdf) {
        console.log("got new id from client",asdfasdf);
    });
 

результат сервера:

 got new id from client <Buffer 74 65 73 74>
 

Пытаясь следовать примерам в документах, а также в этом руководстве: https://ably.com/blog/web-app-websockets-nodejs

Но это не выходит как струна, как обещают оба места.

Почему это не выходит в виде строки?

Ответ №1:

Вы, вероятно, используете другую версию ws , чем в учебнике. Похоже, что в учебнике используется версия старше v8, в то время как вы используете версию v8 .

Из списка изменений для 8.0.0:

Текстовые сообщения и причины закрытия больше не декодируются в строки. Они передаются как Buffer s слушателям соответствующих событий. Слушатели 'message' события теперь принимают логический аргумент, указывающий, является ли сообщение двоичным ( e173423 ).

Существующий код может быть перенесен путем явного декодирования буфера.

 websocket.on('message', function message(data, isBinary) {
  const message = isBinary ? data : data.toString();
  // Continue as before.
});
 
 websocket.on('close', function close(code, data) {
  const reason = data.toString();
  // Continue as before.
});
 

Это также описывает решение.

В качестве альтернативы вы можете перейти на версию 7.5.0 ws , чтобы соответствовать тому, что используется в учебнике:

 npm i ws@7.5.0
 

Что касается примера «отправка и получение текстовых данных» в документах библиотеки: я считаю, что с их стороны было упущением, что этот пример не был обновлен при выпуске версии 8. Вы можете открыть выпуск на GitHub, чтобы сообщить им об этом.

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

1. Спасибо, это имеет смысл (и, похоже, работает сейчас).

2. Также мне интересно, является ли часть %s в примерах документации автоматически принудительно преобразующей ее в строку, поэтому toString не требуется (и я подозреваю, что JSON.stringify тоже это делает, что я видел несколько раз, когда исключал toString)

3. Даже в этом случае пример будет вводить в заблуждение, как видно из самого этого вопроса.