Node.js v13下discord.js执行!server触发MessageEmbed字段非空字符串报错
报错原因
RangeError [EMBED_FIELD_VALUE] 报错的核心是你传入MessageEmbed字段的值不是非空字符串,属于discord.js的字段校验错误,结合你的代码和运行环境,具体有以下几个问题:
- Node版本不兼容:discord.js v13要求Node.js版本≥16.6,你当前使用的13版本会存在大量API兼容问题,优先升级Node版本到符合要求的范围。
- 未开启必要网关意图:如果没有在Discord开发者后台的机器人设置页开启
GUILDS、GUILD_MEMBERS、GUILD_PRESENCES三个意图,代码中获取的服务器所有者、成员在线状态、成员列表都会返回空值,触发报错。 - 代码中多处传入非字符串/空值到Embed字段:
guild.owner是GuildMember对象,不是字符串,且未缓存时会返回undefined- 服务器没有boost时
guild.premiumSubscriptionCount、guild.premiumTier会返回null,直接传入会被判定为无效值 guild.roles.highest是Role对象,不是字符串- 角色、emoji列表拼接后长度超过Embed字段最大限制1024字符时也会触发报错
- 服务器没有自定义头像时
icon为null,传入缩略图和页脚设置也会出错
修正后代码
const { MessageEmbed } = require("discord.js") module.exports = { commands: ['serverinfo', 'server-info', 'si', 'server'], description: '获取服务器信息', callback: async (message, args) => { const { guild } = message // 处理服务器头像为空的情况 const icon = message.guild.iconURL() || 'https://cdn.discordapp.com/embed/avatars/0.png' // 主动拉取所有者信息避免缓存问题 const owner = await guild.fetchOwner() const roles = message.guild.roles.cache.map(e => e.toString()) const emojis = message.guild.emojis.cache.map(e => e.toString()) const emojicount = message.guild.emojis.cache const members = message.guild.members.cache const create = message.guild.createdAt.toLocaleDateString() // 处理角色列表过长问题 let roleContent = roles.join('、') if (roleContent.length > 1024) { roleContent = roles.slice(0, 15).join('、') + ` 等${roles.length - 15}个角色` } // 处理emoji列表过长问题 let emojiContent = emojis.join(' ') if (emojiContent.length > 1024) { emojiContent = emojis.slice(0, 30).join(' ') + ` 等${emojis.length - 30}个表情` } // 处理在线状态无权限获取的问题 const online = guild.members.cache.filter(member => member.presence?.status == 'online').size || 0 const idle = guild.members.cache.filter(member => member.presence?.status == 'idle').size || 0 const dnd = guild.members.cache.filter(member => member.presence?.status == 'dnd').size || 0 const offline = guild.members.cache.filter(member => member.presence?.status == 'offline').size || 0 const embed = new MessageEmbed() .setColor('RANDOM') .setTitle('服务器信息') .setThumbnail(icon) .addField('服务器所有者:-', owner.user.tag) .addField('服务器ID:-', guild.id) .addField('服务器创建时间:-', create) .addField('增压次数:-', `${guild.premiumSubscriptionCount || 0}`) .addField('增压等级:-', `${guild.premiumTier || 0}`) .addField('成员数量:-', `${members.size}\n${members.filter(member => !member.user.bot).size}(人类)\n${members.filter(member => member.user.bot).size}(机器人)`) .addField('成员状态:-', `${online}:-🟢\n${idle}:-🟡\n${dnd}:-🔴\n${offline}:-⚫\n`) .addField('最高等级角色:-', guild.roles.highest.toString()) .addField('角色列表:-', roleContent, true) .addField('表情数量:-', `${emojicount.size}\n${emojicount.filter(emoji => !emoji.animated).size}(静态)\n${emojicount.filter(emoji => emoji.animated).size}(动态)`) .addField('表情列表:-', emojiContent, true) .addField('频道统计:-', `${guild.channels.cache.filter(channel => channel.type == 'GUILD_TEXT').size}⌨️\n${guild.channels.cache.filter(channel => channel.type == 'GUILD_VOICE').size}🔈\n${guild.channels.cache.filter(channel => channel.type == 'GUILD_NEWS').size}📢\n${guild.channels.cache.filter(channel => channel.type == 'GUILD_CATEGORY').size}📁`) .setFooter('服务器信息', icon) message.channel.send({ embeds: [embed] }) } }
内容的提问来源于stack exchange,提问作者Asuka
相关产品推荐
相关产品推荐

