我想将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.
});
})
在这种情况下,使用缓冲区/流的最佳方法是什么?
答案 0 :(得分:39)
请求模块为您缓冲响应。在回调中,body
是一个字符串(或Buffer
)。
如果您不提供回叫,则只会从请求中获得一个流; request()
返回一个Stream
。
See the docs for more detail and examples.
请求假定响应是文本,因此它尝试将响应主体转换为sring(无论MIME类型如何)。这将破坏二进制数据。如果要获取原始字节,请指定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.
});
});
答案 1 :(得分:2)
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'
};
将encoding设置为null,返回Buffer。
答案 2 :(得分:1)
你试过管道吗?:
request.get('http://google.com/doodle.png').pipe(request.put('{your mongo path}'))
(虽然对Mongo不太熟悉,知道它是否支持像这样直接插入二进制数据,但我知道CouchDB和Riak会这样做。)
答案 3 :(得分:0)
如今,您可以使用Node 8,RequestJS和async等待来轻松检索二进制文件。我使用了以下内容:
const buffer = await request.get(pdf.url, { encoding: null });
响应是一个包含pdf字节的Buffer。比大选项对象和旧的skool回调要干净得多。