2011-06-13 17 views
5

Quiero sacar publicaciones de la pared de Facebook de un usuario.Node.js https.request with keep-alive header

El siguiente fragmento de código funciona, pero nunca termina:

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

Creo que es causada por la cabecera 'Connection':'keep-alive'. Cuando lo reemplazo con 'Connection':'close', el script finalizará cuando todos los datos se hayan recuperado de Facebook.

Espero poder utilizar el encabezado keep-alive para evitar tener que crear una nueva conexión SSL para cada solicitud. Tengo miles de solicitudes y con el encabezado keep-alive, se completa en solo unos segundos, en lugar de unos pocos minutos sin el encabezado Keep-alive.

¿Alguien sabe cómo lograr esto? Soy bastante nuevo en Node.JS, así que si me falta algo obvio, me disculpo.

Respuesta

0

Tienes que hacer lo siguiente:

1) Poner response.on ('final', function() {... hacer la salida ...}); para https.request No generar datos en response.on ('data', ...);

2) Use Connection: keep-alive, "cerrar" causará problemas de rendimiento muy pobres. He hecho muchas pruebas y puedo confirmar esto.

Aparte de eso:

3) En las opciones, establezca el agente, y establecer agent.maxSockets a un número mayor si necesita la concurrencia. el valor predeterminado es solo 5.

4) Debería considerar realizar su propia rutina para manejar https.request timeout. (Vaya a github/joyent y búsquelo. básicamente use setTimeout para emitir un error de tiempo de espera).