UptimeRobot搭配Replit部署的Discord bot无法上线问题排查
Discord Bot Replit部署后离线无法上线排查
故障背景
- 部署目标:搭建无需本地电脑持续开机即可常驻在线的Discord Bot,参考公开部署教程完成Replit平台部署流程
- 初期运行状态:部署完成后首日运行正常,即使不打开Replit网页端,Bot也可全天稳定在线,初步判定已实现永久在线效果
- 故障表现:部署次日Bot直接离线,重启Replit项目也无法让Bot正常上线
故障项目index.js完整代码如下:
const express = require("express"); const app = express(); const discord = require("discord.js"); const client = new discord.Client({intents:["GUILDS","GUILD_MESSAGES"]}); var bump_timeout = true; app.listen(3000,()=>{ console.log("bot is online"); }); app.get("/",(req, res) =>{ res.send("hello world uwu"); }); client.on("message", message => { if(message.content === "!d bump" && bump_timeout==true){ bump_timeout = false; message.channel.send("you got 100 coins!"); setTimeout(bump_switchtimeout, 5000); } }) function bump_switchtimeout(){ bump_timeout = true; } client.on("ready", () => { console.log("bot is ready"); }) client.login(*here is the token*);
核心故障原因
按出现概率从高到低排序:
- 代码语法/版本兼容错误
- 如果实际运行代码里
client.login()的参数和示例里一样没有加字符串引号,会直接抛出语法错误,项目根本无法完成启动流程 - 代码用的是discord.js v12版本的写法:监听
message事件、直接传字符串作为intents参数,如果Replit默认安装的是v13及以上版本discord.js,这两处写法都已经被官方废弃,会直接触发运行错误导致Bot启动失败 - 代码没有添加任何全局错误监听逻辑,登录失败、接口报错、权限不足等问题都不会在控制台打印明确提示,很难直接定位崩溃点
- 如果实际运行代码里
- Replit免费实例休眠/规则拦截
- Replit免费版实例没有外部HTTP请求触发的情况下,默认1小时左右就会自动休眠停止运行,首日全天在线只是新实例的临时存活窗口期,没有配置持续心跳请求的情况下必然会休眠离线
- Replit免费版服务条款明确禁止托管长期常驻的Bot类服务,系统检测到长期运行的Bot实例后会直接强制停止项目,哪怕配置了保活心跳也可能被拦截
- Bot鉴权失败
- 如果把Bot Token硬编码在代码里,很容易因为代码泄露导致Token被Discord官方重置,旧Token会直接失效导致登录失败
- 如果没有在Discord开发者后台开启代码里配置的
GUILDS、GUILD_MESSAGES消息权限,intents校验不通过也会导致Bot登录失败
修复方案
- 第一步先打开Replit项目的运行控制台,看启动阶段抛出的具体错误日志,优先解决语法错误、依赖版本兼容问题:如果用v13+版本discord.js,需要把
message事件替换为messageCreate事件,intents参数替换为官方提供的GatewayIntentBits枚举值,不要直接传字符串 - 给Client实例添加
error、warn事件监听,把所有运行时错误打印到控制台,方便后续排查问题 - 不要把Bot Token硬编码在代码中,存储到Replit的环境变量中通过
process.env读取,避免Token泄露失效 - 免费版Replit无法实现真正的永久在线,要么升级付费版解除实例休眠限制,要么更换支持常驻进程的托管平台部署
内容的提问来源于stack exchange,提问作者squidguy
相关产品推荐
相关产品推荐

