如何使用请求模块缓冲http响应?

jam*_*jam 20 stream request node.js

我想转换传入的http响应,它是一个流并将数据存储在一个变量中.我对节点流并不多,我正在努力做到这一点.

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.
    });
})
Run Code Online (Sandbox Code Playgroud)

UPDATE

这是我的完整代码.我的目标是通过请求获取图像并将其存储在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.
    });
})
Run Code Online (Sandbox Code Playgroud)

既然你已经澄清了请求缓冲区的响应,那就是我如何正确保存图像而不会损坏.

jos*_*736 40

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

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

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


请求假定响应是文本,因此它尝试将响应主体转换为sring(无论MIME类型如何).这将破坏二进制数据.如果要获取原始字节,请指定a 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.

    }); 
});
Run Code Online (Sandbox Code Playgroud)

  • 哇。谢谢你,它成功了。这让我发疯了这么久。 (2认同)
  • thx 这有效,但我看到当传递“编码:空”时,在回调中,主体是缓冲区而不是字符串。对我来说,这是这样做的主要原因。 (2认同)