使用Sails与node-cron实现热度达标后定时将archived从false改为true
实现方案
核心逻辑:不建议为每条符合条件的内容单独创建定时任务,高并发场景下会产生大量无效任务占用资源。更合理的方案是给内容表新增「热度首次达标时间」字段,再通过统一的定时任务定期扫描符合归档条件的内容批量更新。
1. 扩展Sails数据模型
首先给Bookmark模型新增两个字段,修改api/models/Bookmark.js:
module.exports = { attributes: { // 原有字段保留,新增以下字段 popularity: { type: 'number', defaultsTo: 0 }, archived: { type: 'boolean', defaultsTo: false }, // 热度首次超过15的时间,未达标则为null popularityReachThresholdAt: { type: 'ref', columnType: 'datetime', defaultsTo: null }, // 其他原有业务字段... } };
2. 改造后端热度更新接口
前端调用的PATCH /bookmarks/:id接口需要新增逻辑:判断更新后的热度是否首次达标,达标则记录时间。修改api/controllers/BookmarksController.js对应的更新逻辑:
const updatePopularity = async (req, res) => { const { id } = req.params; const { popularity } = req.body; try { const oldBookmark = await Bookmark.findOne({ id }); const updateData = { popularity }; // 首次热度>=15时记录达标时间 if (oldBookmark.popularity < 15 && popularity >= 15) { updateData.popularityReachThresholdAt = new Date(); } const updatedBookmark = await Bookmark.updateOne({ id }).set(updateData); return res.json(updatedBookmark); } catch (err) { return res.serverError(err); } };
现有前端的点击统计逻辑无需调整,所有判断逻辑均在后端实现,避免前端篡改数据。
3. 实现全局定时归档任务
首先安装依赖:npm install node-cron
Sails项目可以在服务启动钩子config/bootstrap.js中初始化全局定时任务,以下配置为每天凌晨1点执行一次扫描:
const cron = require('node-cron'); module.exports.bootstrap = async function(done) { // 其他原有启动逻辑... // cron表达式规则:秒 分 时 日 月 周 cron.schedule('0 0 1 * * *', async () => { try { // 计算7天前的时间点,可根据需求调整周期 const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); // 批量更新所有符合归档条件的记录 await Bookmark.update({ archived: false, popularity: { '>=': 15 }, popularityReachThresholdAt: { '<=': sevenDaysAgo } }).set({ archived: true }); console.log('内容归档任务执行完成'); } catch (err) { console.error('内容归档任务执行失败:', err); } }); return done(); };
如果需要更高的触发频率,调整cron表达式即可,例如每小时执行一次可以写成0 0 * * * *。
内容的提问来源于stack exchange,提问作者Michael Whelan
相关产品推荐
相关产品推荐

