javascript - 为什么我托管在 heroku 上的不和谐机器人随机关闭?
问题描述
我有一个用 JS 编写并托管在 Heroku 上的 Discord 机器人。自 2 天以来,它每 5-30 分钟随机关闭一次。当它关闭时,我重新启动(关闭并再次打开)测功机(它是一个工人测功机,应该是 24/7)并且它打开,但在提到的时间之后它再次关闭,只有机器人,测功机还在继续。我没有修改任何代码,它是随机发生的,我有其他朋友在 Heroku 上托管了机器人,他们没有问题。我正在使用带有工人恐龙的 Heroku 免费计划。此外,这些命令在 Heroku 在线时不起作用,它们仅在我通过node index.js
.
我尝试从 Heroku 更改选项,查看日志,修改一些代码,甚至放置我在互联网上找到的代码,每 5 分钟 ping 你的机器人,但什么也没有。
这是我的日志:
2019-04-19T12:14:34.586658+00:00 app[worker.1]: at GuildMemberAddHandler.handle (/app/node_modules/discord.js/src/client/websocket/packets/handlers/GuildMemberAdd.js:12:13)
2019-04-19T12:14:34.586660+00:00 app[worker.1]: at WebSocketPacketManager.handle (/app/node_modules/discord.js/src/client/websocket/packets/WebSocketPacketManager.js:103:65)
2019-04-19T12:14:34.586661+00:00 app[worker.1]: at WebSocketConnection.onPacket (/app/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:333:35)
2019-04-19T12:14:34.586663+00:00 app[worker.1]: at WebSocketConnection.onMessage (/app/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:296:17)
2019-04-19T12:14:34.586665+00:00 app[worker.1]: at WebSocket.onMessage (/app/node_modules/ws/lib/event-target.js:120:16)
2019-04-19T12:14:34.671352+00:00 heroku[worker.1]: State changed from up to crashed
2019-04-19T12:14:34.652558+00:00 heroku[worker.1]: Process exited with status 1
2019-04-19T12:41:06.879262+00:00 heroku[worker.1]: State changed from crashed to down
2019-04-19T12:41:11.663020+00:00 heroku[worker.1]: Starting process with command `node index.js`
2019-04-19T12:41:12.348731+00:00 heroku[worker.1]: State changed from starting to up
2019-04-19T12:41:14.194602+00:00 app[worker.1]: Attempting to load command goodmorning
2019-04-19T12:41:14.198617+00:00 app[worker.1]: Attempting to load command goodnight
2019-04-19T12:41:14.199576+00:00 app[worker.1]: Attempting to load command hug
2019-04-19T12:41:14.200215+00:00 app[worker.1]: Attempting to load command kamehameha
2019-04-19T12:41:14.200930+00:00 app[worker.1]: Attempting to load command kickballs
2019-04-19T12:41:14.201643+00:00 app[worker.1]: Attempting to load command kiss
2019-04-19T12:41:14.206727+00:00 app[worker.1]: Attempting to load command scare
2019-04-19T12:41:14.207865+00:00 app[worker.1]: Attempting to load command help
2019-04-19T12:41:14.208523+00:00 app[worker.1]: Attempting to load command info
2019-04-19T12:41:14.208951+00:00 app[worker.1]: Attempting to load command invite
2019-04-19T12:41:14.209455+00:00 app[worker.1]: Attempting to load command nikonikoni
2019-04-19T12:41:14.209917+00:00 app[worker.1]: Attempting to load command ping
2019-04-19T12:41:14.210335+00:00 app[worker.1]: Attempting to load command running
2019-04-19T12:41:14.211635+00:00 app[worker.1]: Attempting to load command servers
2019-04-19T12:41:14.212116+00:00 app[worker.1]: Attempting to load command test
2019-04-19T12:41:14.212553+00:00 app[worker.1]: Attempting to load command version
2019-04-19T12:41:17.072384+00:00 app[worker.1]: Ready to serve in 600 channels on 22 servers, for a total of 16185 users.
当它崩溃时,它会出现:
2019-04-19T12:45:25.500389+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/" host=dangerdiscord.herokuapp.com request_id=bb4b7f4f-d3c4-441a-add4-18b85a78e8cb fwd="3.90.103.169" dyno= connect= service= status=503 bytes= protocol=http
2019-04-19T12:45:27.764983+00:00 app[worker.1]: /app/events/guildMemberAdd.js:2
2019-04-19T12:45:27.764996+00:00 app[worker.1]: const defaultChannel = member.guild.channels.find(channel => channel.permissionsFor(guild.me).has("SEND_MESSAGES"));
2019-04-19T12:45:27.764998+00:00 app[worker.1]: ^
2019-04-19T12:45:27.764999+00:00 app[worker.1]:
2019-04-19T12:45:27.765001+00:00 app[worker.1]: ReferenceError: guild is not defined
2019-04-19T12:45:27.765003+00:00 app[worker.1]: at member.guild.channels.find.channel (/app/events/guildMemberAdd.js:2:87)
2019-04-19T12:45:27.765004+00:00 app[worker.1]: at Map.find (/app/node_modules/discord.js/src/util/Collection.js:506:11)
2019-04-19T12:45:27.765006+00:00 app[worker.1]: at module.exports (/app/events/guildMemberAdd.js:2:48)
2019-04-19T12:45:27.765007+00:00 app[worker.1]: at Client.emit (events.js:189:13)
2019-04-19T12:45:27.765009+00:00 app[worker.1]: at Guild._addMember (/app/node_modules/discord.js/src/structures/Guild.js:1192:19)
2019-04-19T12:45:27.765011+00:00 app[worker.1]: at GuildMemberAddHandler.handle (/app/node_modules/discord.js/src/client/websocket/packets/handlers/GuildMemberAdd.js:12:13)
2019-04-19T12:45:27.765012+00:00 app[worker.1]: at WebSocketPacketManager.handle (/app/node_modules/discord.js/src/client/websocket/packets/WebSocketPacketManager.js:103:65)
2019-04-19T12:45:27.765013+00:00 app[worker.1]: at WebSocketConnection.onPacket (/app/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:333:35)
2019-04-19T12:45:27.765014+00:00 app[worker.1]: at WebSocketConnection.onMessage (/app/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:296:17)
2019-04-19T12:45:27.765015+00:00 app[worker.1]: at WebSocket.onMessage (/app/node_modules/ws/lib/event-target.js:120:16)
2019-04-19T12:45:27.903986+00:00 heroku[worker.1]: State changed from up to crashed
2019-04-19T12:45:27.889791+00:00 heroku[worker.1]: Process exited with status 1
解决方案
关于 Heroku,有几点需要了解:
如果您使用网络测功机,您的机器人将在 30 分钟不活动后关闭,要让机器人“24/7”运行,您应该使用工作测功机。
Heroku 是一项免费服务(除非您付费),因此显然他们无法让您的机器人 100% 在线,他们每月为您提供 550 小时的免费托管时间(每月大约有 730 小时。)如果您将信用卡添加到您的帐户,您每月可以获得大约 450 小时的托管时间,这显然比一个月的时间要多,而且他们永远不会从您的信用卡中收取任何费用,他们这样做是为了确保你是一个真正的人。
Heroku 上多个项目的时间不是基于项目的,它们是基于帐户的,所以如果你有一个每月 1000 小时的免费帐户,但托管了多个项目,这些时间不会持续整个月。
编辑: PS:您的问题在其他地方,但是由于您使用的是 Heroku,我认为您有必要了解一些事情,如果您愿意花钱,我建议您寻找更强大的 VPS用于机器人托管。我特别建议您这样做,因为您似乎有大约 16,000 人使用该机器人,这可能会导致 Heroku 溢出/使您的机器人滞后且不可靠。
推荐阅读
- python - Elasticsearch - cross_fields 嵌套字段
- sql - 如何将 BigQuery SQL 结果中的列类型从 NULLABLE 转换为 REQUIRED?
- python - 如何在 django 内联管理中禁用内联标签?
- web-scraping - Cheeriojs 除了 document.getElementsByClassName 什么都不返回
- javascript - 添加“返回”按钮以羽毛笔气泡输入(例如链接)
- python - 我正在尝试制作一个乘法表,但是如何并排打印输出?
- javascript - 根据条件重试失败的http req,并指定应该重试的尝试次数 - Angular
- css - 使用类和 id 的 Webpack CSS 不起作用
- java - Java中的Setter方法没有正确存储StringBuilder
- firebase - Firebase:计算平均值。使用 BigQuery 的每个屏幕类的时间