Подтвердить что ты не робот

Как я могу буферировать ответ 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.

    });

})

Теперь, когда вы уточнили, что запрос буферизует ответ, любая идея о том, как я могу правильно сохранить изображение без повреждения.

4b9b3361

Ответ 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.)