Discord状态机器人Embed描述无法调用Gamedig的state变量
问题原因
代码存在4个核心问题导致变量无法正常显示:
- 执行顺序错误:
const jugadores = state.players.length;写在顶层作用域,不仅在let state = null声明之前(触发JS暂时性死区报错),而且只会在机器人启动时执行一次,后续定时查询更新state时,jugadores的值不会同步更新。 - API调用方式错误:Discord.js的
MessageEmbed.setDescription()方法仅接收1个字符串类型参数,原代码传入了"Users:"和jugadores两个参数,第二个参数会被API直接忽略,不会渲染到消息卡片中。 - 缺少空值判断:Gamedig第一次查询完成前、查询请求失败时,
state值为null,直接读取state.players.length会抛出类型错误导致命令执行失败。 - 缺少发送逻辑:原代码仅创建了Embed对象,没有调用交互回复方法将Embed发送到频道,用户看不到任何返回内容。
修复后可运行代码
// 补全原代码缺失的fs模块引入 const fs = require('fs'); const Discord = require("discord.js"); const yaml = require("js-yaml"); const Gamedig = require('gamedig'); const supportbot = yaml.load( fs.readFileSync("./Configs/supportbot.yml", "utf8") ); const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8")); const Command = require("../Structures/Command.js"); // 移除未使用的冗余依赖引用 // const { timeStamp } = require("console"); // var request = require('request'); // 提前声明state变量,避免暂时性死区 let state = null; // 机器人启动时立即执行一次查询,避免启动初期state为空 Gamedig.query({ type: 'minecraft', host: 'mc.latinplay.net', port: '25565' }) .then(initialState => state = initialState) .catch(err => console.log('首次查询服务器状态失败:', err.message)); // 定时轮询更新服务器状态,增加错误捕获避免进程崩溃 setInterval(() => { Gamedig.query({ type: 'minecraft', host: 'mc.latinplay.net', port: '25565' }) .then(updatedState => state = updatedState) .catch(err => console.log('定时更新服务器状态失败:', err.message)); }, 6000); module.exports = new Command({ name: cmdconfig.EstadoCommand, description: cmdconfig.EstadoCommandDesc, async run(interaction) { // 每次命令触发时实时读取最新的服务器数据,增加空值兜底 const onlinePlayers = state ? state.players.length : 0; const maxPlayers = state ? state.maxplayers : 0; const ping = state ? `${state.ping}ms` : '查询失败'; const serverStatusEmbed = new Discord.MessageEmbed() .setColor('RANDOM') // 拼接为单个字符串传入setDescription .setDescription(`服务器在线人数:${onlinePlayers}/${maxPlayers}`) .addField('当前延迟', ping, true); // 调用回复方法将Embed发送到频道 await interaction.reply({ embeds: [serverStatusEmbed] }); } });
关键修改说明
- 调整变量声明顺序:将
state的声明移到所有调用逻辑之前,消除暂时性死区报错。 - 移除顶层的玩家数赋值逻辑:将数据读取放到命令的
run方法内,每次用户触发命令都会读取最新的state值,不会拿到启动时的旧数据。 - 修正Embed参数传递:使用模板字符串将文本和变量拼接为单个字符串传入
setDescription,解决参数被忽略的问题。 - 增加全链路错误兜底:所有Gamedig请求增加异常捕获,读取state数据前做空值判断,避免查询失败时命令直接报错无响应。
- 补全交互回复逻辑:创建完Embed后调用
interaction.reply发送内容,保证用户能正常看到返回的状态卡片。 - 新增启动即时查询:消除机器人启动后前6秒的state空值窗口,避免用户刚启动机器人就触发命令时拿不到数据。
内容的提问来源于stack exchange,提问作者AleShito
相关产品推荐
相关产品推荐

