Discord Bot无报错但不发送Minecraft服务器状态通知求助
问题排查与解决
核心问题分析
你的代码存在几个关键问题,导致无法触发消息发送逻辑:
1. Axios请求URL缺少协议头
你直接使用monkecraftsmp.feathermc.gg作为请求地址,Axios会将其视为相对路径而非完整URL,导致请求始终失败。但初始状态isServerOnline为false,所以catch块里的下线通知逻辑不会执行,自然没有任何日志或消息输出。
2. 频道获取依赖缓存可能失效
client.channels.cache.get()依赖Discord.js的本地缓存,如果机器人启动后频道缓存未加载完全,会返回undefined,调用send()时会静默失败(v12中未捕获的Promise错误不会直接抛出到控制台)。
3. 错误处理不完整
catch块中仅处理了服务器从在线变离线的情况,未记录请求失败的具体原因,无法排查请求本身的问题。
4. 错误的MC服务器状态检测方式
通过请求网页状态判断MC服务器是否在线并不准确——网页服务和MC游戏服务是独立的,网页上线不代表MC服务器正在运行。
修改后的代码
const Discord = require('discord.js'); const client = new Discord.Client(); const net = require('net'); // 用TCP连接检测MC服务器状态,更准确 const CHANNEL_ID = '917953832431026276'; const MC_SERVER_HOST = 'monkecraftsmp.feathermc.gg'; const MC_SERVER_PORT = 25565; // MC默认端口,若有修改请替换 let isServerOnline = false; client.on('ready', () => { console.log(`Bot is ready!`); // 启动时先检测一次状态 checkServerStatus(); }); // 用TCP连接检测MC服务器状态,比网页请求更准确 function checkServerStatus() { const socket = new net.Socket(); let status = false; socket.setTimeout(3000); // 3秒超时 socket.on('connect', () => { status = true; socket.destroy(); }); socket.on('timeout', () => { socket.destroy(); }); socket.on('error', () => { status = false; }); socket.on('close', () => { updateServerStatus(status); }); socket.connect(MC_SERVER_PORT, MC_SERVER_HOST); } async function updateServerStatus(newStatus) { if (newStatus !== isServerOnline) { isServerOnline = newStatus; const message = newStatus ? '✅ Server is online' : '🛑 Server has stopped'; console.log(message); // 用fetch确保获取到频道,避免缓存问题 try { const channel = await client.channels.fetch(CHANNEL_ID); await channel.send(message); } catch (err) { console.error('发送消息失败:', err); } } } // 每6秒检测一次 setInterval(checkServerStatus, 6000); // 别忘了登录机器人 client.login('你的机器人令牌'); // 确保这里已正确填入令牌
关键修改说明
- 替换状态检测方式:使用Node.js内置的
net模块通过TCP连接检测MC服务器端口,这是判断MC服务器是否在线的标准方法。 - 修复URL问题:移除了不准确的Axios网页请求,改用TCP连接。
- 确保频道获取成功:用
client.channels.fetch()替代cache.get(),强制从Discord API拉取频道信息,避免缓存缺失问题。 - 完善错误处理:添加了消息发送失败的错误日志,便于排查权限或频道存在性问题。
- 启动时初始化检测:机器人就绪后立即检测一次服务器状态,避免初始状态延迟。
额外检查项
- 确保机器人具有发送消息的权限,且目标频道未设置权限阻止机器人发言。
- 确认MC服务器端口正确(默认25565,若服务器修改过端口需同步调整)。
内容的提问来源于stack exchange,提问作者normaluser
相关产品推荐
相关产品推荐

