105 votes

Comment obtenir des données d'une requête http get Node.js

Je suis en train d'essayer de faire en sorte que ma fonction renvoie la requête http get, cependant, quoi que je fasse, il semble se perdre dans la portée. Je suis assez nouveau dans Node.js donc toute aide serait appréciée

function getData(){
  var http = require('http');
  var str = '';

  var options = {
        host: 'www.random.org',
        path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
  };

  callback = function(response) {

        response.on('data', function (chunk) {
              str += chunk;
        });

        response.on('end', function () {
              console.log(str);
        });

        //return str;
  }

  var req = http.request(options, callback).end();

  // Ces lignes renvoient simplement undefined et vide
  console.log(req.data);
  console.log(str);
}

135voto

dystroy Points 145126

Bien sûr, vos journaux renvoient undefined : vous enregistrez avant que la requête ne soit terminée. Le problème n'est pas la portée mais l'asynchronicité.

http.request est asynchrone, c'est pourquoi il prend un rappel en tant que paramètre. Faites ce que vous avez à faire dans le rappel (celui que vous passez à response.end):

callback = function(response) {

  response.on('data', function (chunk) {
    str += chunk;
  });

  response.on('end', function () {
    console.log(req.data);
    console.log(str);
    // votre code ici si vous voulez utiliser les résultats !
  });
}

var req = http.request(options, callback).end();

34voto

smsivaprakaash Points 142

Exemple de travail simple de demande HTTP en utilisant node.

const http = require('https')

httprequest().then((data) => {
        const response = {
            statusCode: 200,
            body: JSON.stringify(data),
        };
    return response;
});
function httprequest() {
     return new Promise((resolve, reject) => {
        const options = {
            host: 'jsonplaceholder.typicode.com',
            path: '/todos',
            port: 443,
            method: 'GET'
        };
        const req = http.request(options, (res) => {
          if (res.statusCode < 200 || res.statusCode >= 300) {
                return reject(new Error('statusCode=' + res.statusCode));
            }
            var body = [];
            res.on('data', function(chunk) {
                body.push(chunk);
            });
            res.on('end', function() {
                try {
                    body = JSON.parse(Buffer.concat(body).toString());
                } catch(e) {
                    reject(e);
                }
                resolve(body);
            });
        });
        req.on('error', (e) => {
          reject(e.message);
        });
        // envoyer la demande
       req.end();
    });
}

22voto

Oded Breiner Points 1852

Exemple plus court en utilisant http.get:

require('http').get('http://httpbin.org/ip', (res) => {
    res.setEncoding('utf8');
    res.on('data', function (body) {
        console.log(body);
    });
});

12voto

ezchx Points 672

De learnyounode:

var http = require('http')  

http.get(options, function (response) {  
  response.setEncoding('utf8')  
  response.on('data', console.log)  
  response.on('error', console.error)  
})

'options' est la variable hôte/chemin

9voto

Elise Chant Points 359

De learnyounode :

var http = require('http')
var bl = require('bl')

http.get(process.argv[2], function (response) {
    response.pipe(bl(function (err, data) {
        if (err)
            return console.error(err)
        data = data.toString()
        console.log(data)
    }))
})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X