2013-10-23 20 views
56

Sto cercando di ottenere la mia funzione per restituire la richiesta HTTP, tuttavia, qualunque cosa faccia, sembra che si perda nella "portata". Sto smesso di nuovo da Node.JS modo che qualsiasi aiuto sarebbe apprezzatoCome ottenere i dati da un http Node.js ottenere la richiesta

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

risposta

88

Naturalmente i log di ritorno undefined: si accede prima che la richiesta è fatto. Il problema non è l'ambito ma asincronicità.

http.request è asincrono, ecco perché richiede una richiamata come parametro. Fai quello che devi fare in callback (quello che si passa a 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(); 
+5

Suggerirei spingere i blocchi in una matrice e quindi utilizzare join ('') alla fine. Ciò eviterà problemi se ci sono molti dati – Eric

+0

Come ottengo il codice di risposta HTTP della risposta (200 o 404 ecc.)? C'è qualche documentazione sulla parola chiave 'on' (response.on), 'data' e 'end'? Sono queste parole chiave? Qui non sembra esserci nulla: https://nodejs.org/api/http.html#http_class_http_serverresponse –

+0

@TylerDurden 'statusCode' è una proprietà dell'oggetto risposta. Non sono riuscito a trovare la documentazione corretta per l'oggetto 'ServerResponse', solo esempi nei documenti per i metodi' get' e 'request'. – Phoca

4

da learnyounode:

var http = require('http') 

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

'opzioni' è l'ospite/percorso variabile

0

Questo è la mia soluzione, anche se di sicuro puoi usare molti moduli che ti danno l'oggetto come una promessa o qualcosa di simile. In ogni caso, ti mancava un altro richiamata

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

da qualche altra parte

getData(function(data){ 
// YOUR CODE HERE!!! 
}) 
+0

sembra non funzionare come callbackData() non è definito come una funzione? –

5

da 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) 
     })) 
    }) 
5

esempio Shorter con http.get:

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