nodejs:正在进行中止http回复

时间:2016-09-24 23:38:10

标签: node.js express

如何在中间用快递中止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);
});

预计客户端应显示连接已重置的错误,并且即使只收到100个字节中的10个字节,也不会表现得一切正常。

如果知道无法满足请求,如何中止发送方的连接?我发现的一种方法是在该计时器内抛出异常,然后接收器将记录错误,但我不想抛出异常,我想正确地做。

1 个答案:

答案 0 :(得分:1)

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

但是,大多数HTTP连接都支持HTTP keep-alive,并且由于您有Content-Length标头,因此您的传输编码不会被分块。在您的情况下,您将不得不关闭底层套接字。查看req.connection媒体资源,然后点击.end()。这是没有证件的,但已存在多年,现在可能是安全的。获取连接的更合法的方法包括listening for it on the server object,但是很难将连接与请求相关联。

您应该知道,对于大多数HTTP客户端,这是一个充其量的警告,通常不是错误。如果您控制客户端代码,则可以通过将收到的数据长度与预期长度进行比较来检测此情况。