2012-06-05 12 views
8

Sto utilizzando node.js 0.6.18 e il codice seguente rende node.js chiusa la connessione TCP tra due richieste (verificata con strace su Linux). Come faccio a rendere node.js riutilizzare la stessa connessione TCP per più richieste HTTP (ad esempio keep-alive)? Si prega di notare che il server web è in grado di keep-alive, funziona con altri client. Il server Web restituisce una risposta HTTP Chunked.Come inviare richieste consecutive con HTTP keep-alive in node.js?

var http = require('http'); 
var cookie = 'FOO=bar'; 
function work() { 
    var options = { 
     host: '127.0.0.1', 
     port: 3333, 
     path: '/', 
     method: 'GET', 
     headers: {Cookie: cookie}, 
    }; 
    process.stderr.write('.') 
    var req = http.request(options, function(res) { 
    if (res.statusCode != 200) { 
     console.log('STATUS: ' + res.statusCode); 
     console.log('HEADERS: ' + JSON.stringify(res.headers)); 
     process.exit(1) 
    } 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) {}); 
    res.on('end', function() { work(); }); 
    }); 
    req.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
    process.exit(1); 
    }); 
    req.end(); 
} 
work() 
+0

erano si in grado di capire mai questo fuori ? –

+0

no, non conosco la risposta – pts

+7

si potrebbe voler essere consapevoli del fatto che chiamare work() creerà una perdita di memoria dello stack. Questo perché ogni evento finale aggiungerà una nuova chiamata a work(), senza mai rilasciare lo stack a meno che l'evento finale di ogni chiamata non sia completo. Per ovviare a questo, è possibile spostare work() fuori ambito chiamando "process.nextTick (lavoro);". Ciò consentirà l'interruzione della portata del gestore finale. – thesmart

risposta

9

sono stato in grado di arrivare a questo lavoro (verificato con strace) creando un http.Agent e impostando la proprietà maxSockets a 1. Non so se questo è il modo ideale per farlo; tuttavia, soddisfa i requisiti. Una cosa che ho notato è che ciò che i documenti richiedevano sul comportamento di http.Agent non descriveva esattamente come funzionava nella pratica. Codice qui sotto:

var http = require('http'); 
var cookie = 'FOO=bar'; 
var agent = new http.Agent; 
agent.maxSockets = 1; 

function work() { 
    var options = { 
     host: '127.0.0.1', 
     port: 3000, 
     path: '/', 
     method: 'GET', 
     headers: {Cookie: cookie}, 
     agent: agent 
    }; 
    process.stderr.write('.') 
    var req = http.request(options, function(res) { 
    if (res.statusCode != 200) { 
     console.log('STATUS: ' + res.statusCode); 
     console.log('HEADERS: ' + JSON.stringify(res.headers)); 
     process.exit(1) 
    } 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) {}); 
    res.on('end', function() { work(); }); 
    }); 
    req.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
    process.exit(1); 
    }); 
    req.end(); 
} 
work() 

EDIT: Vorrei aggiungere che ho fatto il mio test con node.js v0.8.7

+0

Forse non riguarda esattamente la domanda principale, ma il tuo codice ha risolto il mio problema. Stavo provando a impostare un cookie e a fare riferimento "direttamente" alle opzioni, ma ora lo imposto sulle intestazioni: {} e so che la mia richiesta htttp/get/cookies funziona correttamente. Grazie! – user1321759

1

si può semplicemente impostare:

http.globalAgent.keepAlive = true 
Problemi correlati