nodejs:在进行中放弃http回复

我如何中止与快递http回复? 在我的情况下,我服务的数据是从外部来源产生的,并在我开始服务之前,我知道大小(内容长度)。 但是,如果外部信息源在给我全部内容之前停止给我提供数据,我想中止请求,这样在接收端就会触发错误事件。

这里是简单的代码,服务器:

//server var express = require('express'); var app = express(); app.use(function(req, res, next){ res.setHeader('Content-Length', 100); res.writeHead(200); res.write('1234567890'); setTimeout(function() { res.connection.destroy(); }, 500); }); app.listen(8080); 

 //client var http = require('http'); http.get('http://localhost:8080/', function(res){ var length = 0; console.log('expected size: ', res.headers['content-length']); res.on('data', function(chunk){ length += chunk.length; }); res.on('end', function(){ console.log('received: ', length); }); }).on('error', function(e){ console.log('error', e); }); 

期望客户端应该显示错误,即连接被重置,而不是像一切正常一样,即使只有10个字节被接收。

当知道请求不能被满足时,如何中止发送方的连接? 我发现的一种方法是在该定时器内部抛出exception,然后接收器会logging错误,但我不想抛出exception,我想正确地做到这一点。

理想情况下,要结束HTTP响应,您可以调用res.end() 。 在分块传输编码或没有HTTP保持连接的情况下,这将干净地结束响应。

但是,大多数HTTP连接将支持HTTP保持活动状态,并且由于您具有Content-Length标头,因此您的传输编码不会被分块。 在你的情况下,你将不得不closures底层套接字。 检出req.connection属性,然后调用.end() 。 这是没有logging的,但在那里已经有好几年了,现在可能是安全的。 更合理的获取连接的方法包括在服务器对象上侦听它 ,但是很难将连接与请求相关联。

尽pipe如此,对于大多数HTTP客户端来说,这是一个警告,通常不是一个错误。 如果您控制客户端代码,则可以通过比较您收到的数据长度和预期的长度来检测此情况。