Discord.js使用Gamedig查询MC服务器报EMBED_FIELD_VALUE错误
问题原因
你遇到的RangeError [EMBED_FIELD_VALUE]: MessageEmbed field values must be non-empty strings报错,是因为传入Discord embed字段的值不符合规则:Discord.js要求所有addField()的第二个参数(字段内容)必须是非空字符串,你的代码里同时存在多个逻辑错误,既触发了这个报错,也导致玩家数无法正常显示:
- 变量名混乱:开头定义的玩家计数变量是
jugadores,Gamedig查询成功后赋值给了未声明的players变量,定义embed时命名为LatinStatus,回复时却传入了不存在的LatinEstado变量 - 字段传值错误:玩家数字段第二个参数写的是
'players',带引号的写法是传固定字符串字面量,不是引用存储玩家数的变量;就算直接传数字类型的玩家数,也不符合embed字段要求的字符串类型 - 缺少异常和初始状态兜底:定时任务是6秒执行一次,机器人刚启动的前6秒还没拿到第一次查询结果,同时Gamedig查询如果遇到服务器超时、网络错误会直接抛出未捕获异常,此时没有兜底值很容易传入空值触发报错
- 参数类型不规范:Gamedig配置里的
port传了字符串格式的'25565',虽然部分版本兼容,但传数字类型更稳妥
修改方案
- 统一所有变量命名,不要混用不同语言、不同拼写的变量名
- 给Gamedig查询加错误捕获,查询失败时设置离线兜底状态,避免空值
- 机器人启动时立刻执行一次服务器查询,不用等第一个6秒间隔
- embed字段传值时用模板字符串把玩家数拼接成你需要的
X Players格式,自动把数字转为合法的字符串类型 - 修正回复时传入的embed变量名,和定义时保持一致
修改后的可运行代码如下:
const Discord = require('discord.js'); const Gamedig = require('gamedig'); // 全局状态变量,统一命名 let serverState = null; let onlinePlayerCount = 0; let isServerOnline = false; // 抽离查询逻辑,方便复用 const fetchServerStatus = () => { Gamedig.query({ type: 'minecraft', host: 'mc.latinplay.net', port: 25565 // 端口使用数字类型 }) .then(res => { serverState = res; onlinePlayerCount = res.players.length; isServerOnline = true; }) .catch(err => { console.error('Minecraft服务器查询失败:', err); onlinePlayerCount = 0; isServerOnline = false; }); }; // 启动时立刻查询一次,避免初始空状态 fetchServerStatus(); // 每6秒刷新一次状态 setInterval(fetchServerStatus, 6000); module.exports = new Command({ name: cmdconfig.EstadoCommand, description: cmdconfig.EstadoCommandDesc, async run(interaction) { const LatinStatus = new Discord.MessageEmbed() .setColor('RANDOM') // 拼接成要求的展示格式,第三个参数设为true让两个字段同行显示 .addField('**Players Online:**', `${onlinePlayerCount} Players`, true) .addField('**Status**', isServerOnline ? '**Online💚**' : '**Offline❤️**', true); interaction.reply({ embeds: [LatinStatus] // 变量名和定义保持一致 }); } });
内容的提问来源于stack exchange,提问作者AleShito
相关产品推荐
相关产品推荐

