Discord.js添加guildMemberAdd事件报guildMember未定义如何解决
事件处理器
guildMember is not defined报错修复 相关代码
通用事件加载逻辑
const fs = require('fs'); module.exports = (client, Discord) => { const load_dir = (dirs) => { const events_files = fs .readdirSync(`./events/${dirs}`) .filter((file) => file.endsWith('.js')); for (const file of events_files) { const event = require(`../events/${dirs}/${file}`); const event_name = file.split('.')[0]; client.on(event_name, event.bind(null, client, Discord)); } }; ['client', 'guild'].forEach((e) => load_dir(e)); };
抛出错误的guildMemberAdd事件代码
const GuildSettings = require('../../models/GuildSettings'); module.exports = async (client, messages, args, Discord) => { const guildSettings = await GuildSettings.findOne({ guild_id: guildMember.guild.id, }); if (!guildSettings) return; if (!guildSettings.welcome_channel_id) { return; } const welcomeChannel = guildSettings.welcome_channel_id; if (!guildMember.guild.channels.cache.has(welcomeChannel)) { return; } if (guildSettings.welcome_role_id) { if (!guildMember.guild.roles.cache.has(guildSettings.welcome_role_id)) { return; } guildMember.roles.add(guildSettings.welcome_role_id); } guildMember.guild.channels.cache .get(welcomeChannel) .send(`Welcome <@${guildMember.user.id}> to Our server`); };
报错信息:
ReferenceError: guildMember is not defined,同加载逻辑下ready事件可正常运行。
错误原因
- 事件加载逻辑使用
bind预传入了两个固定参数:client、Discord,所有事件回调接收参数时,前两个形参固定为这两个实例,后续参数才是Discord.js对应事件触发时自带的传参。 ready事件触发时本身不传递任何参数,回调只接收预传入的client、Discord即可匹配参数列表,因此可以正常运行。guildMemberAdd事件触发时仅会传递1个参数:新加入服务器的成员对象guildMember。当前事件回调参数列表为(client, messages, args, Discord),既没有定义guildMember变量,参数顺序也完全错误,直接使用未声明的guildMember就会抛出引用错误。
修复后代码
调整guildMemberAdd.js的导出函数参数顺序,修正后完整代码如下:
const GuildSettings = require('../../models/GuildSettings'); // 参数顺序:前两个为bind预传入的client、Discord实例,第三个为事件触发时传递的guildMember对象 module.exports = async (client, Discord, guildMember) => { const guildSettings = await GuildSettings.findOne({ guild_id: guildMember.guild.id, }); if (!guildSettings) return; if (!guildSettings.welcome_channel_id) { return; } const welcomeChannel = guildSettings.welcome_channel_id; if (!guildMember.guild.channels.cache.has(welcomeChannel)) { return; } if (guildSettings.welcome_role_id) { if (!guildMember.guild.roles.cache.has(guildSettings.welcome_role_id)) { return; } guildMember.roles.add(guildSettings.welcome_role_id); } guildMember.guild.channels.cache .get(welcomeChannel) .send(`Welcome <@${guildMember.user.id}> to Our server`); };
内容的提问来源于stack exchange,提问作者Madhvan soni
相关产品推荐
相关产品推荐

