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

在这种情况下,使用 Buffer/streams 的最佳方式是什么?

4

4 回答 4

45

请求模块为您缓冲响应。在回调中,body 一个字符串(或Buffer)。

如果您不提供回调,则只能从请求中返回流;request() 返回一个 Stream

有关更多详细信息和示例,请参阅文档。


request 假定响应是文本,因此它会尝试将响应正文转换为 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.

    }); 
});
于 2013-01-03T19:33:01.393 回答
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'
};

设置编码为null,返回Buffer。

于 2014-12-07T03:22:09.793 回答
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 和异步等待轻松检索二进制文件。我使用了以下内容:

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

响应是一个包含 pdf 字节的缓冲区。比大选项对象和旧的 skool 回调要干净得多。

于 2018-09-11T09:24:08.307 回答