2013-10-23 151 views
56

我試圖讓我的函數返回http get請求,但是,無論我做什麼,它似乎都迷失在?作用域中。我不幹新Node.js加載所以任何幫助,將不勝感激如何從Node.js http獲取請求中獲取數據

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

回答

88

當然你的日誌返回undefined:登錄請求之前完成。問題不在範圍,但異步性

http.request是異步的,這就是爲什麼它需要一個回調參數。你有在回調做(傳遞給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

我建議推把這個塊放入一個數組然後用join( '') 到底。如果有大量數據,這將避免問題 – Eric

+0

如何獲取響應的HTTP響應代碼(200或404等)?是否有關於'on'(response.on),'data'和'end'的關鍵字的文檔?這些關鍵字是?這裏似乎沒有什麼:https://nodejs.org/api/http.html#http_class_http_serverresponse –

+0

@TylerDurden'statusCode'是響應對象的一個​​屬性。我無法找到適用於'ServerResponse'對象的文檔,只是'get'和'request'方法文檔中的示例。 – Phoca

4

從learnyounode:

var http = require('http') 

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

'選項' 是主機/路徑變量

0

這是我的解決方案,雖然肯定你可以使用很多模塊,將你的對象作爲承諾或類似的東西。無論如何,你失蹤另一個回調

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

其他

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

這似乎不工作,因爲callbackData()沒有被定義爲一個函數? –

5

從某處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

較短例如使用http.get:

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