Discord.js机器人生成Embed报错RangeError [EMBED_FIELD_VALUE]求助
错误原因
- 触发
RangeError [EMBED_FIELD_VALUE]的直接原因是Discord.js要求MessageEmbed.addField()的第二个参数必须为非空字符串,你代码中直接传入了数值类型的在线人数、最大人数参数,部分异常场景下服务器IP、版本字段可能返回空值,都不符合Embed字段的校验规则。 - 代码中
ping.status('ip', { port: port})的IP、端口均为未赋值的占位符,会导致MC服务器状态查询失败,返回空的response对象,进一步加重Embed字段空值问题。 - 冗余引入了已废弃的
RichEmbed,虽然不会直接触发本次报错,但属于不规范写法。 - 次要优化点:
require('minecraft-server-util')写在messageCreate事件回调内,每次触发命令都会重复加载模块,会拖慢响应速度。
修复方案
- 所有Embed字段传入前统一转为字符串,同时增加空值兜底逻辑,避免空值/非字符串类型触发校验失败
- 替换为你实际的MC服务器IP和端口
- 把minecraft-server-util的引入移到代码顶部
- 增加命令前缀判断、机器人自身消息过滤逻辑,避免无效解析
- 移除废弃的
RichEmbed引入
修复后完整代码如下:
const {Client, Intents, MessageEmbed } = require('discord.js'); // 模块引入移到顶部 const ping = require('minecraft-server-util') const bot = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES] }); const token = '替换为你的机器人token'; const PREFIX = '!'; // 替换为你的MC服务器实际IP和端口 const MC_SERVER_IP = '你的MC服务器IP'; const MC_SERVER_PORT = 25565; bot.on('ready', () =>{ console.log('Bot has come online.'); }); bot.on('messageCreate', message =>{ // 先判断消息是否带前缀、是否是机器人自己发的,避免无效解析 if (!message.content.startsWith(PREFIX) || message.author.bot) return; let args = message.content.substring(PREFIX.length).split(' ') switch(args[0]){ case 'mc': ping.status(MC_SERVER_IP, { port: MC_SERVER_PORT }) .then((response)=>{ const Embed = new MessageEmbed() .setTitle('Server Status') // 所有字段转字符串+空值兜底 .addField('Server IP', `${response.host ?? '获取失败'}`) .addField('Server Version', `${response.version ?? '获取失败'}`) .addField('Online Players', `${response.onlinePlayers ?? 0}`) .addField('Max Players', `${response.maxPlayers ?? 0}`) message.channel.send({ embeds: [Embed] }); }) .catch((error)=>{ console.error(error); // 查询失败给用户返回提示 message.channel.send('服务器状态查询失败,请稍后重试'); }); break } }) bot.login(token);
内容的提问来源于stack exchange,提问作者Bread_butter
相关产品推荐
相关产品推荐

