如何用JS实现玩家骤减5000人时Discord告警?代码问题排查
问题分析与修正方案
你的代码存在的核心问题
- 逻辑判断完全颠倒:你需要检测的是玩家突然消失(在线人数大幅减少),但代码里写的
online - previouscount >= 5000是在判断在线人数增加5000以上,和需求完全相反。 - 状态无法持久化:如果这段代码是每次检查时都重新执行(比如封装在函数里每次调用都声明
let previouscount = 0),previouscount会被反复重置为0,永远无法记录上一次的在线人数,自然无法对比人数变化。 data的有效性未处理:const online = data;中的data需要确保是正确的数字类型值,如果data是字符串、对象或者未正确获取的无效值,会直接导致判断失效。
修正后的代码示例
// 将previouscount放在全局作用域或闭包中,确保多次检查时状态保留 let previouscount = 0; // 假设这是定时执行的检查函数,比如每30秒拉取一次在线人数 function checkPlayerDisappear() { // 替换为你实际获取在线人数的逻辑,强制转为数字避免类型错误 const online = Number(data); // 过滤无效数值,防止非数字导致错误判断 if (isNaN(online)) return; // 判断在线人数是否减少了5000及以上(玩家消失) if (previouscount - online >= 5000) { // 这里添加发送Discord警告的逻辑 // 示例:调用Discord Webhook发送消息 const webhookUrl = "你的Discord Webhook地址"; fetch(webhookUrl, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ content: "⚠️ 警告:5000名玩家突然从服务器消失!" }) }); } // 更新上一次的在线人数,必须放在判断之后,确保下一次对比用当前值 previouscount = online; }
额外注意事项
- 持久化状态:如果你的代码运行在无状态环境(比如云函数每次触发都重新初始化),需要用数据库、缓存(如Redis)存储
previouscount的值,否则每次触发都会重置为0。 - 频率控制:不要过于频繁执行检查,避免API调用超限或误判短时间内的人数波动。
- 错误处理:给
fetch添加错误捕获,避免发送Discord消息失败时导致程序崩溃:fetch(webhookUrl, { /* ... */ }) .catch(err => console.error("发送Discord警告失败:", err));
内容的提问来源于stack exchange,提问作者Udayana
相关产品推荐
相关产品推荐

