目前,我正在使用Node hapijs框架开发REST API。API部署在Heroku上。
API中有一个GET端点,它发出从第三方检索数据的GET请求,并在发送回复之前处理数据。此特定终结点不时超时。当端点超时时,Heroku返回一个H12错误。一旦超时,对该端点的后续请求将导致H12错误。我必须重新启动Heroku上的应用程序才能使端点重新工作。API中的任何其他端点都不会以任何方式受到此错误的影响,并且即使在出现错误后也会继续正常工作。
在我的调试过程和查看日志的过程中,似乎有时第三方API没有返回响应,从而导致错误。
我尝试了以下解决方案来尝试解决这个问题:
-
我正在使用请求库进行请求。因此,我尝试将超时设置为5000毫秒,作为传递给请求的选项的一部分。它有时起作用。。。超时被触发,并且端点发送与请求相关联的超时错误。这就是我想要的行为,因为对端点的后续请求会起作用。但是,有时请求超时未被触发,但Heroku仍然返回H12错误(总是在30秒后,Heroku默认值)。之后,对该端点的后续请求返回H12错误(同样在30秒之后)。似乎有某种过程在Heroku上被"卡住"了,直到我重新启动应用程序才终止。
-
我已经尝试向hapi.js路由配置对象添加超时。我得到了与上面相同的结果。
-
我一直在做研究,怀疑这些问题与这里和这里的描述有关。似乎在应用服务器级别设置一个可以向Heroku工作人员发送SIGKILL的超时可能会奏效。这在Ruby中看起来相当简单,但我在Node中找不到太多关于如何做到这一点的信息。
任何见解都将不胜感激。我知道在向第三方发出请求时可能会发生超时。这不是问题所在。问题是,在超时后,端点似乎在Heroku上"卡住"了,并且变得没有响应。
谢谢你的帮助!
我也遇到过类似的问题,在放弃了一天后,我又回来发现了我的错误。当服务器端发生错误时,我没有向客户端发送响应。无论服务器端算法的结果如何,都要确保返回响应。如果出现错误,请返回。如果请求成功,则返回该响应。我希望这能有所帮助。
如果这没有帮助,请查看heroku关于处理请求超时的指南,特别是调试请求超时部分可能会有所帮助: