Pobieranie zawartości binarnej w Node.js przy użyciu request

135

Próbowałem GETużyć danych binarnych requesti miałem coś takiego:

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

Ale bodyzawsze o kilka bajtów różniło się od oczekiwanego. Po dalszych badaniach odkryłem, że requestzałożono, że bodyjest to łańcuch i zastąpiłem wszystkie bajty inne niż Unicode.

Próbowałem dodać

encoding: 'binary'

do requestSettingsale to nie pomogło.

Jak mogę uzyskać dane binarne?

GilZ
źródło

Odpowiedzi:

300

OK, po wielu kopaniu okazało się, że requestSettingspowinno mieć:

encoding: null

A następnie bodybędzie typu Bufferzamiast domyślnego, którym jest ciąg.

GilZ
źródło
50
Co za absurdalny koszmar. Polowanie na to zajęło mi 12 godzin. Wygląda na to, że moduł Node Request domyślnie traktuje przychodzące dane w treści odpowiedzi jako UTF-8 i automatycznie konwertuje wszelkie sekwencje bajtów inne niż UTF-8 na niepotrzebne (ale prawidłowe UTF-8) znaki. Nie działa żadna ilość ustawień „typ MIME” itp. (Nie tak, że ma to działać w przypadku danych odpowiedzi ). Jest encoding: nullto jedyna opcja, która działa. I - bardzo słabo udokumentowana. W dokumentacji żądania węzła powinno być oczywiste ostrzeżenie o tym, jak aby pobrać czyste dane binarne. Dzięki!
Dan Nissenbaum
2
@StoyanBerov, cieszę się, że ta odpowiedź była pomocna, ale w ciągu 5 lat, odkąd napisałem tę odpowiedź, pakiet readme został poprawiony, aby wyróżnić to rozwiązanie w kilku miejscach. Ponadto bardzo polecam używanie pakietu obsługującego Promises zamiast tego pakietu.
GilZ
@Gilz, dzięki za aktualizację! Właściwie odniosłem wrażenie, że kodowanie jest domyślnie ustawione na zero. Problem pojawił się również w starszym projekcie, ustawionym na bardzo starą wersję węzła i wszędzie tam tylko wywołania zwrotne.
Stoyan Berov
Wpadłem na to ponownie - nie używałem tego od wieków. Kodowanie: null na ratunek
Pyro
0

Zaakceptowana odpowiedź nie rozwiązała mojego problemu. Jakoś pomyślałem, że to gzip: truezadziałało.

gismatthew
źródło