web-dev-qa-db-fra.com

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 flux et stocker les données dans une variable. Je n’ai pas grand-chose à propos des flux 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 string variable.   
})

METTRE À JOUR

C'est mon code complet. Mon objectif 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 flux, 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.

19
jamjam

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 flux de la demande que si vous ne fournissez pas de rappel; request()retourne a 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 binaires. Si vous souhaitez obtenir les octets bruts, spécifiez une 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.

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

2
DenoFiend

De nos jours, vous pouvez facilement récupérer un fichier en binaire 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 objets d'option et les anciens rappels de skool.

0
Jaap Weijland

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 binaires comme celle-ci, je sais que CouchDB et Riak le font.)

0
7zark7