#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. Даже в этом случае пример будет вводить в заблуждение, как видно из самого этого вопроса.