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.
});
})
この場合にバッファ/ストリームを使用する最良の方法は何ですか?
要求モジュールは、応答をバッファーに入れます。コールバックでは、body
is文字列(または Buffer
)です。
コールバックを提供しない場合のみ、リクエストからストリームが返されます。 request()
戻り値a 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.
});
});
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を返します。
これを試してみましたか?:
request.get('http://google.com/doodle.png').pipe(request.put('{your mongo path}'))
(Mongoは、このようなバイナリデータの直接挿入をサポートするかどうかについては十分に詳しくありませんが、CouchDBとRiakは知っています。)
現在、Node 8、RequestJSおよびasync awaitを使用すると、バイナリでファイルを簡単に取得できます。私は次のように使用しました:
const buffer = await request.get(pdf.url, { encoding: null });
応答は、PDFのバイトを含むバッファでした。大きなオプションオブジェクトや古いskoolコールバックよりもはるかにクリーンです。