Подтвердить что ты не робот

Node.js https нет ответа 'end' event, 'close' вместо этого?

Я использую node.js v. 0.4.8. Когда я создаю сервер HTTPS, я никогда не получаю событие response.on('end',...) (но я делаю это для HTTP-протокола). Я прочитал отчеты о проблемах на странице node github - https://github.com/joyent/node/issues/728, и, по-видимому, это проблема, которая регрессировала в 0.4.8. response.on( "close",...), похоже, имеет одинаковую функциональность, но я недостаточно знаю о HTTP/HTTPS, чтобы судить. Могу ли я использовать его в качестве замены для response.on('end',...), и может ли это вызвать какие-либо проблемы в будущем?

Вы можете увидеть пример кода ниже. Спасибо заранее!

var request = "JSON_request";
var https = require('https');
var options = { 
        host:"someHost.com",
        path:"somePath",
        method: "POST", 
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': Buffer.byteLength(request)
        }
    };

var req = https.request(options, function(res){
    var response = "";
    res.setEncoding('utf8');

    res.on('data', function(chunk){
        console.log("INFO: "+chunk);
        response += chunk;
    });

    // This never happens
    res.on('end', function(){
        console.log("End received!");
    });

    // But this does
    res.on('close', function(){
        console.log("Close received!");
    });
});

req.on('error', function(error){
    console.log("Error: "+error);
});

req.write(request);
req.end();
4b9b3361

Ответ 1

Я считаю, что эта проблема была исправлена ​​с commit de09168, и никаких мер по этому вопросу в течение нескольких месяцев не было, НО вот ответ:

В комментариях для issue 728 Node.js создатель Ryan Dahl говорит:

Это не ошибка. Не гарантируется, что у участников будет "конец". Используйте "закрыть".

Хотя позже он говорит:

Я возвращаю то, что я сказал раньше. мы должны, вероятно, сделать эту работу.

В любом случае кажется, что close и end в этом случае используются в значительной степени. Соответствующий код в ядре node.js core tls.js:681 возвращает эту интерпретацию:

process.nextTick(function() {
  self.encrypted.emit('end');
  self.cleartext.emit('end');
  self.encrypted.emit('close');
  self.cleartext.emit('close');
});

Ответ 2

Так как событие node.js 0.8.12 финишировать испускается при завершении функции HTTP-ответов. Я написал все подробности в аналогичном вопросе.