2011-06-13 49 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来发出超时错误)。