如何使用React JS自动删除Firestore中创建超过2天的文档
实现方案
首先需要先调整你存储过期时间的格式,你当前存的是DD/MM/YYYY格式的字符串,无法直接用于数据库的范围查询,会导致筛选过期文档的逻辑无法实现。
第一步:修改创建房间的存储逻辑
将expire字段改为ISO标准时间格式存储,展示给用户的时间可以单独格式化,不影响存储结构:
const getlink = () => { // 生成48小时后的ISO标准时间,用于数据库存储和查询 const exp = new Date(Date.now() + 48 * 60 * 60 * 1000).toISOString(); const uid = uuid(); db.collection("rooms").doc(uid).set({ roomId: uid, expire: exp, // 可选添加创建时间字段,方便后续问题排查 createdAt: new Date().toISOString() }); // 格式化出你需要的DD/MM/YYYY格式用于提示 const showExp = new Date(exp).toLocaleDateString('en-GB'); alert(`🚨Your (RoomId) is: \n${uid}\n\n⚠️ Your Room will expire on - ${showExp}`); history.push("/"); }
第二步:选择适合的清理实现方式
方案1:数据库自动清理(最推荐)
如果你使用的是Firestore、MongoDB这类支持TTL(生存时间)特性的数据库,直接给rooms集合的expire字段配置TTL规则即可:
- Firestore直接在控制台的TTL策略里添加
rooms集合,关联expire字段,设置过期后立即删除即可 - MongoDB给
expire字段创建TTL索引,设置expireAfterSeconds: 0即可
数据库会自动识别到期的文档并后台删除,不需要你写任何定时任务逻辑,也不会依赖前端运行状态。
方案2:前端函数式组件内置定时任务
如果你没有后端服务,想要在前端实现每天凌晨0点的清理逻辑,可以在根组件的useEffect里添加定时器实现:
import { useEffect } from 'react'; function App() { useEffect(() => { // 过期房间删除逻辑 const deleteExpiredRooms = async () => { const now = new Date().toISOString(); // 筛选所有过期的房间文档 const expiredSnapshot = await db.collection('rooms').where('expire', '<', now).get(); if (expiredSnapshot.empty) return; // 批量删除减少数据库请求次数 const batch = db.batch(); expiredSnapshot.docs.forEach(doc => batch.delete(doc.ref)); await batch.commit(); }; // 计算距离下一次凌晨0点的毫秒数 const getMidnightGap = () => { const now = new Date(); const nextMidnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0); return nextMidnight.getTime() - now.getTime(); }; // 页面加载后先执行一次清理 deleteExpiredRooms(); // 首次到凌晨0点触发清理,之后每24小时执行一次 const timeoutTimer = setTimeout(() => { deleteExpiredRooms(); setInterval(deleteExpiredRooms, 24 * 60 * 60 * 1000); }, getMidnightGap()); // 组件卸载时清除定时器避免内存泄漏 return () => clearTimeout(timeoutTimer); }, []); // 你的原有应用逻辑 return <>{/* 应用内容 */}</>; } export default App;
注意:前端实现的定时任务只有在用户打开你的应用时才会运行,如果长时间没有用户访问,过期文档不会被清理,仅适合用户访问频率较高的场景。
方案3:后端定时任务
如果你有Node.js后端,可以用node-schedule库实现定时任务,逻辑和前端的删除逻辑一致,调度规则设置为每天0点执行即可:
const schedule = require('node-schedule'); // 每天0点执行 schedule.scheduleJob('0 0 * * *', async () => { const now = new Date().toISOString(); const expiredSnapshot = await db.collection('rooms').where('expire', '<', now).get(); const batch = db.batch(); expiredSnapshot.docs.forEach(doc => batch.delete(doc.ref)); await batch.commit(); });
内容的提问来源于stack exchange,提问作者Spandan Manna
相关产品推荐
相关产品推荐

