Как сохранить возвращенный объект protobuf в nodejs?

В моем коде функция возвращает объект protobuf, и я хочу сохранить его в файле xyz.pb.
Когда я пытаюсь сохранить его с помощью fs.writefilesync, он не сохраняется.

Он имеет круговой характер. Итак, я попытался сохранить его с помощью модуля round-json, чтобы убедиться, что внутри него что-то есть и есть ли у него данные.

Но, поскольку я использовал циркулярный json, в первую очередь, он не имеет надлежащей информации (не отформатирован должным образом), и он бесполезен.

Как я могу сохранить этот protobuf в файл с помощью nodejs?

Спасибо!


person Shubham Chadokar    schedule 15.05.2019    source источник


Ответы (3)


вы можете попробовать использовать потоки как указано в документации

следующим образом

const crypto = require('crypto');
const fs = require('fs');
const wstream = fs.createWriteStream('fileWithBufferInside');
// creates random Buffer of 100 bytes
const buffer = crypto.randomBytes(100);
wstream.write(buffer);
wstream.end();

или вы можете преобразовать буфер в JSON и сохранить его в файле следующим образом:

const crypto = require('crypto');
const fs = require('fs');
const wstream = fs.createWriteStream('myBinaryFile');
// creates random Buffer of 100 bytes
const buffer = crypto.randomBytes(100);
wstream.write(JSON.stringify(buffer));
wstream.end();

и если логика вашего приложения не требует использования природы синхронизации, вы не должны использовать writeFileSync, поскольку он заблокирует ваш код до тех пор, пока он не закончится, поэтому будьте осторожны. попробуйте вместо этого использовать writeFile или Streams, это удобнее.

person Mohamed Assem    schedule 16.05.2019

Назначение протокольных буферов — сериализация строго типизированных сообщений в двоичный формат и обратно в сообщения. Если вы хотите записать сообщение из памяти в файл, сначала сериализуйте сообщение в двоичный файл, а затем запишите двоичный файл в файл.

документация NodeJS Buffer

NodeJS записывает двоичный буфер в файл

Документация по буферам протоколов JavaScript SDK

Это должно выглядеть примерно так:

const buffer = messageInstance.serializeBinary()
fs.writeFile("filename.pb", buffer, "binary", callback)
person AJcodez    schedule 16.05.2019
comment
Выдает ошибку, поскольку serializeBinary не является функцией. Должен ли я импортировать какой-либо модуль или что-то для этого? Спасибо - person Shubham Chadokar; 16.05.2019

Я нашел, как легко сохранить объект protobuf в файл.

Преобразуйте объект protobuf в буфер, а затем сохраните его.

const protobuf = somefunction(); // returning protobuf object  
const buffer = protobuf.toBuffer();  

fs.writeFileSync("filename.pb", buffer);
person Shubham Chadokar    schedule 17.05.2019