Как я могу буферировать ответ HTTP с помощью модуля запроса?
Я хотел бы преобразовать входящий HTTP-ответ, который является потоком, и хранить данные в переменной. Я не очень люблю потоки node, и я изо всех сил стараюсь сделать это правильно.
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.
});
})
Теперь, когда вы уточнили, что запрос буферизует ответ, любая идея о том, как я могу правильно сохранить изображение без повреждения.
Ответы
Ответ 1
Модуль запроса буферизует ответ для вас. В обратном вызове body
есть строка (или Buffer
).
Вы получаете только поток от запроса, если вы не предоставляете обратный вызов; request()
возвращает Stream
.
Подробнее см. документы и примеры.
запрос предполагает, что ответ представляет собой текст, поэтому он пытается преобразовать тело ответа в 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.
});
});
Ответ 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, вернуть буфер.
Ответ 3
Вы пробовали это сделать?:
request.get('http://google.com/doodle.png').pipe(request.put('{your mongo path}'))
(Хотя он не достаточно знаком с Mongo, чтобы узнать, поддерживает ли он прямые вставки двоичных данных, как это, я знаю, CouchDB и Riak do.)