2013-01-03 51 views
18

我会转换传入的http响应,它是一个流并将数据存储在变量中。我对节点流的了解不多,而我正在努力做到这一点。如何使用请求模块缓冲http响应?

var request = require('request'); 

request('http://google.com/doodle.png', function (error, response, body) { 

    // buffer the stream response to and a string variable. 
}) 

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. 

    }); 

}) 

既然已经明确了请求缓冲区这是响应我如何能妥善保存图像没有腐败的想法。

回答

33

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

如果您不提供回调,您只会从请求中获取流; request()返回 a Stream

See the docs for more detail and examples.


请求假定响应是文本,所以它试图响应主体转换成SRING(不管MIME类型)。这会破坏二进制数据。如果您想获取原始字节,请指定一个nullencoding

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

感谢您的介绍。我更新了我的问题。请看看你是否可以扩大你的答案。 – jamjam

+0

已更新。 – josh3736

+0

哇。谢谢,它工作。这让我坚持了这么久。 – jamjam

0

您是否尝试过这个管道?:

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

(虽然不够熟悉蒙戈知道它是否支持这样的二进制数据的直接插入,我知道CouchDB的和做了Riak)

+0

谢谢,但我不想使用管道。可以直接流入MongoDB,但这意味着我将不得不使用我想避免的Gridfs。 – jamjam

+0

这是HTTP Rest,但您也可以管道到本地文件:https://github.com/mikeal/request#streaming – 7zark7

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。