Node.js nodejs:在进行中中止http应答 我如何在中间放弃HTTP应答? 在我的例子中,我提供从外部源生成的数据,在开始提供数据之前,我知道数据的大小(内容长度)。但是,如果外部源在向我提供完整内容之前停止向我提供数据,我希望中止请求,以便在接收端触发错误事件

Node.js nodejs:在进行中中止http应答 我如何在中间放弃HTTP应答? 在我的例子中,我提供从外部源生成的数据,在开始提供数据之前,我知道数据的大小(内容长度)。但是,如果外部源在向我提供完整内容之前停止向我提供数据,我希望中止请求,以便在接收端触发错误事件,node.js,express,Node.js,Express,以下是服务器的简单代码: //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.d

以下是服务器的简单代码:

//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);

客户机应该显示连接被重置的错误,并且不会表现为一切正常,即使只接收到100个字节中的10个字节


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

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

但是,大多数HTTP连接将支持HTTP保持活动,并且由于您有
内容长度
头,因此传输编码不会分块。在您的情况下,必须关闭底层套接字。检查
req.connection
属性,并对其调用
.end()
。这是没有文件记录的,但已经存在多年,现在可能是安全的。获取连接的更合法的方法包括,但是很难将连接与请求关联起来


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

Hmm。我认为您必须先从外部源获取完整数据,然后再从节点服务器返回。@RobertMoskal不是一个选项,我需要知道hot以中止tcp连接。我不敢相信没有这样的方法。我实际上需要中止,没有解决方法或其他解决方案。你检查过我的代码吗?我不需要请求连接。销毁()。显然我知道res.end()。无法执行res.end(),必须完全关闭连接。你知道吗?是的,我查过你的密码。在套接字上使用
.end()
.destroy()
不是您想要的。还有,你认为
res.end()
在没有保留的情况下会做什么?它会关闭连接。我提到它是因为它可能与你的情况有关。请重新阅读我的答案,我建议的两个选项,并选择一个适用于您的选项。确切地说,如果使用非分块传输,res.end()将在keepalive情况下造成严重破坏。我将尝试socket.end,但还没有尝试。@Pavel还注意到,根据Node.js的版本,
socket.close()
可能是您需要的。这个API在过去的几年中有了一些变化。在我的node版本中没有socket.close(我使用最新版本)。我尝试了这些:
req.socket.end()
,'req.connection.end()','req.connection.destroy()',
req.connection.destroy(新错误('bad data'))
,它们都不会在客户端触发错误事件,客户端认为一切正常。IMO节点必须正确处理内容长度头和触发异常,目前您可以发送10字节和100字节的内容长度,它可以处理一切顺利。
//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);
});