Comment puis-je mettre en mémoire tampon une réponse http à l’aide du module de requête?

Je voudrais convertir une réponse http entrante qui est un stream et stocker les données dans une variable. Je n’ai pas grand-chose à propos des stream de nœuds et j’ai du mal à le faire correctement.

var request = require('request'); request('http://google.com/doodle.png', function (error, response, body) { // buffer the stream response to and a ssortingng variable. }) 

METTRE À JOUR

C’est mon code complet. Mon objective est d’obtenir l’image avec demande et de la stocker dans mongodb. Mais l’image est toujours corrompue. Je pensais que parce que la réponse à la demande était un stream, l’image n’avait été que partiellement sauvegardée et donc corrompue.

 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. }); }) 

Maintenant que vous avez clarifié cette mémoire tampon de requête, la réponse ne vous donne aucune idée de la manière dont je peux enregistrer correctement l’image sans corruption.

Le module de requête met la réponse en mémoire tampon pour vous. Dans le rappel, body est une chaîne (ou Buffer ).

Vous ne récupérez un stream de la demande que si vous ne fournissez pas de rappel; request() renvoie un Stream .

Voir la documentation pour plus de détails et des exemples.


request suppose que la réponse est du texte, elle essaie donc de convertir le corps de la réponse en sring (quel que soit le type MIME). Cela corrompra les données binarys. Si vous souhaitez obtenir les octets bruts, spécifiez un encoding null .

 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. }); }); 
 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' }; 

définir l’encodage sur null, renvoyer Buffer.

Avez-vous essayé de piping cela ?:

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

(Bien que pas assez familier avec Mongo pour savoir s’il supporte les insertions directes de données binarys comme celle-ci, je sais que CouchDB et Riak le font.)

De nos jours, vous pouvez facilement récupérer un fichier en binary avec Node 8, RequestJS et async. J’ai utilisé ce qui suit:

 const buffer = await request.get(pdf.url, { encoding: null }); 

La réponse était un tampon contenant les octets du fichier pdf. Beaucoup plus propre que les gros objects d’option et les anciens callbacks de skool.