You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 02:18:01