Discord.js v13 踢人命令报错:ReferenceError: member is not defined
Discord.js v13 踢人命令报错排查:ReferenceError: member is not defined
错误信息
ReferenceError: member is not defined at Object.run (C:\Users\Admin\OneDrive\Desktop\mybots\testbot\src\Commands\Moderation\Kick.js:49:30) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async run (C:\Users\Admin\OneDrive\Desktop\mybots\testbot\src\Events\InteractionCreate.js:32:11)
问题定位
报错指向kick.js第49行的member.user.tag,但代码中并未定义member变量——你通过interaction.options.getMember('user')获取的目标对象变量名为user,这里属于变量名拼写错误。
另外代码中还存在一个潜在报错:使用了time()格式化日期,但未从discord.js导入该工具函数,后续执行到DM通知逻辑时会触发ReferenceError: time is not defined。
修复方案
1. 修正变量名错误
找到kick.js中第49行的代码:
.setDescription(`**${member.user.tag}** was kicked for \`${reason}\`.`);
将member替换为user:
// 两种写法均可,GuildMember 对象可直接访问 tag 属性 .setDescription(`**${user.user.tag}** was kicked for \`${reason}\`.`); // 或 .setDescription(`**${user.tag}** was kicked for \`${reason}\`.`);
2. 导入缺失的time函数
在kick.js顶部的导入语句中添加time:
const { MessageEmbed, time } = require('discord.js');
3. 修复逻辑覆盖问题
当前代码中,无论确认是否通过,最后都会执行取消流程的更新操作,导致踢人成功后会覆盖之前的成功提示。需要将取消流程的代码放在if (confirmation.proceed)的else分支中:
if (confirmation.proceed) { // 原有的踢人成功逻辑... } else { const embed = new MessageEmbed() .setTitle('Process Cancelled') .setColor('ORANGE') .setDescription(`${user} was not kicked.`); if (confirmation.reason) embed.setFooter({ text: confirmation.reason }); await confirmation.i.update({ embeds: [embed], components: [] }); }
额外说明
interaction.options.getMember('user')返回的是GuildMember对象,包含用户在服务器中的相关信息,可直接使用其属性(如user.tag或user.displayName)。- Discord.js v13中,斜杠命令的参数获取方式与旧版本不同,确保使用
getMember(获取服务器成员)而非getUser(仅获取用户对象,无服务器权限相关属性)。
内容的提问来源于stack exchange,提问作者34534hb1234trfgwer
相关产品推荐
相关产品推荐

