如何解决在Heroku托管Discord bot过程中遇到的报错问题
报错原因及解决方案
1. 依赖缺失或安装不完整
最新版discord.js的语音相关依赖属于可选依赖,若你的bot用到语音功能,Heroku构建时不会自动安装这类依赖,会触发模块找不到报错。
- 若需使用语音功能,在项目根目录执行
npm install libsodium-wrappers @discordjs/voice,将这两个依赖加入package.json的dependencies字段后重新提交代码部署。 - 若无需使用语音功能,删除代码中所有语音相关逻辑的引用即可,也可在package.json中添加配置忽略可选依赖的安装。
2. Procfile路径配置错误
你当前的Procfile配置为worker: node ./src/index.js,如果项目文件结构和路径不匹配会触发文件找不到报错。
- 确认项目根目录下是否存在src文件夹,且src文件夹内存在index.js文件。如果index.js直接存放在项目根目录,将Procfile内容修改为
worker: node index.js即可。 - 注意Procfile必须放在项目根目录,不能放在src等子文件夹内。
3. 环境变量未配置到Heroku
如果你的bot token、客户端ID等敏感参数存放在本地.env文件中,未同步到Heroku配置,会导致启动时验证失败报错。
- 进入Heroku对应应用的后台,打开「Settings」选项卡找到「Config Vars」栏,点击显示配置变量后新增记录,KEY填
DISCORD_TOKEN,VALUE填你的Discord bot实际token,保存后重启dyno。 - 其他代码中用到的环境变量,也需要同步在Config Vars中添加对应的键值对。
4. Node.js版本不兼容
Heroku默认的Node.js版本可能和你本地使用的版本不一致,导致依赖编译失败无法启动。
- 在package.json中添加engines字段指定Node.js版本,和你本地运行
node -v得到的版本保持一致即可,示例配置如下:
{ "engines": { "node": "18.x" } }
5. Dyno类型配置错误
Discord bot属于后台Worker服务,不需要监听HTTP端口,如果开启了Web类型的dyno,Heroku会因为检测不到端口监听超时杀死进程。
- 进入Heroku对应应用的「Resources」选项卡,关闭Web dyno的开关,开启Worker dyno的开关,保存后重启应用即可。
内容的提问来源于stack exchange,提问作者Juan Garcia
相关产品推荐
相关产品推荐

