2016-07-08 8 views
7

Ich verwende Buffer auf meinem Node-Server und Buffer auf meinem JavaScript-Client.Wie konvertiert man ein Javascript Objekt in einen Node Buffer?

Zum Zwecke der Speicherung von Bytes, ich bin auf der Suche nach senden meine Daten an den Server über WebSockets als binäre im Gegensatz zu JSON.

Also, wenn ich das Javascript-Objekt von [ 5, false, 55, "asdf" ] hätte, möchte ich das in den Puffer auf dem Client direkt vor dem Senden konvertieren. Vielleicht so etwas wie:

object.toBuffer('int16', 'bool', 'int16', 'utf8'); 

und es auf dem Server so etwas wie diese lesen:

var obj = buffer.read('int16', 'bool', 'int16', 'utf8'); 

ich zu aktuellen Lösungen bin auf der Suche, und es sieht aus wie ich haben kann, nur eine Menge concat tun ing, Angabe von Byte-Offsets/Längen, Konvertierung von Ints nach Boolean etc.

Gibt es einen besseren Weg?

Bearbeiten: Hier ist, wie ich denke, Sie müssen es derzeit tun. Ich denke, mein Problem ist nur, dass es zu ausführlich und fehleranfällig ist, und ich suche nach einer präziseren und eleganteren Vorgehensweise, da diese Operation an vielen verschiedenen Stellen in meinem Code ausgeführt wird.

// On client for [ 5, false, 55, "test" ] 

const writeFirst = Buffer.allocUnsafe(2); 
writeFirst.writeInt16LE(5, 0); 
const writeSecond = Buffer.allocUnsafe(1); 
writeSecond.writeUInt8(0); 
const writeThird = Buffer.allocUnsafe(2); 
writeThird.writeInt16LE(55, 0); 
const writeFourth = Buffer.from('test'); 

const result = Buffer.concat([writeFirst, writeSecond, writeThird, writeFourth]); 

// On server for reading buffer of [ 5, false, 55, "test" ] 

const readFirst = result.readInt16LE(0); 
const readSecond = Boolean(result.readUInt8(2)); 
const readThird = result.readInt16LE(3); 
const readFourth = result.toString('utf8', 5); 

Edit # 2: War googeln um, und ich denke, dass ich so etwas wie Protokollpuffer wollen könnte. Ich bin nicht genau sicher, was sie noch sind oder ob sie zutreffen, aber es sieht so aus, als könnten Sie für alle Ihre Nachrichten ein Schema in einer Datei angeben und dann Ihre JSON-Objekte zu diesem Schema serialisieren und einen Puffer zurückgeben, den Sie dann können Deserialisierung mit dem gleichen Schema auf dem Client/anderen Server. Ich schaue mir das genauer an.

+0

Sie den Puffer auf einen Blob umwandeln müsste() auf einem Sockel zu senden sowieso und gzip sollte auf JSON-Wiederholung achten, welche Arrays sowieso wenig haben. – dandavis

+0

@dandavis: Warum sollte es ein Blob sein? Kannst du 'connection.binaryType =" arraybuffer ";'? –

+0

hmm vielleicht, ich wusste nicht, das war eine Socket-Option, das letzte Mal, als ich schmutzig wurde, nur Blobs arbeiteten in meinem Projekt ... – dandavis

Antwort

7

Ein Puffer erstes Argument muss ein sein: String, Buffer, ArrayBuffer, Array oder Array-ähnliches Objekt.

Unter Berücksichtigung dieser Informationen könnten wir implementieren, was Sie suchen, indem Sie einen Puffer aus einem String erstellen. Es wäre so etwas wie folgt aussehen:

let json = [ 5, false, 55, 'asdf' ]; 

let buffer = Buffer.from(JSON.stringify(json)); 
console.log('Buffer: ', buffer); // Buffer: <Buffer 5b 20 35 2c 20 66 61 6c 73 65 2c 20 35 35 2c 20 22 61 73 64 66 22 20 5d> 

Dann können Sie Ihre JSON wie so bringen:

let converted = JSON.parse(buffer); 
console.log('Parsed to json', converted); // Parsed to json [ 5, false, 55, 'asdf' ] 
+2

'new Buffer()' ist zur Zeit veraltet (auch wenn es noch in Knoten 8.2 funktioniert). Die unterstützte Methode ist 'Buffer.from ()' – Danibix