2011-06-13 50 views
5

我想從用戶Facebook牆上拉帖子。帶保持活動標頭的Node.js https.request

下面的代碼片段工作,但它永遠不會終止:

var https = require('https'); 

facebookWall = function(user) { 
    var options = { 
    host: 'graph.facebook.com', 
    port: 443, 
    path: '/me/home?access_token=' + user.facebook_token + '&since=' + encodeURIComponent(user.facebook_timestamp), 
    method: 'GET', 
    headers: { 
     'Connection':'keep-alive' 
    } 
    }; 

    var req = https.request(options) 
    .on('response', function(response) { 
    var body = ''; 
    response.on('data', function(data) { 
     body += data; 
     try { 
     var wallPosts = JSON.parse(body); 
     console.log("user " + user.id + " has " + wallPosts.data.length + " new items on their wall"); 
     } 
     catch (e) { 
     //console.log("waiting for more data chunks..."); 
     } 
    }) 
    }); 
    req.end(); 

    req.on('error', function(e) { 
    console.error(e); 
    }); 
} 

我認爲這是由'Connection':'keep-alive'頭引起的。當我將其替換爲'Connection':'close'時,腳本將在所有數據從facebook中檢索時終止。

我希望能夠使用keep-alive頭來防止爲每個請求創建一個新的SSL連接。我有成千上萬的請求和keep-alive頭文件,它在幾秒鐘內完成,而不是幾分鐘沒有keep-alive頭文件。

有誰知道如何做到這一點?我對Node.JS相當陌生,所以如果我錯過了一些明顯的東西,我很抱歉。

回答

0

你必須做到以下幾點:

1)把response.on( '端',函數(){...做...輸出});對於https.request 不要在response.on('data',...)中輸出數據;

2)使用Connection:keep-alive,「close」會導致非常差的性能問題。我做了很多測試,我可以證實這一點。

除此之外:

3)在你的選擇中,設置代理,如果你需要併發設置agent.maxSockets到一個更大的數字。默認是隻有5.

4)你應該考慮做你自己的例程來處理https.request超時。 (請到github/joyent並搜索它,基本上使用setTimeout來發出超時錯誤)。