Конвертировать массив вложенных объектов в Buffer Nodejs

1) почему? Мне нужно передать буфер RabbitMQ, опубликовать метод http://www.squaremobius.net/amqp.node/channel_api.html
2) мои данные выглядят так

[ // array of objects
  {
    id: 1,
    name: 'John Doe',
    prop: {
      a: [....], // nested
      b: [....],
      c: {...}
    }
  },
  ...
]

Как правильно конвертировать массив таких объектов в буфер, чтобы с другой стороны можно было разобрать обратно.

1 ответ

1) почему?

С https://www.rabbitmq.com/tutorials/amqp-concepts.html

Сообщения AMQP также имеют полезную нагрузку (данные, которые они несут), которые брокеры AMQP рассматривают как непрозрачный байтовый массив. Брокер не будет проверять или изменять полезную нагрузку. Сообщения могут содержать только атрибуты и не содержать полезных данных. Обычно используются форматы сериализации, такие как JSON, Thrift, Protocol Buffers и MessagePack, для сериализации структурированных данных с целью публикации их в качестве полезной нагрузки сообщения. Узлы AMQP обычно используют поля "content-type" и "content-encoding" для передачи этой информации, но это только по соглашению.

версия TL;DR заключается в том, что RabbitMQ ничего не знает о ваших данных или о том, как они форматируются / кодируются. Он обрабатывает ваше сообщение как массив байтов, требуя от вас обработки кодировки.

amqp.node библиотека хочет, чтобы вы передавали буфер, потому что это самый простой способ для Node.js обрабатывать перевод в и из байтового массива, как ожидает RabbitMQ.

Как правильно конвертировать массив таких объектов в буфер, чтобы с другой стороны можно было разобрать обратно.

В вашем производителе сообщений вам необходимо преобразовать данные сообщения в строку JSON (документ), а затем создать из нее буфер.

var data = [ ... ];
var json = JSON.stringify(data);
var buffer = Buffer.from(json);

На стороне потребителя сообщения вы сделали бы обратное, используя сообщение bodyи сначала превратить буфер в строку.

var json = message.body.toString();
var data = JSON.parse(json);

На данный момент ваш data объект должен быть массивом данных, который вы хотите использовать в своем коде Node.js.

Другие вопросы по тегам