【发布时间】:2015-06-19 05:46:44
【问题描述】:
我们的服务器上有一个生产问题,request stream for an incoming HTTP request 没有收到end 事件;大概有一个error 或close 事件,而不是通过请求/连接中的一些错误。
我的问题是:
- 什么会导致 HTTP 请求中的
error或close事件? - 如何编写集成测试(或单元测试失败)来测试这些条件?
【问题讨论】:
我们的服务器上有一个生产问题,request stream for an incoming HTTP request 没有收到end 事件;大概有一个error 或close 事件,而不是通过请求/连接中的一些错误。
我的问题是:
error 或 close 事件?【问题讨论】:
我发现我可以通过退出进程而不调用res.end()来模拟过早关闭的请求,这会触发服务器上的close事件(永远不会调用end事件):
var http = require('http');
var options = {
host: 'localhost',
path: '/',
method: 'POST',
port: 3000
};
var req = http.request(options, function(res) {});
req.write('123');
setTimeout(function() {
process.exit();
}, 100);
我仍然不知道如何触发error 事件。
【讨论】:
end 事件(记录在here)只会在请求对象(恰好也是ReadableStream 实例)耗尽时发出。
所以你需要在它触发之前消耗所有的数据(即使你对它不感兴趣):
var http = require('http');
http.createServer(function(req, res) {
req.on('close', function() {
console.log('close');
}).on('error', function(e) {
console.log('error', e);
}).on('end', function() {
console.log('end');
res.end('hello world');
}).on('data', function() { // <- drain the stream
// do nothing...
});
}).listen(3012);
close 事件在客户端到服务器的连接关闭时触发(通常是客户端在响应发送之前关闭连接),error 事件在“错误”发生时触发(大概是当“幕后”发生故障时)。
【讨论】: