Abrufen von binären Inhalten in Node.js mithilfe von request

135

Ich habe versucht, GETBinärdaten mit zu verwenden request, und hatte so etwas wie:

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

War bodyaber immer ein paar Bytes anders als erwartet. Nach weiteren Untersuchungen stellte ich fest, dass requestangenommen bodywird , dass es sich um eine Zeichenfolge handelt, und ersetzte alle Nicht-Unicode-Bytes.

Ich habe versucht hinzuzufügen

encoding: 'binary'

zu requestSettingsaber es hat nicht geholfen.

Wie kann ich die Binärdaten erhalten?

GilZ
quelle

Antworten:

300

OK, nach vielem Graben fand ich heraus, dass requestSettingsdas haben sollte:

encoding: null

Und dann bodywird es vom Typ sein Buffer, anstelle der Standardeinstellung, die Zeichenfolge ist.

GilZ
quelle
50
Was für ein absurder Albtraum. Ich habe 12 Stunden gebraucht, um das zu jagen. Es scheint, dass das Knotenanforderungsmodul eingehende Daten im Inhalt der Antwort standardmäßig als UTF-8 behandelt und alle Nicht-UTF-8-Byte-Sequenzen automatisch in Junk-Zeichen (aber gültige UTF-8-Zeichen) konvertiert. Es funktioniert keine Einstellung von 'Mimetyp' usw. (nicht, dass dies für Antwortdaten vorgesehen ist ). Dies encoding: nullist die einzige Option, die funktioniert. Und - sehr schlecht dokumentiert. In der Node Request-Dokumentation sollte eine offensichtliche Warnung darüber enthalten sein, wie um reine Binärdaten abzurufen. Danke!
Dan Nissenbaum
2
@StoyanBerov, ich bin froh, dass Sie diese Antwort hilfreich fanden, aber in den 5 Jahren, seit ich diese Antwort geschrieben habe, wurde die Paket-Readme-Datei korrigiert, um diese Lösung an mehreren Stellen hervorzuheben. Darüber hinaus empfehle ich dringend, anstelle dieses Pakets ein Paket zu verwenden, das Promises unterstützt.
GilZ
@ Gilz, danke für das Update! Ich hatte tatsächlich den Eindruck, dass die Codierung standardmäßig auf null gesetzt ist. Das Problem trat auch bei einem Legacy-Projekt auf, das auf eine super alte Knotenversion und überall nur Rückrufe eingestellt war.
Stoyan Berov
Bin wieder darauf gestoßen - habe das seit Ewigkeiten nicht mehr benutzt. Kodierung: null zur Rettung
Pyro
0

Die akzeptierte Antwort hat mein Problem nicht gelöst. Ich dachte irgendwie, dass das gzip: truefunktioniert.

Gismatthew
quelle