2016-01-31 65 views
1

我做HTTPS請求是這樣的:如何知道什麼時候收到所有塊

var req = https.request(options, function (res) { 
    console.log('statusCode: ', res.statusCode); 
    console.log('headers: ', res.headers); 

    res.on('data', function (d) { 
     // how to know when all chunks are received 
     process.stdout.write(d); 
    }); 
}); 
req.end(); 

響應之際,JSON對象,但我把它在我的回調緩衝陣列和多塊(我回調被多次調用)。我如何知道何時收到所有塊?那麼如何將這個數組緩衝區轉換成JSON對象呢?

+1

'res.on('end',blah)'? – AdityaParab

+0

謝謝,你是否建議我將'data'回調中的所有數據寫入某個變量,然後在'end'回調中,我將該變量的數組緩衝區轉換爲json? –

+1

這將是最受歡迎的方式,除非您有某些要求必須將數據塊按塊歸入標準輸出。 :) 此外,使用回調函數作爲參數,然後使用接收到的數據在'.on('end')'中調用該回調函數是一種很好的做法。 – AdityaParab

回答

2

按照評論要求回答。

首先是將您的代碼封裝在另一個函數中。

function getHttpsData(callback){ // pass additional parameter as callback 
    var req = https.request(options, function (res) { 
     console.log('statusCode: ', res.statusCode); 
     console.log('headers: ', res.headers); 
     var response = ''; 

     res.on('data', function (d) { 
      // how to know when all chunks are received 
      //process.stdout.write(d); 
      response+=d; 
     }); 
     res.on('end', function(){ 
      var r = JSON.parse(response); 
      callback(r); // Call the callback so that the data is available outside. 
     }); 

    }); 
    req.end(); 
    req.on('error', function(){ 
     var r = {message:'Error'}; // you can even set the errors object as r. 
     callback(r); 
    }); 
} 

然後用callback函數作爲參數調用getHttpsData函數。

getHttpsData(function(data){ 
    console.log(data);//data will be whatever you have returned from .on('end') or .on('error') 
}); 
+0

堅實的答案,儘管我建議或者a)遵循具有單獨的'success'和'error'回調函數的'node'約定,否則我會跳過回調並去用Promises代替。 –

+0

@JeremyJStarcher:謝謝!我會更新答案以反映這些事情。 :) – AdityaParab

相關問題