web-dev-qa-db-fra.com

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

J'essaie de faire en sorte que ma fonction renvoie la demande http get, cependant, quoi que je fasse, elle semble se perdre dans le "champ". Je suis nouveau sur Node.js, toute aide serait la bienvenue

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();

  // These just return undefined and empty
  console.log(req.data);
  console.log(str);
}
71
Daryl Rodrigo

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

http.request est asynchrone, c'est pourquoi il prend un rappel en paramètre. Faites ce que vous devez 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);
    // your code here if you want to use the results !
  });
}

var req = http.request(options, callback).end();
107
Denys Séguret

Exemple plus court utilisant http.get:

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

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

7
ezchx

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)
    }))
})
6
Elise Chant

Ceci est ma solution, bien que vous puissiez certainement utiliser beaucoup de modules qui vous donnent l'objet comme une promesse ou similaire. Quoi qu'il en soit, il vous manquait un autre rappel

function getData(callbackData){
  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);
          callbackData(str);
        });

        //return str;
  }

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

  // These just return undefined and empty
  console.log(req.data);
  console.log(str);
}

ailleurs

getData(function(data){
// YOUR CODE HERE!!!
})
2
ackuser

Exemple de travail simple d’une requête HTTP utilisant un nœud.

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);
        });
        // send the request
       req.end();
    });
}
0
smsivaprakaash

Je pense qu’il est trop tard pour répondre à cette question, mais j’ai rencontré le même problème récemment. Mon cas d’utilisation consistait à appeler l’API JSON paginée, à récupérer toutes les données de chaque pagination et à les ajouter à un seul tableau.

const https = require('https');
const apiUrl = "https://example.com/api/movies/search/?Title=";
let finaldata = [];
let someCallBack = function(data){
  finaldata.Push(...data);
  console.log(finaldata);
};
const getData = function (substr, pageNo=1, someCallBack) {

  let actualUrl = apiUrl + `${substr}&page=${pageNo}`;
  let mydata = []
  https.get(actualUrl, (resp) => {
    let data = '';
    resp.on('data', (chunk) => {
        data += chunk;
    });
    resp.on('end', async () => {
        if (JSON.parse(data).total_pages!==null){
          pageNo+=1;
          somCallBack(JSON.parse(data).data);
          await getData(substr, pageNo, someCallBack);
        }
    });
  }).on("error", (err) => {
      console.log("Error: " + err.message);
  });
}

getData("spiderman", pageNo=1, someCallBack);

Comme @ackuser mentionné, nous pouvons utiliser un autre module, mais dans mon cas d'utilisation, je devais utiliser le noeud https. En espérant que cela aidera les autres.

0
Vaibhav Rai