Discord.js v13禁言命令报错:TypeError无法读取undefined的'users'属性
错误原因与修复方案
报错
TypeError: Cannot read properties of undefined (reading 'users')出现在第5行const target = message.mentions.users.first(),本质是访问mentions.users时,message.mentions的值为undefined
核心触发原因与修复方法
- 原因1:命令执行时传参顺序错误
你定义的execute函数参数顺序为(message, args, client),如果调用该函数时传参顺序不对(比如写成了execute(client, message, args)),就会导致参数message拿到的不是真正的消息对象,自然没有mentions属性。
修复:找到你注册命令执行的逻辑,确认传参顺序和定义的完全一致。 - 原因2:错误接收了交互命令对象
如果你开发的是斜杠命令(应用命令),触发时收到的是Interaction对象而非Message对象,Interaction本身没有mentions属性,就会触发该报错。
修复:如果是前缀消息命令,确认触发逻辑筛选的是消息事件;如果是斜杠命令,将获取提及用户的逻辑改为:
同时调整const target = interaction.options.getUser('target')execute的入参和后续调用消息/交互相关方法的逻辑。
额外代码优化建议
你当前的代码存在几个潜在崩溃点,可以同步调整:
- 逻辑依赖服务器存在名为
Member的角色,若服务器没有该角色会触发后续删角色的报错。实际上禁言不需要删除普通成员角色,仅需要给目标用户添加Muted角色即可,提前给Muted角色配置各频道禁止发消息的权限就可以实现禁言效果。 - 获取成员时优先用
fetch拉取避免缓存缺失问题,优化后的可运行代码参考:
module.exports = { name: 'mute', description: 'Mute users', // 加async方便调用异步方法 execute: async (message, args, client) => { // 提前校验权限,减少无效逻辑执行 if (!message.member?.permissions.has('MANAGE_CHANNELS', true)) return message.reply('❌ You dont have permission to use this command!'); const target = message.mentions.users.first() if (target) { // 支持多词原因,args[1]只能拿到第一个词的原因 const reason = args.slice(1).join(' ') || 'no reason provided'; const MutedRole = message.guild.roles.cache.find(role => role.name === 'Muted'); if (!MutedRole) return message.channel.send('There is no muted role in this guild!'); // 用fetch拉取成员,避免缓存不存在的问题 let memberTarget; try { memberTarget = await message.guild.members.fetch(target.id); } catch (e) { return message.channel.send('获取目标成员信息失败'); } await memberTarget.roles.add(MutedRole.id); message.channel.send(`<@${target.id}> has been muted because ${reason}`); return; } else { message.channel.send('Unknown user :<'); } } }
内容的提问来源于stack exchange,提问作者Quinn
相关产品推荐
相关产品推荐

