Получение бинарного контента в Node.js с использованием запроса

136

Я пытался GETиспользовать двоичные данные request, и было что-то вроде:

var requestSettings = {
    method: 'GET',
    url: url,
};
request(requestSettings, function(error, response, body) {
    // Use body as a binary Buffer
}

Но bodyвсегда было несколько байтов, отличных от ожидаемых. После дальнейшего изучения я обнаружил, что requestпредполагается , что bodyэто строка, и заменил все байты, не относящиеся к Юникоду.

Я пытался добавить

encoding: 'binary'

до , requestSettingsно это не помогло.

Как я могу получить двоичные данные?

GilZ
источник

Ответы:

301

Хорошо, после долгих раскопок я обнаружил, что requestSettingsдолжен иметь:

encoding: null

И тогда bodyбудет иметь тип Buffer, а не по умолчанию, который является строкой.

GilZ
источник
51
Какой абсурдный кошмар. Мне понадобилось 12 часов, чтобы выследить это. Кажется, что модуль Node Request по умолчанию обрабатывает входящие данные в содержимом ответа как UTF-8 и автоматически преобразует любые байтовые последовательности, отличные от UTF-8, в ненужные (но действительные UTF-8) символы. Никакая настройка «mimetype» и т. Д. Не работает (не то, что предполагается для данных ответа ). Это encoding: nullединственный вариант, который работает. И - очень плохо документирован. В документации Node Request должно быть явное предупреждение о том, как чтобы получить чистые двоичные данные. Спасибо!
Дан Ниссенбаум
2
@StoyanBerov, я рад, что вы нашли этот ответ полезным, но за 5 лет с тех пор, как я написал этот ответ, пакет readme был исправлен, чтобы выделить это решение в нескольких местах. Кроме того, я настоятельно рекомендую использовать пакет, который поддерживает Promises вместо этого пакета.
GilZ
@Gilz, спасибо за обновление! На самом деле у меня сложилось впечатление, что кодировка по умолчанию имеет значение null. Кроме того, проблема возникла в унаследованном проекте, где была установлена ​​супер старая версия узла и только обратные вызовы.
Стоян Беров
Столкнулся с этим снова - не использовал это целую вечность. Кодировка: null на помощь
Pyro
0

Принятый ответ не решил мою проблему. Я как-то понял, что gzip: trueсработало.

gismatthew
источник