我不断收到此错误 R10(启动超时)-> Web 进程在启动后 60 秒内无法绑定到 $PORT

I keep getting this Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

我最近安装了 Heroku Redis。在那之前,该应用程序运行良好。我使用 Bull 进行排队,使用 ioredis 作为 redis 库。我最初有连接问题,但我已经解决了这个问题,因为我不再收到错误。但是,描述的这个新错误出现了。

请检查下面的这些详细信息;

Package.json 启动脚本

"scripts": {
    "start": "sh ./run.sh"
  }

run.sh 文件

node ./app/services/queues/process.js &&
node server.js

从 heroku 控制台的日志中,我看到了这一点。

  1. 正在处理UPDATE_USER_BOOKING...按[ctrl C]取消

  2. {"level":"info","message":"mongodb connected"}

1是我在process脚本中的登录。这告诉我消费者正在 运行ning 并准备好处理它收到的任何数据。 2 告诉我 mongo 已连接。可以在我的server.js(入口文件)中找到。

我的挑战是在那两行之后,然后显示这个;

错误 R10(启动超时)-> Web 进程在启动后 60 秒内无法绑定到 $PORT 使用 SIGKILL

停止进程

等待进程终止时出错:没有子进程

进程已退出,状态为 22

状态从启动变为崩溃

所以,即使我已经按照他们 docs 中的描述整理了 PORT,我也不知道为什么会发生这种情况。为了清楚起见,请参阅此内容:

app.listen(process.env.PORT || 4900, ()=>{})

注意: 在我前一天介绍 Redis bit 之前它一直在工作。

我在 package.json file 中 运行 同时 serverQueue process 的方式是否有问题?我一直在阅读与此类似的答案,但他们通常专注于 PORT 修复,据我所知,这不是我自己的问题。

TroubleShooting :我从启动脚本中删除了 queue process,问题就消失了。我改用这个

"scripts": {
    "start": "node server.js -p $PORT"
  }

所以很明显下面这一行;

node ./app/services/queues/process.js 是问题所在

现在,我如何运行这个队列处理脚本?我需要它来 运行 收听任何 subscription,然后 运行 processor script。它在本地与 启动脚本一起工作正常。

请注意:我正在使用 Bull 作为队列。我按照本指南进行了实施,并且在本地运行良好。 Bull Redis Implementation Nodejs Guide

我将不胜感激,因为我目前的开发受阻。

所以我决定走另一条路。我阅读了如何使用 Bull 在 heroku 上 运行 后台作业,我得到了一个我实施的指南。这个想法是利用 Node 的并发性 API。对于指南,使用了一个名为 throng 的包装器来实现它。 我删除了 process 文件并将我的消费者脚本包装在 start 函数中并将其传递给 throng.

Link to heroku guide on enabling concurrency in your app

结果:我开始得到 EADDR in use Error 这是因为 app.listen() 被 运行 两次。 。 解决方案:我不得不将 app.listen 函数包装在一个 worker 中并将其传递给 throng 并且它工作正常。 Link to the solution to the EADDR in use Error

在我的本地机器上,我能够推送到队列并从中使用。部署到 heroku 后,到目前为止我没有收到任何错误。

我已经在 heroku 上测试了更新,它也工作正常。