我使用的是node.js v.4.4.8。当我创建一个HTTPS服务器时,我从来没有得到response.on('end',...)事件(但我做的是HTTP事件)。我在节点的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();
答案 0 :(得分:17)
我认为此问题已于commit de09168
修复,并且几个月内对此问题没有采取任何行动,但答案是:
关于issue 728 Node.js创作者Ryan Dahl says的评论:
这不是错误。回复不保证会有“结束”事件。使用'关闭'。
虽然后来他says:
我收回我之前说过的话。我们应该做这个工作。
无论哪种方式,close
和end
在这个用例中几乎可以互操作。 node.js
核心tls.js:681
中的相关代码强制解释:
process.nextTick(function() {
self.encrypted.emit('end');
self.cleartext.emit('end');
self.encrypted.emit('close');
self.cleartext.emit('close');
});
答案 1 :(得分:8)
由于在HTTP响应的结束函数上发出了node.js 0.8.12 完成事件。我在similar question中写了所有细节。