Discord.js机器人封禁成员catch报错无法发消息及添加用户名问题
Discord机器人封禁功能问题修复方案
现有代码的核心问题
- 错误捕获没有绑定到封禁成员的异步操作上,反而给发送成功通知的
message.channel.send方法加了两层冗余的catch,无法捕获封禁操作本身抛出的权限错误 - 没有提前存储待封禁用户的对象,无法在成功通知中提取用户名
修复后代码示例
这里以discord.js v14版本为例,先获取要封禁的目标用户,再执行封禁操作,分别处理成功和失败场景:
Promise链式写法
// 提取消息中@的目标封禁成员,你也可以根据自己的逻辑获取目标成员ID const targetMember = message.mentions.members.first(); if (!targetMember) return message.reply("请指定需要封禁的用户"); // 给ban操作绑定回调和错误捕获 targetMember.ban() .then(() => { // 封禁成功后再发送通知,插入被封禁用户的完整标签 return message.channel.send(`用户 ${targetMember.user.tag} 已被封禁`); }) .catch(() => { // 捕获所有封禁失败的情况,包括权限不足、目标角色层级高于机器人 return message.reply("我无法封禁该成员"); });
async/await写法(更易读)
const targetMember = message.mentions.members.first(); if (!targetMember) return message.reply("请指定需要封禁的用户"); try { // 等待封禁操作完成 await targetMember.ban(); // 成功后发送带用户名的通知 await message.channel.send(`用户 ${targetMember.user.tag} 已被封禁`); } catch (err) { // 捕获所有封禁错误 await message.reply("我无法封禁该成员"); }
额外注意事项
- 机器人需要提前被授予
BanMembers权限 - 机器人的角色层级必须高于待封禁用户的角色层级,否则即使有权限也会触发封禁失败,这是Discord的平台权限规则
内容的提问来源于stack exchange,提问作者FinallyComplete
相关产品推荐
相关产品推荐

