отправка объекта javascript через websockets с faye

Привет всем, я пытаюсь отправить объект javascript через websockets:

в документации faye-websockets говорится:

send (message) принимает либо String, либо Buffer и отправляет текстовое или двоичное сообщение по соединению с другим одноранговым узлом.

Я использую node и faye.

var WebSocket = require('faye-websocket');
var http = require('http');

var server = http.createServer();
server.addListener('upgrade', function(request, socket, head) {
    var ws = new WebSocket(request, socket, head);
    ws.send({topic:'handshake', data:'sdf487rgiuh7'});
});
server.listen(8000);

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

<script>
    var ws = new WebSocket('ws://localhost:8000');
    ws.onmessage = function(e) {
        console.log(e.data); //prints [Object object] string and not the object
    };
</script>

Какова моя ошибка? благодаря

Ответ 1

WebSockets поддерживают отправку и получение: строки, типизированные массивы (ArrayBuffer) и Blobs. Перед отправкой объекты Javascript должны быть сериализованы до одного из вышеуказанных типов.

Чтобы отправить объект в виде строки, вы можете использовать встроенную поддержку JSON:

ws.send(JSON.stringify(object));

Чтобы отправить объект в виде типизированного массива, вы можете использовать библиотеку BSON javascript, такую как эта:

ws.send(BSON.serialize(object));

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

Чтобы десериализовать строку JSON из сообщения WebSocket:

ws.onmessage = function (e) {
    var object = JSON.parse(e.data);
    ...
};

Если вы используете двоичные сообщения через WebSocket, сначала вы должны установить атрибут binaryType, чтобы получать все двоичные сообщения в виде типизированных массивов:

ws.binaryType = "arraybuffer";

Тогда десериализация будет выглядеть так:

ws.onmessage = function (e) {
    var object = BSON.deserialize(e.data);
    ...
};

Вот сообщение в блоге об использовании BSON в Javascript;

Ответ 2

Я в основном работаю с Socket.IO, но похоже, что вам нужно укрепить свои данные на сервере и проанализировать его на клиенте так:

на сервере:

ws.send(JSON.stringify({topic:'handshake', data:'sdf487rgiuh7'}));

в клиенте:

console.log(JSON.parse(e.data));

Ответ 3

Клиент:

const bson = new BSON();
ws.binaryType = 'arraybuffer';

ws.onmessage = function(event) {
  console.log(bson.deserialize(Buffer.from(event.data)));
}

Сервер:

 const data = bson.serialize({ ... });
 ws.send(data);