23

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.
    });
})

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

4

4 に答える 4

45

request モジュールは、応答をバッファリングします。コールバックでbody 、文字列 (またはBuffer) です。

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

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


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

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.

    }); 
});
于 2013-01-03T19:33:01.393 に答える
1

これを配管してみましたか?:

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

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

于 2013-01-03T20:15:41.093 に答える
0

最近では、Node 8、RequestJS、および async await を使用して、バイナリでファイルを簡単に取得できます。私は以下を使用しました:

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

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

于 2018-09-11T09:24:08.307 に答える