2012-10-23 8 views
24

Hallo zusammen Ich versuche, ein Javascript-Objekt durch WebSockets zu senden: DokumentationSenden eines Javascript-Objekt durch WebSockets mit Faye

die faye-WebSockets sagt:

send (Nachricht)akzeptiert entweder ein String oder Buffer und sendet eine Text- oder Binärnachricht über die Verbindung zum anderen Peer.

Serverseite Ich benutze Knoten und 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); 

Client-Seite:

<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> 

was ist mein Fehler? Dank

+0

, die geben -1 erklärt den Grund bitte .. – frx08

+3

Die -1 ist wahrscheinlich aufgrund der Tatsache, dass die Fehlermeldung Ihnen bereits gesagt hat, genau Was ist falsch. –

Antwort

64

WebSockets unterstützen das Senden und Empfangen: Strings, typisiert Arrays (Arraybuffer) und Blobs. JavaScript-Objekte müssen vor dem Senden in einen der oben genannten Typen serialisiert werden.

Um ein Objekt als String senden Sie die eingebaute JSON-Unterstützung verwenden können:

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

Senden Sie ein Objekt als typisierte Array Sie eine Javascript-BSON Bibliothek wie this one verwenden können:

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

Wenn Sie eine WebSocket-Nachricht erhalten, müssen Sie sie deserialisieren.

Um einen JSON-String aus einer WebSocket Nachricht deserialisiert:

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

Wenn Sie binäre Nachrichten über WebSocket verwenden, dann sollten Sie zunächst das binary Attribut gesetzt, um alle binären Nachrichten als typisierte Arrays zu erhalten:

ws.binaryType = "arraybuffer"; 

Dann wird die Deserialisierung wie folgt aussehen:

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

Hier ist ein Blogpost über using BSON in Javascript;

+2

Ihr Link ist tot:/Und es gibt keine readme.md auf dem Git Repo von js-bson. Ich suche ein Dokument. – Vadorequest

+1

https://github.com/mongodb/js-bson – Vadorequest

+1

Ist es möglich, dass der 'onmessage'-Callback nicht die gesamte json-Zeichenfolge zurückgibt, und daher' JSON.parse' einen Parsing-Fehler auslöst? –

1

Ich bin im Grunde mit Socket.IO arbeiten, aber es sieht aus wie Sie benötigen, um Ihre Daten auf dem Server stringify und es in dem Client analysieren wie so:

im Server:

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

im Client:

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

in Ihrem Fall senden Sie eine Zeichenfolge, aber da faye unterstützt das Senden binärer Daten Ich möchte diese Funktion nutzen – frx08

+1

@ frx08 Ein JS-Objekt ist keine Binärdaten, ein Bild wäre. Also ist Udidus Antwort richtig. – dom

+1

so ist die einzige Methode, ein js-Objekt zu serialisieren, es zu stringifizieren? – frx08

0

Auftraggeber:

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

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

Server:

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