Discord.js中调用unban方法出现TypeError错误的求助
问题排查与修复
错误原因
你遇到的TypeError: Cannot read properties of undefined (reading 'unban')根源有两个:
- 被封禁用户不在服务器成员缓存中:
message.guild.members.cache.get(...)会返回undefined——被封禁用户已退出服务器,不会出现在成员缓存里,自然无法获取对象调用.unban()。 - API调用方式错误:
unban是GuildMemberManager的方法(即message.guild.members),不是单个成员对象的方法;而且解封需要的是用户ID/用户对象,不是成员对象(被封禁者不属于服务器成员)。
修复后的代码
if (message.content.slice(2).toLowerCase().includes("unban")) { // 禁止DM内执行解封 if (message.channel.type === 1) { const target = message.content.slice(7).trim().toLowerCase(); message.reply({ content: target === '' ? "You can't unban blank in a dm" : "you can't unban in a dm" }); return; } // 检查是否输入了解封目标 const targetInput = message.content.slice(7).trim(); if (!targetInput) { message.reply({ content: "you can't unban no one" }); return; } // 检查权限 if (!message.member.roles.cache.some(r => r.name === "Mod")) { message.channel.send(`⚠️ Error occurred ⚠️ The Error was: 'You dont have "Mod" role'`); return; } // 处理解封逻辑 try { let target; // 优先处理@用户(注意用users而不是members) if (message.mentions.users.first()) { target = message.mentions.users.first(); } else { target = targetInput; // 直接用用户ID } // 调用unban方法(统一通过guild.members.unban) await message.guild.members.unban(target); message.channel.send(`Unbanned ${target.tag ?? targetInput}`); if (!message.mentions.users.first()) message.delete(); } catch (err) { message.channel.send(`⚠️ 解封失败:${err.message}`); } }
关键修改说明
- 替换
mentions.members为mentions.users:被封禁用户不是服务器成员,无法通过mentions.members捕获,改用mentions.users获取用户对象。 - 移除缓存查找逻辑:直接将用户ID或用户对象传给
message.guild.members.unban(),无需从成员缓存中查找(缓存里根本没有被封禁用户)。 - 增加错误捕获:用
try/catch处理无效ID、无权限解封等异常情况,避免程序崩溃。 - 简化冗余判断:合并重复的DM判断逻辑,让代码更简洁。
内容的提问来源于stack exchange,提问作者Bobjoerules
相关产品推荐
相关产品推荐

