2012-06-05 22 views
8

Tôi đang sử dụng node.js 0.6.18 và mã sau làm cho node.js đóng kết nối TCP giữa hai yêu cầu (được xác minh bằng strace trên Linux). Làm cách nào để làm cho node.js tái sử dụng cùng một kết nối TCP cho nhiều yêu cầu HTTP (tức là giữ nguyên)? Xin lưu ý rằng các máy chủ web có khả năng giữ sống, nó hoạt động với các khách hàng khác. Máy chủ web trả về một phản hồi HTTP chunked.Làm thế nào để gửi các yêu cầu liên tiếp với HTTP giữ nguyên trong 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

là bạn có thể bao giờ con số này ra ? –

+0

không, tôi không biết câu trả lời – pts

+7

bạn có thể muốn biết rằng công việc gọi() sẽ tạo ra rò rỉ bộ nhớ ngăn xếp. Điều này là do mọi sự kiện kết thúc sẽ thêm một cuộc gọi mới vào công việc(), không bao giờ phát hành ngăn xếp trừ khi mọi sự kiện kết thúc của cuộc gọi hoàn tất. Để giải quyết vấn đề này, bạn có thể muốn đẩy công việc ra khỏi phạm vi bằng cách gọi "process.nextTick (công việc);". Điều này sẽ cho phép phạm vi của trình xử lý kết thúc chấm dứt. – thesmart

Trả lời

9

tôi đã có thể có được điều này để làm việc (xác minh với strace) bằng cách tạo ra một http.Agent và thiết lập thuộc tính maxSockets của nó để 1. Tôi không biết nếu điều này là cách lý tưởng để làm điều đó; tuy nhiên, nó đáp ứng các yêu cầu. Một điều mà tôi đã thông báo là những gì các tài liệu tuyên bố về hành vi http.Agent không mô tả chính xác cách thức hoạt động của nó trong thực tế. Mã bên dưới:

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: Tôi nên thêm rằng tôi đã làm thử nghiệm của tôi với Node.js v0.8.7

+0

Có thể nó không quan tâm chính xác về câu hỏi hàng đầu nhưng mã của bạn đã giải quyết được vấn đề của tôi. Tôi đã cố gắng thiết lập một cookie và tham khảo 'trực tiếp' bên trong tùy chọn, nhưng bây giờ tôi đang thiết lập nó trên các tiêu đề: {} và biết yêu cầu htttp/get/cookies của tôi đang làm việc tốt. Cảm ơn! – user1321759

1

bạn chỉ có thể thiết lập:

http.globalAgent.keepAlive = true