リクエストを使用してNode.jsのバイナリコンテンツを取得する


135

私はGETを使用してバイナリデータを試してrequestいましたが、次のようなものがありました:

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

しかし、body常に予想と異なる数バイトでした。さらに調査した結果、request想定されているのbodyは文字列であり、すべての非Unicodeバイトが置き換えられていることがわかりました。

追加しようとした

encoding: 'binary'

requestSettingsしかしそれは助けにはならなかった。

バイナリデータを取得するにはどうすればよいですか?

回答:


300

OK、たくさん掘り下げた後、私はそれrequestSettingsが持っているべきであることがわかりました:

encoding: null

そして、文字列であるデフォルトの代わりに、bodyタイプBufferになります。


50
なんてばかげた悪夢。これを追い詰めるのに12時間かかった。Node Requestモジュールは、デフォルトでは、応答のコンテンツの着信データをUTF-8として扱い、非UTF-8バイトシーケンスをジャンク(ただし有効なUTF-8)文字に自動的に変換するようです。「mimetype」などの設定は機能しません(応答データ用に想定されいるものではありません)。これencoding: nullが機能する唯一のオプションです。また、文書化が不十分です。ノードリクエストのドキュメントに、純粋なバイナリデータを取得するために感謝します!
Dan Nissenbaum

2
@StoyanBerov、この回答が役に立ったとうれしいですが、この回答を書いてから5年間で、パッケージのreadmeが修正され、このソリューションがいくつかの場所で強調されました。また、このパッケージの代わりにPromiseをサポートするパッケージを使用することを強くお勧めします。
GilZ、

@ギルツ、更新ありがとうございます!実際には、エンコーディングがデフォルトでnullに設定されているという印象を受けました。また、この問題はレガシープロジェクトで発生し、非常に古いノードバージョンに設定され、どこでもコールバックのみになりました。
Stoyan Berov

再びそれに遭遇しました-これを年齢で使用していません。エンコード:救助にヌル
Pyro

0

受け入れられた答えは私の問題を解決しませんでした。私はどういうわけかそれがgzip: trueうまくいったと考えました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.