Discord.js开发的MC服务器状态查询机器人触发messageCreate无响应如何解决
错误排查与修复方案
已识别的所有问题点
- 缺少前缀判断逻辑:没有过滤非
!开头的消息、机器人自己发送的消息,导致命令匹配失效 - 未开启Message Content Intent:Discord.js v13及以上版本要求,必须在Discord开发者平台的机器人设置页面开启Message Content Intent权限,否则机器人无法读取用户发送的普通消息内容,
messageCreate事件不会触发对应逻辑 - minecraft-server-util调用逻辑错误:引入工具后错误重写了
ping变量,没有实际执行服务器查询请求 - 拼写错误:响应参数名误写为
reponse,正确应为response - 使用废弃API:
RichEmbed已在Discord.js v12+版本移除,需替换为MessageEmbed
修正后完整代码
// 所有依赖引入统一放在顶部 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, Intents.FLAGS.MESSAGE_CONTENT] }); const token = '替换为你的机器人token'; const PREFIX = '!'; // 替换为你自己的MC服务器地址和端口 const MC_SERVER_IP = '你的MC服务器IP'; const MC_SERVER_PORT = 25565; // 默认Java版端口,基岩版自行修改 bot.on('ready', () =>{ console.log('Bot has come online.'); }); bot.on('messageCreate', async message =>{ // 新增:过滤非前缀消息、机器人自己的消息 if (!message.content.startsWith(PREFIX) || message.author.bot) return; let args = message.content.substring(PREFIX.length).split(' '); switch(args[0]){ case 'mc': try { // 用async/await写法避免回调嵌套问题 const response = await ping(MC_SERVER_IP, MC_SERVER_PORT); const Embed = new MessageEmbed() .setTitle('Server Status') .addField('Server IP', response.host) .addField('Server Version', response.version) .addField('Online Players', response.onlinePlayers) .addField('Max Players', response.maxPlayers); message.reply({ embeds: [Embed] }); } catch (error) { console.error('查询MC服务器出错:', error); message.reply('查询服务器状态失败,请检查服务器是否正常运行。'); } break; } }); bot.login(token);
额外注意事项
- 执行代码前请确保已经安装对应依赖:
npm i discord.js@13 minecraft-server-util - 如果使用Discord.js v14版本,意图声明写法需要对应调整为
GatewayIntentBits.Guilds、GatewayIntentBits.GuildMessages、GatewayIntentBits.MessageContent,同时需要引入GatewayIntentBits - 不要直接抛出未捕获的错误,否则会导致机器人进程直接崩溃
内容的提问来源于stack exchange,提问作者Bread_butter
相关产品推荐
相关产品推荐

