discord.js列取服务器成员时显示ID而非可点击@用户名如何解决
问题修复方案
核心原因
Discord 对内容中的提及格式有严格的校验规则,手动拼接<@用户ID>的方式在Embed内容中容易出现识别失败的问题,同时默认的消息发送配置会限制部分提及的渲染,避免滥用提及功能。
修复步骤
- 替换手动拼接的提及字符串,直接调用discord.js中GuildMember对象内置的
toString()方法,生成符合Discord标准的提及格式 - 发送消息时补充
allowedMentions配置,显式允许用户提及的渲染 - 若使用discord.js v13及以上版本,确认代码初始化客户端时已显式声明所需的权限位,仅在开发者后台开启Intent不会自动生效
修复后代码示例
const { Client, IntentsBitField } = require('discord.js'); // v14版本客户端初始化示例,v13版本对应使用Intents.FLAGS枚举 const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMembers, IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.MessageContent, IntentsBitField.Flags.GuildPresences ] }); const executeCommand = async (client, message) => { const members = await message.guild.members.fetch({ force: true }); await message.channel.send({ // v13及以上版本Embed需放在embeds数组中,旧版本可保留embed字段 embeds: [{ title: 'Members', description: members.map(member => member.toString()).join(', ') }], allowedMentions: { // 仅允许解析用户提及,避免误触发全员、角色提及 parse: ['users'] } }); }
额外注意事项
Embed的description字段最大长度为4096字符,若服务器成员数量过多,内容会被Discord自动截断,也会导致部分提及格式显示异常。该场景下建议拆分多条消息发送,或使用分页组件展示成员列表。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

