Discord机器人查询Minecraft服务器状态时Embed报错如何解决
错误原因
- 触发
RangeError [EMBED_FIELD_VALUE]的直接原因是discord.js的MessageEmbed.addField()方法要求字段值必须为非空字符串,但你代码中传入的response.onlinePlayers、response.maxPlayers都是数字类型,不符合参数要求;如果服务器查询返回的response.host、response.version为空/undefined时也会触发相同报错。 - 机器人无响应的另一个隐性原因是你没有过滤机器人自身发送的消息,也没有先判断消息是否以约定前缀开头,同时查询失败的错误只在后台打印、没有给用户返回提示,用户侧就会看到命令触发后无任何反馈。
修正方案
修改逻辑如下:
- 将所有Embed字段值统一转为字符串,同时补充空值兜底逻辑,避免空值或非字符串类型触发报错
- 新增前缀判断、机器人消息过滤逻辑,减少无效触发
- 查询失败时给用户返回错误提示,不要仅打印后台日志
- 将第三方库的引用移到全局,避免每次触发命令重复加载
修正后完整代码:
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 is a secret'; const PREFIX = '!'; const MC_SERVER_IP = '你的MC服务器IP'; // 替换为实际服务器IP const MC_SERVER_PORT = 25565; // 替换为实际服务器端口 bot.on('ready', () =>{ console.log('Bot has come online.'); }); bot.on('messageCreate', message =>{ // 过滤机器人消息、判断是否以前缀开头 if (message.author.bot || !message.content.startsWith(PREFIX)) 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', String(response.host || '-')) .addField('Server Version', String(response.version || '-')) .addField('Online Players', String(response.onlinePlayers || 0)) .addField('Max Players', String(response.maxPlayers || 0)) message.channel.send({ embeds: [Embed] }); }) .catch((error)=>{ console.error(error); // 查询失败给用户返回提示 message.channel.send('❌ 无法查询MC服务器状态,请检查服务器是否正常运行。'); }); break; } }) bot.login(token);
内容的提问来源于stack exchange,提问作者Bread_butter
相关产品推荐
相关产品推荐

