Heroku上Node.js Discord Bot全局变量丢失问题求助
问题原因
Heroku的所有Dyno(包括你升级的Basic版本)都会定期重启——官方默认每天至少重启一次,遇到资源调度调整、平台维护等情况也会触发重启。你的全局变量存在Node.js进程的内存里,一旦Dyno重启,进程重新启动,内存里的所有数据都会被清空,这就是间隔久了第二个命令失败的核心原因。
你之前误以为只有Worker Dyno休眠才会丢失数据,但休眠是Dyno停止运行,重启则是完全重新加载进程,两种情况都会导致内存数据丢失;而且Basic Dyno不会休眠,但重启机制依然存在。
解决方案
放弃用内存全局变量存储时间,改用持久化存储方案:
- Heroku PostgreSQL:Heroku提供免费的PostgreSQL实例,适合存储结构化数据,你可以创建一张简单的表,专门记录设置的时间戳。
- Redis:如果只是存单个键值对,Redis更轻量、读写速度快,Heroku也有免费的Redis附加组件可选。
- 不推荐本地文件存储:Heroku的Dyno文件系统是临时的,重启后文件会恢复到部署时的初始状态,存文件同样会丢失数据。
实现示例(以Redis为例,伪代码):
设置命令:
// 连接Redis const redis = require('redis'); const client = redis.createClient(process.env.REDIS_URL); // 记录时间 client.set('recorded_time', Date.now().toString(), (err) => { if (err) { /* 处理错误逻辑 */ } // 发送Discord提示消息 });
获取命令:
client.get('recorded_time', (err, storedTime) => { if (!storedTime) { /* 返回失败提示 */ } const timeDiff = Date.now() - parseInt(storedTime); // 转换为易读时长并发送消息 });
内容的提问来源于stack exchange,提问作者Tom S.
相关产品推荐
相关产品推荐

