2013-01-03 7 views
18

Vorrei convertire una risposta HTTP in arrivo che è un flusso e memorizzare i dati in una variabile. Non mi preoccupo molto dei flussi di nodi e sto lottando per farlo correttamente.Come posso bufferizzare una risposta http utilizzando il modulo di richiesta?

var request = require('request'); 

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

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

UPDATE

Questo mio codice completo. Il mio obiettivo è ottenere l'immagine con richiesta e memorizzarla in mongodb. Ma l'immagine è sempre corrotta. Ho pensato che la risposta alla richiesta era un flusso, l'immagine era stata solo parzialmente salvata e quindi la corruzione.

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. 

    }); 

}) 

Ora che avete chiarito che la richiesta del buffer è la risposta alcuna idea su come posso salvare correttamente l'immagine senza corruzione.

risposta

33

Il modulo di richiesta memorizza la risposta per voi. Nella richiamata, bodyè una stringa (o Buffer).

Si ottiene uno stream di ritorno dalla richiesta solo se non si fornisce una richiamata; request()restituisce a Stream.

See the docs for more detail and examples.


richiesta presuppone che la risposta è testo, quindi tenta di convertire il corpo di risposta in una sring (indipendentemente dal tipo MIME). Questo corromperà i dati binari. Se si desidera ottenere i byte non elaborati, specificare 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

Grazie per la calibrazione. Ho aggiornato la mia domanda. Si prega di vedere se è possibile espandere la risposta. – jamjam

+0

Aggiornato. – josh3736

+0

Wow. Grazie, ha funzionato. Questo mi sta facendo impazzire da così tanto tempo. – jamjam

0

Hai provato una pipe questo ?:

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

(Anche se non abbastanza familiarità con Mongo per sapere se supporta inserti dirette di dati binari come questo, lo so CouchDB e Riak fanno.)

+0

Grazie ma non voglio usare la pipe. È possibile eseguire lo streaming direttamente in mongodb, ma ciò significa che dovrò utilizzare Gridfs che voglio evitare. – jamjam

+0

Questo è Rest HTTP, ma è possibile reindirizzare anche a un file locale: 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' 
}; 

imposta la codifica su null, restituisce Buffer.

Problemi correlati