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

discord.js v12 如何校验多角色权限实现指定角色可触发命令

问题解决方法

原有代码错误点

  • 逻辑运算符使用错误:当前&&要求用户同时持有三个允许角色才通过校验,和你「任意持有一个即可」的需求相悖,需更换为||逻辑或运算符
  • 无角色存在校验:如果服务器内不存在对应名称的角色,find()方法会返回undefined,此时读取.id属性会触发代码报错
  • 事件名适配问题:discord.js v13及以上版本已废弃message事件,需替换为messageCreate事件

修正后可直接运行的代码

// discord.js v13+ 版本使用messageCreate事件,v12及以下可保留message事件
client.on('messageCreate', message => {
  if (message.content === 'test') {
    // 先判断是否是服务器消息,避免私信场景报错
    if (!message.guild || !message.member) return message.channel.send('bad');
    
    // 查找允许的三个角色
    const ownerRole = message.guild.roles.cache.find(r => r.name === "owner");
    const modRole = message.guild.roles.cache.find(r => r.name === "mod");
    const adminRole = message.guild.roles.cache.find(r => r.name === "admin");

    // 校验:用户持有任意一个允许角色即可通过
    const hasPermission = 
      (ownerRole && message.member.roles.cache.has(ownerRole.id)) || 
      (modRole && message.member.roles.cache.has(modRole.id)) ||
      (adminRole && message.member.roles.cache.has(adminRole.id));

    if (hasPermission) {
      message.channel.send('hello');
    } else {
      message.channel.send('bad');
    }
  }
});

更易扩展的优化写法

如果后续要新增允许的角色,直接修改allowedRoleNames数组即可,不需要重复写校验逻辑:

client.on('messageCreate', message => {
  if (message.content === 'test') {
    if (!message.guild || !message.member) return message.channel.send('bad');
    
    // 允许的角色名称数组,新增权限直接加元素即可
    const allowedRoleNames = ['owner', 'mod', 'admin'];
    // 判断用户的角色是否有任意一个在允许列表中
    const hasPermission = message.member.roles.cache.some(role => allowedRoleNames.includes(role.name));

    hasPermission ? message.channel.send('hello') : message.channel.send('bad');
  }
});

提示:如果你的服务器允许修改角色名称,建议使用角色ID代替名称做判断,避免角色改名后权限校验失效。获取角色ID需要开启Discord开发者模式,右键角色即可复制ID。

内容的提问来源于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 10:15:03