【问题标题】:Fetch times out after 2 minutes2 分钟后获取超时
【发布时间】:2022-01-18 20:19:44
【问题描述】:

项目描述

我正在开发一个 NodeJS/Express 应用程序,该应用程序在加载主页时使用 Fetch 调用发出 API 请求的路由。从 API 请求中检索到的数据以下拉列表的形式返回给客户端。

问题

API 请求通常需要超过 2 分钟才能返回响应,这会导致 Fetch 超时并出现 504 Gateway Timeout。据我了解,Express 的默认超时时间为 2 分钟,因此我尝试了多种方法来增加此超时时间,但都没有运气。 值得注意的是,我只在测试已部署的代码时才会收到这些超时错误。当我通过在本地运行代码进行测试时,我没有收到任何错误,而且 2 分钟超时似乎不存在。使用以下一些尝试强制超时将导致在本地运行时超时。

修复尝试

  1. here 所述,使用 Express 连接超时中间件。我作为顶级中间件进行了测试,并且在路由本身内。

  2. 在app.listen()函数后设置服务器超时:

     var server = app.listen(port, () => console.log(`Listening on port ${port}...`));
     server.setTimeout(3 * 60 * 1000);
    
  3. 在app.listen()函数后设置keepAliveTimeout和headersTimeout:

     var server = app.listen(port, () => console.log(`Listening on port ${port}...`));
     server.keepAliveTimeout = 30000; 
     server.headersTimeout = 31000;
    
  4. 在 Fetch 调用的路由中设置请求超时:

     router.post('/example', function (req, res) {
         req.setTimeout(3 * 60 * 1000);
         // Call function that makes API request
         return res.send(api_response_data);
     });
    

使用的堆栈溢出线程

How to set the HTTP Keep-Alive timeout in a nodejs server

How to modify the nodejs request default timeout time?

Express.js connect timeout vs server timeout

Express.js Response Timeout

Express.js HTTP request timeout

上面列出的大多数尝试都反映在这些线程中;但是,我尝试了几乎所有建议,也发现了这些线程。

【问题讨论】:

  • 504 Gateway Timeout 听起来像是来自托管基础设施的某些部分,因为它试图清理“卡住”的 http 请求,并且可能不是直接来自您的服务器。我建议在您的托管计划中研究 http 超时设置。
  • 我在想可能是这样。会调查的,谢谢!
  • 仅供参考,长时间运行的 http 请求可能会出现问题并不少见。如果真的没有办法让它在服务器上运行的时间不长,那么有一些方法可以围绕它进行设计,例如使用 webSocket 连接。客户端通过 webSocket 连接发送一个请求,然后服务器在很长一段时间后发送一个响应,只要响应准备好。由于 webSocket 连接已经设计为长时间运行,并且所有基础设施(支持 webSockets)都应该意识到这一点,因此您可能遇到的问题更少。
  • 不幸的是,我真的没有其他方法可以使请求更短......所以我仍然会使用 Node 和 Express,但要实现 WebSockets?我不熟悉,所以任何资源或建议都会非常有帮助!
  • webSocket 连接只是客户端和服务器之间的长时间运行连接,任何一方都可以随时发送数据。在这种情况下,它的有用部分是服务器可以通过 webSocket 发送数据(当它最终得到结果时),而客户端不必挂在 http 连接上等待最终响应——从而避免了超时问题。这通常被称为“服务器推送”,服务器可以主动向客户端发送数据,而无需客户端特别请求。

标签: javascript node.js express


【解决方案1】:

我使用了@jfiend00 的建议并重新设计了我的应用程序以使用 WebSocket 连接。只要我偶尔在服务器和客户端之间发送 ping/pong 消息以保持连接处于活动状态,我就不再遇到超时问题。

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2019-06-08
    相关资源
    最近更新 更多