为什么 NodeJS http 服务器在超时时关闭套接字而没有响应?

曼努埃尔

给定一个超时时间为 10 秒的 NodeJS http 服务器:

const httpServer = require('http').createServer(app);
httpServer.timeout = 10 * 1000;

超时时,邮递员会在没有任何响应代码的情况下显示此内容:

Error: socket hang up
Warning: This request did not get sent completely and might not have all the required system headers

如果 NodeJS 服务器位于 nginx 反向代理之后,则 nginx 会返回 502 响应 ( upstream prematurely closed connection while reading response header from upstream)。但这里只是在本地主机上运行的 NodeJS/express。仍然有人会期望正确的 http 响应。

根据这个答案,这是预期的行为,套接字只是被破坏了。

在具有 nginx 反向代理的架构中,服务器是否通常只是销毁套接字而不向代理发送超时响应?

克里斯·安德森-MSFT

你设置,当你设置HTTP服务器超时套接字超时套接字超时可防止可能想挂断您与 DOS 您的连接的客户端的滥用。它还有其他好处,例如确保一定水平的服务(尽管当您是客户时,这些通常更重要)。

它使用套接字超时而不是发送408状态代码(请求超时)的原因是因为状态代码可能已经发送成功消息。

如果你想在你的后端实现一个响应超时并优雅地处理它,你可以自己超时响应。请注意,您可能应该用 a408代替。502用于像 http 代理 (nginx) 这样的网关来指示下游连接失败。

这是处理它的一个简单的稻草人实现。

const httpServer = require('http').createServer((req, res) => {
    setTimeout(()=>{
        res.statusCode = 200;
        res.statusMessage = "Ok";
        res.end("Done"); // I'm never called because the timeout will be called instead;
    }, 10000)
});

httpServer.on('request', (req, res) => {
    setTimeout(()=>{
        res.statusCode = 408;
        res.statusMessage = 'Request Timeout';
        res.end();
    }, 1000)
});

httpServer.listen(8080);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当Nodejs服务器使用HTTP端口时,为什么HTTP端口保持打开状态?

“服务器没有响应。连接超时”的影响是什么。Anylogic 中的错误?

为什么访问本地服务的Express应用程序时nodejs http请求不起作用?

为什么我会收到〜在stdout上没有响应〜在黑客排名nodejs中

为什么我没有使用 xmlhttprequest "POST" 在 nodejs 服务器中接收数据?

为什么在Swagger UI中“服务器没有响应”?

为什么代理服务器在IE 11中没有响应?

为什么我在NodeJS中收到此UNEXPECTED HTTP错误

为什么NodeJS ssl服务器用(52)服务器的空回复来响应cURL?

为什么js服务器没有收到HTTP发布请求?

为什么heroku不能在没有HTTP服务器的情况下运行WebSocket服务器?

为什么我在使用 NODEJS 和 EXPRESSJS 通过 RESTAPI 中的参数(ID)向服务器发出请求后没有收到正确的响应

为什么每个请求发送多个响应会使NodeJS服务器崩溃?

为什么HTTP请求总是花费整个超时时间?

获取Http响应NodeJS

nodejs http.request 方法没有响应,回调没有错误

NodeJS http模块:什么是requestListener?

为什么这个http服务器这样做?

Socket.io,为什么需要http服务器?

为什么将此http服务器描述为泄漏?

Nodejs套接字挂起和ECONNRESET-从流星到Node js服务器的HTTP发布请求

NodeJS http和https模块之间有什么区别?

为什么Node.js HTTP服务器不响应来自Python的请求?

为什么无法获取$http服务的数据?

关于HTTP服务器与在NodeJS中使用http的混淆

如果没有EOF,从Golang中的服务器读取Unix套接字响应的最佳方法是什么?

为什么在 nodejs 中没有触发标头事件

Nodejs,为什么 ASYNC 调用后的行没有执行?

为什么在获取请求后,远程的服务器响应在nodejs上不包含x-csrf-token?