Discord机器人Command Handler读取命令目录报ENOENT错误
故障根因
代码中使用的./Tomfoolery/属于相对路径,这类路径的解析基准是执行node启动命令时终端所处的工作目录,并非bot.js文件自身的存储目录。即使Tomfoolery目录和bot.js同级,如果你没有切到bot.js所在目录执行启动命令,就会抛出ENOENT目录不存在的错误。
你之前执行的npm rebuild node-sass相关命令和当前故障完全无关:node-sass是CSS预处理依赖,和fs模块的文件读取逻辑没有关联,执行这类命令无法修复路径问题。
修复代码
引入Node内置的path模块,基于__dirname(当前执行的js文件所在目录的绝对路径)拼接目标路径,完全不受启动工作目录的影响:
const fs = require('fs'); const path = require('path'); client.commands = new Collection(); const commandDir = path.join(__dirname, 'Tomfoolery'); const commandFiles = fs.readdirSync(commandDir).filter(file => file.endsWith('.js')); for (const file of commandFiles) { const commandName = file.split('.')[0]; const command = require(path.join(commandDir, commandName)); client.commands.set(commandName, command); }
排查注意点
- 确认Tomfoolery目录下的命令文件后缀为
.js,若使用ES模块规范后缀为.mjs/.cjs需要同步修改filter的匹配规则 - 若使用pm2、启动脚本等方式运行程序,不需要额外配置工作目录项,上述绝对路径写法可自动适配
内容的提问来源于stack exchange,提问作者Smor222
相关产品推荐
相关产品推荐

