web-dev-qa-db-ja.com

リクエストモジュールを使用してHTTPレスポンスをバッファする方法

HTTP応答のコンテンツを変数にストリーミングしたいと思います。私の目標は、request()を介して画像を取得し、MongoDBに保存することですが、画像は常に破損しています。

これは私のコードです:

request('http://google.com/doodle.png', function (error, response, body) {
    image = new Buffer(body, 'binary');
    db.images.insert({ filename: 'google.png', imgData: image}, function (err) {
        // handle errors etc.
    });
})

この場合にバッファ/ストリームを使用する最良の方法は何ですか?

21
jamjam

要求モジュールは、応答をバッファーに入れます。コールバックでは、bodyis文字列(または Buffer )です。

コールバックを提供しない場合のみ、リクエストからストリームが返されます。 request()戻り値a Stream

詳細と例については、ドキュメントを参照してください。


requestは応答がテキストであることを前提としているため、(MIMEタイプに関係なく)応答本体をsringに変換しようとします。これにより、バイナリデータが破損します。生のバイトを取得する場合は、nullencodingを指定します。

request({url:'http://google.com/doodle.png', encoding:null}, function (error, response, body) {
    db.images.insert({ filename: 'google.png', imgData: body}, function (err) {

        // handle errors etc.

    }); 
});
41
josh3736
var options = {
    headers: {
        'Content-Length': contentLength,
        'Content-Type': 'application/octet-stream'
    },
    url: 'http://localhost:3000/lottery/lt',
    body: formData,
    encoding: null, // make response body to Buffer.
    method: 'POST'
};

エンコーディングをnullに設定し、Bufferを返します。

2
DenoFiend

これを試してみましたか?:

request.get('http://google.com/doodle.png').pipe(request.put('{your mongo path}'))

(Mongoは、このようなバイナリデータの直接挿入をサポートするかどうかについては十分に詳しくありませんが、CouchDBとRiakは知っています。)

1
7zark7

現在、Node 8、RequestJSおよびasync awaitを使用すると、バイナリでファイルを簡単に取得できます。私は次のように使用しました:

const buffer = await request.get(pdf.url, { encoding: null }); 

応答は、PDFのバイトを含むバッファでした。大きなオプションオブジェクトや古いskoolコールバックよりもはるかにクリーンです。

0
Jaap Weijland