web-dev-qa-db-fra.com

Comment convertir un objet Javascript en un Node Buffer?

J'utilise Buffer sur mon serveur de noeud et Buffer sur mon client Javacript.

Dans le but d'économiser des octets, je cherche à envoyer mes données au serveur via des sockets Web au format binaire, par opposition à JSON.

Donc, si j'avais l'objet Javascript de [ 5, false, 55, "asdf" ], J'aimerais convertir cela dans le tampon du client juste avant de l'envoyer. Peut-être quelque chose comme ça:

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

et le lire sur le serveur quelque chose comme ceci:

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

J'examine les solutions actuelles et il semblerait que je doive simplement faire beaucoup de concating, en spécifiant les décalages/longueurs d'octets, la conversion des ints en booléens, etc.

Y a-t-il une meilleure façon?

Edit: Voici comment je pense que vous devez actuellement le faire. Je suppose que mon problème est simplement qu'il est trop verbeux et sujet aux erreurs et je cherche une manière plus concise et élégante de le faire, car cette opération sera effectuée à de nombreux endroits différents dans mon code.

// 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: Googler autour et je pense que je pourrais vouloir quelque chose comme des tampons de protocole. Je ne sais pas exactement ce qu'ils sont encore ou s'ils s'appliquent, mais il semble que vous pouvez spécifier un schéma dans un fichier pour tous vos messages, puis sérialiser vos objets JSON à ce schéma et lui faire retourner un tampon, que vous pouvez ensuite désérialiser en utilisant le même schéma sur le client/autre serveur. Je vais y regarder un peu plus.

14
Lawrence Douglas

Un buffer premier argument doit être un: String, Buffer, ArrayBuffer, Array ou objet de type tableau.

En tenant compte de ces informations, nous pourrions implémenter ce que vous recherchez en créant un tampon à partir d'un String. Cela ressemblerait à quelque chose comme ceci:

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>

Ensuite, vous pouvez ramener votre JSON comme suit:

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