You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DiscordJS v13迁移后原自定义事件命令加载脚本报错如何解决?

报错原因

你的加载脚本默认commands目录下的所有条目都是分类子目录,但当前你直接把Help.js文件存放在commands根目录下,没有额外的子目录层。当代码执行到读取分类下命令的步骤时,拿到的category参数是Help.js文件名而非目录名,系统尝试把文件当作目录扫描,直接触发ENOTDIR错误。
该报错和Discord.js v12升v13没有直接关联,是命令目录的文件结构和加载逻辑不匹配导致的。

修复方案

方案1:保留分类目录结构(符合原始代码设计)

  1. 先调整文件结构,在commands目录下创建分类子目录(比如utility、moderation等),将Help.js等命令文件移动到对应子目录中,参考结构:
commands
├───utility
│   └───Help.js
└───moderation
    └───Ban.js
  1. 可以给代码加上目录判断逻辑,避免后续误把文件当目录处理,修改分类读取的代码行即可:
// 原代码
// 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:27:00