You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.js v12 如何检查用户是否拥有admin或owner角色

discord.js v12 多角色权限判断解决方案

你当前重复注册了两次message事件属于冗余代码,可直接合并为一个监听事件,要检测用户是否持有admin或owner任意一个角色,直接使用角色缓存的some()方法即可,优化后完整代码如下:

client.on('message', message => {
  // 过滤非!ban指令的消息
  if (!message.content.startsWith('!ban')) return;
  // 校验发起者是否持有admin或owner任意一个角色
  const hasPermission = message.member.roles.cache.some(r => r.name === 'owner' || r.name === 'admin');
  // 无权限直接终止执行
  if (!hasPermission) return;

  // 原有业务逻辑,无需重复编写两次
  message.delete();
  const targetMember = message.mentions.members.first();
  if (!targetMember) {
    return message.channel.send("You need to mention the @user!").then(declineMsg => {
      declineMsg.delete({ timeout: 5000 });
    })
  }
  const bannedRole = message.guild.roles.cache.find(role => role.name === "banned");
  // 给目标用户添加禁言角色
  targetMember.roles.add(bannedRole).then(() => {
    message.channel.send('Succesfully banned user!').then(successMsg => successMsg.delete({ timeout: 5000 }));
  })
});

逻辑说明

  • some()方法会遍历用户的所有角色,只要存在任意一个符合名称要求的角色就会返回true,刚好满足你需要的「满足任意一个权限就生效」的需求
  • 合并重复的事件监听逻辑后,避免了同个指令被两次处理的潜在异常
  • 补充了角色添加成功的回调逻辑,避免异步操作未完成就返回成功提示的问题
  • 后续如果需要新增其他可使用该指令的角色,直接在some()的判断条件里追加|| r.name === '新角色名'即可

内容的提问来源于stack exchange,提问作者Latepate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:54:03