Javascript Discord.JS命令处理程序子文件夹搜索

Javascript Discord.JS命令处理程序子文件夹搜索,javascript,discord,discord.js,Javascript,Discord,Discord.js,我有一个用于discord bot的命令处理程序,它搜索文件夹/commands/,其中列出了所有.js命令。我想清理所有命令,而不是将它们都放在同一个文件夹中,而是将它们分别放在各自的类别文件夹中。现在的问题是,我不知道如何让bot在/commands/文件夹的子目录中搜索,以在自己的类别文件夹中找到每个命令。下面是我用来在/commands/中搜索的代码。有没有办法让它搜索/commands/中的每个目录 client.commands = new Discord.Collection();

我有一个用于discord bot的命令处理程序,它搜索文件夹
/commands/
,其中列出了所有
.js
命令。我想清理所有命令,而不是将它们都放在同一个文件夹中,而是将它们分别放在各自的类别文件夹中。现在的问题是,我不知道如何让bot在
/commands/
文件夹的子目录中搜索,以在自己的类别文件夹中找到每个命令。下面是我用来在
/commands/
中搜索的代码。有没有办法让它搜索
/commands/
中的每个目录

client.commands = new Discord.Collection();
client.aliases = new Discord.Collection();

fs.readdir("./commands/", (err, files) => {
  if (err) return console.error(err);
  console.log(`Loading a total of ${files.length} commands.`);
  files.forEach(file => {
    if (!file.endsWith(".js")) return;
    let props = require(`./commands/${file}`);
    console.log(`Loading Command: ${props.help.name} ✔`);
    client.commands.set(props.help.name, props);
        props.conf.aliases.forEach(alias => {
      client.aliases.set(alias, props.help.name);
    });
  });
});
编辑:

这就是jakemingolla帮助我创造的答案:

function walk(dir, callback) {
    fs.readdir(dir, function(err, files) {
        if (err) throw err;
        files.forEach(function(file) {
            console.log(`Loading a total of ${files.length} commands.`);
            var filepath = path.join(dir, file);
            fs.stat(filepath, function(err,stats) {
                if (stats.isDirectory()) {
                    walk(filepath, callback);
                } else if (stats.isFile() && file.endsWith('.js')) {
                    let props = require(`./${filepath}`);
                    console.log(`Loading Command: ${props.help.name} ✔`);
                    client.commands.set(props.help.name, props);
                    props.conf.aliases.forEach(alias => {
                    client.aliases.set(alias, props.help.name);
                  });
                }
            });
        });
    });
}
walk(`./commands/`)

使用函数封装重复工作

您已经完成了一半——您有一个函数可以获取单个目录并列出其中的文件。如果遇到目录,请重复此过程:

function walk(dir, callback) {
    fs.readdir(dir, function(err, files) {
        if (err) throw err;
        files.forEach(function(file) {
            var filepath = path.join(dir, file);
            fs.stat(filepath, function(err,stats) {
                if (stats.isDirectory()) {
                    walk(filepath, callback);
                } else if (stats.isFile() && file.endsWith('.js')) {
                    ... your logic here ...
                }
            });
        });
    });
}
这是从一开始

const commandFolders=fs.readdirSync('./commands');
用于(commandFolders的常量文件夹){
const commandFiles=fs.readdirSync(`./commands/${folder}`).filter(file=>file.endsWith('.js'));
for(命令文件的常量文件){
const command=require(`./commands/${folder}/${file}`);
client.commands.set(command.name,command);
}
}

我试图找出如何在代码中实现这一点,但我得到一个错误,指出
path.join中的
path
未定义。知道如何修复吗?好的,我想我已经找到了修复路径的方法。通过安装npm模块
path
并放置
const path=require(“路径”)在顶部,但即使我这样做,它也不会工作。没有错误,但我尝试将
console.log(“True”)
放在代码中有
…您的逻辑…
的地方,但什么也没有发生。我做错了什么。我应该定义目录吗?我真的不知道该怎么做。是的,你关于
path
的说法是对的,我应该更明确地使用
require()
调用。在这种情况下,
dir
walk()
函数的参数-为了在你的情况下调用该函数,您需要使用回调并提供起始位置:
walk('./commands',function(err,data){…})