Estoy usando la guía en discordjs.guide para tener archivos de escucha de eventos separados, y estaba tratando de agregar otro. Específicamente, el evento GuildCreate. En el archivo index.js, tengo esto:
const eventFiles = fs.readdirSync('./events').filter(file => file.endsWith('.js')); for (const file of eventFiles) { const event = require(`./events/${file}`); if (event.once) { client.once(event.name, (message, guild, ...args) => event.execute(message, guild, ...args)); } else { client.on(event.name, (message, guild, ...args) => event.execute(message, guild, ...args)); } }Y en el lado del evento, tengo esto:
const Discord = require('discord.js'); const prefix = require('../config.json') module.exports = { name: 'guildCreate', once: true, async execute(client, guild) { console.log(guild) const introembed = new Discord.MessageEmbed() .setTitle('Hiya!') .setColor('RANDOM') .setDescription(`Long description here`) const owner = await guild.fetchOwner(); owner.send({ embeds: [introembed]}).catch(console.error()) console.info(`I just joined a new server! I am now a member of ${guild.name}`) }, }; Cuando se emite el evento guildCreate, aparece el error: TypeError: Cannot read properties of undefined (reading 'fetchOwner') debido a await guild.fetchOwner(); . He intentado pasar la variable desde el lado del índice: client.on(event.name, (message, guild, ...args) => event.execute(message, guild, ...args)); , como puede ver, agregué la variable del gremio para pasar, y en el lado del archivo de eventos: async execute(client, guild) { Agregué la variable del gremio para ejecutar. Incluso con la adición de las variables en esos lugares, sigo recibiendo el error que dice que el gremio no está definido. ¿Alguna idea de lo que está mal? Cualquier ayuda es apreciada.
Nota: Esto está optimizado para Discord.js v13.3.0
Como lo señaló @Elitezen , pasar message y el guild no tienen valor ya que nunca se definen en su código en ninguna parte. Esto puede provocar que se arrojen errores debido a variables indefinidas (a menos que tenga controladores de errores en su código en otro lugar). Como se indica en la guía, el argumento ...args pasará a cualquier argumento recibido del evento. Así es como funcionaría algo así:
guildCreate ) discord-bot/ ├── node_modules ├── config.json ├── index.js ├── package-lock.json ├── package.json └── events └ guildCreate.js...args solo contendrá un argumento, que es un gremio. Los argumentos de los eventos no tienen nombres, se recomiendan los de la documentación. El problema con su código es que ha enviado una variable vacía llamada guild al archivo de ejecución.
async execute(client, guild) { El código mira esta línea y usa la variable vacía que enviaste llamada guild . Es por eso que está recibiendo un TypeError.
Para solucionar esto, todo lo que necesita hacer es eliminar los dos argumentos client y guild de su archivo index.js y eliminar el client de su archivo guildCreate.js . El resultado será algo como esto:
// index.js if (event.once) { client.once(event.name, (...args) => event.execute(...args)); } else { client.on(event.name, (...args) => event.execute(...args)); } // guildCreate.js async execute(guild) { A veces, recibirá eventos que tienen varios argumentos, como messageReactionAdd . Ese evento le dará dos argumentos (sin nombre) en este orden : unMessageReaction y un User . Así es como se vería:
// index.js if (event.once) { client.once(event.name, (...args) => event.execute(...args)); } else { client.on(event.name, (...args) => event.execute(...args)); } // messageReactionAdd.js async execute(messageReaction, user) { Tenga en cuenta que no he definido ningún argumento en index.js y solo los definí en messageReactionAdd.js .