node-superagent responseType('blob') vs. buffer(true)

голоса
0

В связи с дезагрегацией запроса, в настоящее время мы переписываем службу запросов в нашем приложении для узлов с суперагентом. Пока все выглядит нормально, однако мы не совсем уверены, как запросить двоичные данные/октет-поток и обработать фактическое тело ответа как aBuffer. В соответствии с документами (на стороне клиента), следует использовать

superAgentRequest.responseType('blob');

которая, кажется, прекрасно работает на NodeJS, но я также нашел эту проблему с гитубом, где они используют

superAgentRequest.buffer(true);

что работает так же хорошо. Поэтому мне интересно, какой метод предпочтительнее запрашивать бинарные данные в NodeJS?

Задан 22/05/2020 в 16:51
источник пользователем
На других языках...                            


2 ответов

голоса
0

Согласно документации https://visionmedia.github.io/superagent/

SuperAgent будет анализировать известные данные ответного тела для вас, в настоящее время поддерживает приложения/x-www-form-urlencoded, приложения/json, и многочастичные/form-данные. Вы можете настроить автоматический парсинг и для других данных ответных тел:

Вы можете установить пользовательский синтаксический анализатор (который имеет приоритет над встроенными синтаксическими анализаторами) с помощью метода .buffer(true).parse(fn). Если буферизация ответа не включена (.buffer(false)), то событие ответа будет выдано без ожидания завершения синтаксического анализатора тела, поэтому response.body не будет доступен.

Поэтому для разбора других типов ответов, вам нужно будет установить .buffer(true).parse(fn). Но если вы не хотите разобрать ответ, то нет необходимости устанавливать buffer(true).

Ответил 30/05/2020 в 00:35
источник пользователем

голоса
0

В responseTypeсоответствии с исходным кодом суперагента, установка bufferфлага в true, т.е. то же самое, что и установка вручную в true.

В случае работы с двоичными потоками данных/октетов используется парсер двоичных данных, который на самом деле является простым буфером:

module.exports = (res, fn) => {
  const data = []; // Binary data needs binary storage

  res.on('data', chunk => {
    data.push(chunk);
  });
  res.on('end', () => {
    fn(null, Buffer.concat(data));
  });
};

В обоих случаях используется этот синтаксический анализатор, который объясняет поведение. Таким образом, не имеет значения, что вы используете для работы с бинарными данными/октетовыми потоками.

Ответил 03/06/2020 в 15:59
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more