node.js - 为什么我的 Heroku Discord 机器人无法连接到端口后崩溃?
问题描述
我正在尝试使用 Heroku 制作一个 24/7 运行的不和谐机器人。一切都很好,除了机器人在 60 秒后崩溃。
错误输出告诉我:
错误 R10(启动超时)-> Web 进程未能在启动后 60 秒内绑定到 $PORT
我在互联网上寻找解决方案,我发现了很多。然而,他们都没有工作。
这是我的主文件的代码:
const Discord = require('discord.js')
const {prefix, token} = require('./config.json')
const client = new Discord.Client()
// Login
client.login(token)
client.once('ready', () => {
console.log('Back online')
client.user.setActivity(' channel', {type: 'LISTENING'})
})
client.on('message', message => {
if (message.author.bot) {
return;
}
if (message.content.toLowerCase() === 'hello') {
message.channel.send('Hey!')
}
})
解决方案
您很可能已将您的机器人指定为在 Procfile 中的 Web 服务上运行。Heroku Procfile 是一个文件,它存储有关 Heroku 应该运行哪些进程的信息。如果您将 Procfile 设置为运行web
服务,Heroku 希望您在它启动后绑定到所需的端口(使用process.env.PORT
)。如果没有,那么 Heroku 将假定您的程序无法启动并重新启动它。
到目前为止,您的 Procfile 很可能看起来像这样:
web: node index.js
这告诉 Heroku 在 web dyno 中运行你的程序。但是,如果您没有使用 Express 等 Node.js 服务绑定到 HTTP 端口,Heroku 将使您的程序崩溃。要解决此问题,请更改web
为worker
.
worker: node index.js
请注意,通过将您的 Procfile 更改为 use worker
,您的免费测功机时间(如果您在免费测功机上运行)将继续减少 24/7,您每月将使用大约 700 小时。如果您注册了信用卡,则每月限额设置为 1000 小时,您不必担心。否则,您必须将您的测功机升级到爱好测功机才能让您的机器人运行整个月。
编辑:虽然这不是公认的答案,但我仍然必须澄清有时 Heroku 不会读取 Procfile 设置。在这种情况下,您应该在项目所在的文件夹中运行这些命令:
heroku ps:scale web=0
heroku ps:scale worker=1
这将强制 Heroku 使用您的 Procfile 中定义的 worker dyno。希望这可以帮助。
推荐阅读
- firebase - 如何从后台打开我的应用程序并导航到接收通知消息的页面?
- kubernetes - 为 sidecar 创建一个 ip 别名
- angular - 输入“客户 | undefined' 不能分配给使用 angular12 和 firebase 的类型 'Client'
- uml - 活动图:以不同继承类型的对象流作为输出重用活动/动作
- android - 应用程序被杀死时没有触发 FCM 通知
- javascript - 使用 AJAX 和 PHP 将 MYSQL 中的数据显示到文本字段中
- python - 绘制 x 轴格式
- c++ - 在 qml 中使用 c++ 类的静态属性
- android - 如何创建一个 Firebase 动态链接,点击后会打开一个 android 即时应用程序?
- android - Firebase Cloud Messaging 无法在带有 Flutter 应用程序的 Android 上运行