You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:21:43