如何修复discord.js handler中命令列表重复输出的问题
问题原因
你代码中的双层读取逻辑存在错误:外层readdirSync("./commands/")会遍历commands目录下的所有条目(包括子目录、js文件),内层又重复读取整个commands目录下的所有js文件,外层遍历多少次,所有命令就会被重复添加到表格多少次,最终就会出现10条命令重复展示10次的问题。
修复方案
根据你的命令存放结构二选一即可:
方案1:命令全部直接存放在commands根目录(无子目录分类)
直接删除外层多余的目录遍历即可,修复后代码如下:
const { readdirSync } = require("fs"); const ascii = require("ascii-table"); let table = new ascii("Commands"); table.setHeading("Command", "Load status"); module.exports = (client) => { // 直接读取commands根目录下的js文件 const commands = readdirSync(`./commands/`).filter(file => file.endsWith(".js")); for (let file of commands) { let pull = require(`../commands/${file}`); if (pull.name) { client.commands.set(pull.name, pull); table.addRow(file, '✅'); } else { table.addRow(file, `❌ -> missing a help.name, or help.name is not a string.`); continue; } if (pull.aliases && Array.isArray(pull.aliases)) pull.aliases.forEach(alias => client.aliases.set(alias, pull.name)); } // 打印表格 console.log(table.toString()); }
方案2:命令按子目录分类存放(如commands/管理、commands/娱乐等子目录)
修正内层读取路径为对应子目录即可,修复后代码如下:
const { readdirSync } = require("fs"); const ascii = require("ascii-table"); let table = new ascii("Commands"); table.setHeading("Command", "Load status"); module.exports = (client) => { readdirSync("./commands/").forEach(dir => { // 内层读取对应子目录下的js文件 const commands = readdirSync(`./commands/${dir}/`).filter(file => file.endsWith(".js")); for (let file of commands) { let pull = require(`../commands/${dir}/${file}`); if (pull.name) { client.commands.set(pull.name, pull); table.addRow(`${dir}/${file}`, '✅'); } else { table.addRow(`${dir}/${file}`, `❌ -> missing a help.name, or help.name is not a string.`); continue; } if (pull.aliases && Array.isArray(pull.aliases)) pull.aliases.forEach(alias => client.aliases.set(alias, pull.name)); } }); // 打印表格 console.log(table.toString()); }
内容的提问来源于stack exchange,提问作者MegaMix_Craft
相关产品推荐
相关产品推荐

