如何用Node.js实现每24小时自动更新MongoDB并同步第三方API新账户
实现每日自动同步第三方API数据到MongoDB的方案
核心改进点
- 替换重复插入逻辑为更新/插入(Upsert),确保只同步新增或有变化的账户
- 引入定时任务工具,实现每24小时自动执行同步
步骤1:安装依赖
先安装定时任务所需的node-cron包:
npm install node-cron
步骤2:优化同步逻辑与定时任务整合
修改后的完整代码如下:
const fetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args)); const mongoose = require('mongoose'); const cron = require('node-cron'); // 数据库连接 mongoose.connect("mongodb://mymongoDBURL/mymongoDBTABLE") .then(() => console.log('MongoDB连接成功')) .catch(err => console.error('MongoDB连接失败:', err)); const postSchema = new mongoose.Schema({ id: { type: Number, required: true, unique: true // 新增唯一约束,从数据库层面避免ID重复 }, name: { type: String, required: true }, status: { type: String, required: false }, }); const Post = mongoose.model('players', postSchema); // 同步数据的核心函数 async function syncPlayers() { try { const response = await fetch("http://localhost:3008/api/players"); if (!response.ok) throw new Error(`API请求失败: ${response.status}`); const data = await response.json(); const players = data.players || []; // 批量处理每个玩家数据(Upsert:存在则更新,不存在则插入) for (const player of players) { await Post.findOneAndUpdate( { id: player.id }, // 查询条件:根据ID匹配已有数据 { name: player.name, status: player.status }, // 要更新/插入的字段内容 { upsert: true, new: true } // upsert开启插入功能,new返回更新后的文档 ); } console.log(`数据同步完成,共处理${players.length}个玩家`); } catch (err) { console.error('同步过程出错:', err); } } // 配置定时任务:每24小时执行一次(每天凌晨0点) // 定时规则说明:秒 分 时 日 月 周,0 0 * * * 表示每天0点0分触发 cron.schedule('0 0 * * *', () => { console.log('开始执行每日数据同步任务...'); syncPlayers(); }); // 可选:服务启动时立即执行一次同步,避免等待首次定时触发 syncPlayers();
关键细节说明
- 唯一约束:Schema中给
id字段添加unique: true,防止数据库出现重复ID的文档 - Upsert逻辑:
findOneAndUpdate的upsert: true参数是核心,既可以插入新账户,也能更新已有账户的最新信息 - 错误捕获:通过
try/catch处理API请求、数据库操作的异常,避免单个错误导致整个定时任务崩溃 - 定时规则调整:如果需要修改执行时间,可修改
cron.schedule的第一个参数,比如0 12 * * *表示每天中午12点执行
内容的提问来源于stack exchange,提问作者yandry santana
相关产品推荐
相关产品推荐

