Heroku H12超时错误与Node.js

目前,我正在使用Node hapijs框架开发一个REST API。 API部署在Heroku上。

在API中有一个GET端点,它发出一个get请求来从第三方检索数据并在发送回复之前处理数据。 这个特定的terminal会不时地超时。 当端点超时时, Heroku返回一个H12错误 。 一旦超时,对该端点的后续请求将导致H12错误。 我必须在Heroku上重新启动应用程序才能使端点再次工作。 API中的其他端点不会受到此错误的任何影响,即使在发生错误之后仍能继续正常工作。

在我的debugging过程中,通过查看日志,似乎有些时候,第三方API没有返回响应,导致错误。

我尝试了以下解决scheme来尝试解决问题:

  1. 我正在使用请求库来发出请求。 因此,我已经尝试将超时设置为5000毫秒,作为传入请求的选项的一部分。 它有时工作…超时被触发,端点发送与请求相关的超时错误。 这是我想要的那种行为,因为随后对端点的请求工作。 但是,有时候请求超时没有被触发,但Heroku仍然返回一个H12错误(总是在30秒之后,Heroku默认)。 之后,对该端点的后续请求将返回H12错误(也是30秒之后)。 似乎有些过程被“卡住”在Heroku上,并没有终止,直到我重新启动应用程序。

  2. 我试着给hapi.js路由configuration对象添加一个超时。 我得到了和上面相同的结果。

  3. 我一直在进行研究,并怀疑问题与这里和这里给出的描述有关。 看起来在应用程序服务器级别设置一个超时可以发送一个SIGKILL给Heroku工作人员可能会有所斩获。 在Ruby中看起来相当简单,但我找不到有关如何在Node中执行此操作的更多信息。

任何有识之士都非常感激。 我知道,向第三方提出请求时可能会发生超时。 这不是问题。 问题是terminal似乎在超时后“停滞”在Heroku上,并且变得没有反应。

谢谢您的帮助!

我有类似的问题,放弃了一天后,我回到它,发现我的错误。 当服务器端发生错误时,我没有向客户端发送响应。 不pipe你的服务器端algorithm的结果如何,确保你正在返回一个响应。 如果有错误,则返回该错误。 如果请求成功,则返回该响应。 我希望有帮助。

如果这没有帮助,请查看我们的heroku指南处理请求超时 ,特别是debugging请求超时部分可能有帮助: