DiscordJS v13迁移后原自定义事件命令加载脚本报错如何解决?
报错原因
你的加载脚本默认commands目录下的所有条目都是分类子目录,但当前你直接把Help.js文件存放在commands根目录下,没有额外的子目录层。当代码执行到读取分类下命令的步骤时,拿到的category参数是Help.js文件名而非目录名,系统尝试把文件当作目录扫描,直接触发ENOTDIR错误。
该报错和Discord.js v12升v13没有直接关联,是命令目录的文件结构和加载逻辑不匹配导致的。
修复方案
方案1:保留分类目录结构(符合原始代码设计)
- 先调整文件结构,在
commands目录下创建分类子目录(比如utility、moderation等),将Help.js等命令文件移动到对应子目录中,参考结构:
commands ├───utility │ └───Help.js └───moderation └───Ban.js
- 可以给代码加上目录判断逻辑,避免后续误把文件当目录处理,修改分类读取的代码行即可:
// 原代码 // const categories = readdirSync(`${__dirname}/../../commands`); // 修改后 const categories = readdirSync(`${__dirname}/../../commands`, { withFileTypes: true }) .filter(dirent => dirent.isDirectory()) .map(dirent => dirent.name);
方案2:不需要分类,命令直接放在commands根目录
直接修改加载逻辑,删除分类遍历的层级,直接读取commands下的js文件即可:
const { readdirSync } = require("fs"); try { // 直接读取commands目录下的所有js命令文件 const commands = readdirSync(`${__dirname}/../../commands`).filter(file => file.endsWith('.js')); for (const file of commands) { const cmd = require(`${__dirname}/../../commands/${file}`); const command = new cmd(this); this.commands.set(command.name.toLowerCase(), command); console.warn("Command Loader", `Loaded ${cmd.name}.`); if (command.aliases && Array.isArray(command.aliases)) { for (let i = 0; i < command.aliases.length; i++) { this.aliases.set(command.aliases[i], command); } console.warn("Command Loader", `${cmd.name} with aliases ${command.aliases} loaded.`); } } } catch (error) { console.log('CLIENT', error); }
内容的提问来源于stack exchange,提问作者Johnty
相关产品推荐
相关产品推荐

