【发布时间】:2022-01-18 20:19:44
【问题描述】:
项目描述
我正在开发一个 NodeJS/Express 应用程序,该应用程序在加载主页时使用 Fetch 调用发出 API 请求的路由。从 API 请求中检索到的数据以下拉列表的形式返回给客户端。
问题
API 请求通常需要超过 2 分钟才能返回响应,这会导致 Fetch 超时并出现 504 Gateway Timeout。据我了解,Express 的默认超时时间为 2 分钟,因此我尝试了多种方法来增加此超时时间,但都没有运气。 值得注意的是,我只在测试已部署的代码时才会收到这些超时错误。当我通过在本地运行代码进行测试时,我没有收到任何错误,而且 2 分钟超时似乎不存在。使用以下一些尝试强制超时将导致在本地运行时超时。
修复尝试
-
如here 所述,使用 Express 连接超时中间件。我作为顶级中间件进行了测试,并且在路由本身内。
-
在app.listen()函数后设置服务器超时:
var server = app.listen(port, () => console.log(`Listening on port ${port}...`)); server.setTimeout(3 * 60 * 1000); -
在app.listen()函数后设置keepAliveTimeout和headersTimeout:
var server = app.listen(port, () => console.log(`Listening on port ${port}...`)); server.keepAliveTimeout = 30000; server.headersTimeout = 31000; -
在 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 HTTP request timeout
上面列出的大多数尝试都反映在这些线程中;但是,我尝试了几乎所有建议,也发现了这些线程。
【问题讨论】:
-
504 Gateway Timeout听起来像是来自托管基础设施的某些部分,因为它试图清理“卡住”的 http 请求,并且可能不是直接来自您的服务器。我建议在您的托管计划中研究 http 超时设置。 -
我在想可能是这样。会调查的,谢谢!
-
仅供参考,长时间运行的 http 请求可能会出现问题并不少见。如果真的没有办法让它在服务器上运行的时间不长,那么有一些方法可以围绕它进行设计,例如使用 webSocket 连接。客户端通过 webSocket 连接发送一个请求,然后服务器在很长一段时间后发送一个响应,只要响应准备好。由于 webSocket 连接已经设计为长时间运行,并且所有基础设施(支持 webSockets)都应该意识到这一点,因此您可能遇到的问题更少。
-
不幸的是,我真的没有其他方法可以使请求更短......所以我仍然会使用 Node 和 Express,但要实现 WebSockets?我不熟悉,所以任何资源或建议都会非常有帮助!
-
webSocket 连接只是客户端和服务器之间的长时间运行连接,任何一方都可以随时发送数据。在这种情况下,它的有用部分是服务器可以通过 webSocket 发送数据(当它最终得到结果时),而客户端不必挂在 http 连接上等待最终响应——从而避免了超时问题。这通常被称为“服务器推送”,服务器可以主动向客户端发送数据,而无需客户端特别请求。
标签: javascript node.js express