gpt4 book ai didi

node.js - Node : abort http reply while in progress

转载 作者:太空宇宙 更新时间:2023-11-03 21:56:20 26 4
gpt4 key购买 nike

如何中止中间带有 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 个字节,也不会表现得一切正常。

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

最佳答案

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

但是,大多数 HTTP 连接将支持 HTTP keep-alive,并且由于您有一个 Content-Length header ,因此您的传输编码不会被分块。在您的情况下,您必须关闭底层套接字。查看 req.connection 属性,并对其调用 .end() 。这是没有记录的,但已经存在多年,目前可能是安全的。获取连接的更合法方法包括 listening for it on the server object ,但是很难将连接与请求关联起来。

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

关于node.js - Node : abort http reply while in progress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39681971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com