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?

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.