Tengo este código que recorre todos los directorios en los commands de carpeta y luego recorre cada archivo en cada uno de esos directorios. Luego importa el módulo, lo convierte a JSON y lo agrega a una matriz llamada commands y un mapa llamado client.commands .
let commands = []; client.commands = new Map(); fs.readdir(__dirname + "/../commands/", (err, dirs) => { if (err) return console.error(err); for (let dir of dirs) { fs.readdir(__dirname + `/../commands/${dir}/`, (err, files) => { if (err) return console.error(err); for (let file of files) { let command = require(`../commands/${dir}/${file}`); commands.push(command.data.toJSON()); client.commands.set(command.data.name, command); console.log(commands); } }); } }); console.log(commands); Si console.log . registro el valor de los commands en el bucle for más interno, el resultado es exactamente como se esperaba. Sin embargo, si lo registro en el exterior del bloque de código completo, simplemente imprime una lista vacía.
Creo que deberías usar la recursión para leer los archivos dentro de las carpetas de forma recursiva. Y a continuación, enlace la pregunta que ya se hizo, creo que ayudará a resolver esto.Node.js fs.readdir búsqueda de directorio recursivo
Esto se parece a discord.js para mí.
client.commands = new Discord.Collection(); const commandFiles = fs.readdirSync("./commands").filter(file => file.endsWith(".js")); for (const file of commandFiles) { const command = require(`.commands/${file}`); client.commands.set(command.name, command); }Tus comandos deberían verse así
module.exports = { name: "name", description: "description", execute() { // execution code } }Luego puede usarlo llamando a la función u obteniendo las variables
client.commands.get(/* Name of command */).execute();dado que readdir() es asíncrono, se llama a su consola externa. log() antes de que la función en el medio se ejecute por completo.
Ajusté la sintaxis a la asíncrona más moderna y esperé, ya que las funciones de respaldo ya no son la mejor práctica, desafortunadamente no pude probarla, pero al menos es la forma correcta de hacerlo;)
let commands = []; client.commands = new Map(); async function main() { try { const dirs = await fs.readdir(__dirname + "/../commands/") for (let dir of dirs) { const files = await fs.readdir(__dirname + `/../commands/${dir}/`) for (let file of files) { let command = require(`../commands/${dir}/${file}`); commands.push(command.data.toJSON()); client.commands.set(command.data.name, command); console.log(commands); } } } catch (error) { console.error(err) } console.log(commands); } main()