Discord.js中setMute()方法的正确使用方式及报错排查
问题根因
你代码里的两个错误直接导致了报错:
setMute()是GuildMember(服务器成员对象)的内置方法,不属于全局User对象。你通过client.users.fetch()拿到的是平台全局用户实例,不承载任何服务器维度的操作权限和方法,调用不存在的方法自然会触发“不是一个函数”的报错。message.Client写法大小写错误,运行中的bot实例挂载在message.client属性上(小写c开头),大写开头的Client是Discord.js导出的类构造函数本身,不是你登录的bot实例,从这里取数据会触发未定义报错。
可直接运行的正确写法
setMute()本身确实不需要配置禁言角色,它是Discord原生提供的语音禁言接口,直接操作成员的语音状态即可生效,参考实现:
// 从当前消息所在服务器拉取目标成员对象,不要拉取全局user const targetMember = await message.guild.members.fetch('替换为目标用户的ID'); const muteReason = '填写禁言理由,可留空字符串'; try { // 调用成员对象的禁言方法,传入是否禁言的布尔值和理由 await targetMember.setMute(true, muteReason); message.channel.send('已完成目标成员禁言操作'); } catch (error) { console.error('禁言失败详情:', error); message.channel.send('禁言操作失败,请确认bot拥有「禁言成员」权限,且bot角色优先级高于目标成员'); }
补充说明
setMute()仅对语音频道生效,作用是禁止目标成员在所有语音频道发言,如果你需要实现文字频道禁言,v13及以上版本的Discord.js可以用targetMember.timeout(禁言时长毫秒数, 理由)实现原生超时禁言,不需要配置角色。- 所有Discord.js的API方法都是异步的,必须用
await或者.then()处理返回的Promise,否则不会实际执行。 - 操作前请确认bot拥有对应权限,且目标成员不是服务器所有者、角色优先级不高于bot,否则接口会返回403权限错误。
内容的提问来源于stack exchange,提问作者kohi
相关产品推荐
相关产品推荐

