Heroku部署Discord机器人新增斜杠命令后找不到模块报错
排查步骤及解决方案
第一步:检查文件路径大小写匹配问题
你本地如果运行在Windows或macOS系统上,文件系统对大小写不敏感,只要文件名字符对就能正常加载;但Heroku使用Linux系统,大小写严格匹配。请确认你代码中require('./messages/embed/Assertions')对应的实际文件路径,是否所有文件夹名称、文件名的大小写和require语句完全一致,比如是否实际文件为assertions.js、上级文件夹名为Embed而非embed这类情况,修正大小写后重新提交部署即可。第二步:确认目标文件已提交到Git仓库
检查你项目的.gitignore文件,是否存在匹配messages文件夹、embed文件夹或Assertions.js文件的规则,导致本地存在该文件,但提交代码时被忽略,Heroku拉取的代码中缺少对应文件。你可以直接打开你的GitHub仓库,核对对应路径下是否存在该文件,若不存在,移除.gitignore中的对应规则,重新提交文件即可。第三步:修正package.json启动脚本
你当前的start脚本配置为"start": "run index.js",该写法依赖全局安装的run模块,Heroku默认环境没有预装该模块,会导致启动时路径解析异常。将start脚本修改为标准写法:
"start": "node index.js"
重新提交配置后再次部署。
- 第四步:核对相对路径是否正确
若你新增斜杠命令后调整了代码文件的目录结构,需要确认写了require('./messages/embed/Assertions')语句的文件所在目录,是否和相对路径匹配。比如该语句如果是写在commands子文件夹下的文件中,相对路径就需要调整为../messages/embed/Assertions才能正确定位文件。
另外你给出的add.js代码存在异步逻辑问题:当前fetch请求未等待返回就直接回复用户,即使接口请求失败也会提示添加成功,且try/catch无法捕获fetch的异步异常,可调整为如下写法:
async execute(interaction) { const rsn = interaction.options.getString('rsn'); try { const res = await fetch(`https://templeosrs.com/api/add_group_member.php?`, { method: 'POST', headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: `id=${groupID}&key=${groupKey}&players=${rsn}` }); if (res.ok) { await interaction.reply(`**${rsn}**, 已成功添加到TempleOSRS组!`); } else { await interaction.reply('添加失败,接口请求返回异常'); } } catch (error) { await interaction.reply('Oops, 调用API时出现错误'); console.log(error); } }
内容的提问来源于stack exchange,提问作者Per Slegt

