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

discord.js V13版本如何实现为服务器成员赋予、移除角色功能?

问题根源

报错的核心原因是你的member变量取值逻辑存在问题,导致类型冲突:你在定义member的备选值时,错误地将message.mentions.roles.first()作为了回退选项,这会导致前两个匹配条件不命中时,member会被赋值为角色(Role)类型,而Role类型本身不存在roles属性。discord.js v13大幅强化了静态类型校验,所以直接抛出了该类型错误。
同时v13版本对缓存、权限的要求更严格,还需要检查对应的初始化配置。

修复步骤

  • 修正member变量的取值逻辑,移除错误的角色类型回退,保证member只会匹配到服务器成员(GuildMember)类型
  • 补充空值判断,避免参数不合法时调用方法抛出异常
  • 检查Discord客户端初始化配置,确认已经开启必要的Gateway Intent:
    const { Client, Intents } = require('discord.js');
    const client = new Client({ 
      intents: [
        Intents.FLAGS.GUILDS,
        Intents.FLAGS.GUILD_MEMBERS, 
        Intents.FLAGS.GUILD_MESSAGES
      ] 
    });
    
    除此之外需要在Discord开发者后台的Bot设置页开启Server Members Intent权限。

修正后完整可用代码

// 优先取提及的角色,取不到则用参数ID取角色
const role = message.mentions.roles.first() || message.guild?.roles.cache.get(args[0]);
// 仅匹配服务器成员,移除错误的角色匹配逻辑
const member = message.mentions.members?.first() || message.guild?.members.cache.find((m) => m.user.tag === args[0]);

// 角色和成员都存在才执行操作
if (member && role) {
  await member.roles.add(role.id).catch((e) => console.log(e));
} else {
  // 可自定义参数错误的用户提示
  message.reply('未找到匹配的成员或角色,请检查输入参数');
}

内容的提问来源于stack exchange,提问作者Bjørn Pollen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:54:03