如何使用node.js实现每10分钟检测API数据变化并发送邮件通知?
Node.js 实现API定时监控与变更通知方案
整体逻辑分为三个模块:定时任务调度、API数据拉取与变更比对、邮件通知,以下是可直接运行的实现方案:
1. 依赖安装
需要用到的第三方包如下:
node-cron:成熟的定时任务调度库,支持标准cron表达式,比原生setInterval的任务管控能力更强axios:用于发送HTTP请求拉取API数据nodemailer:用于发送邮件通知- Node.js内置的
crypto模块用于计算数据哈希,无需额外安装
执行命令安装依赖:
npm install node-cron axios nodemailer
2. 核心实现代码
const cron = require('node-cron'); const axios = require('axios'); const crypto = require('crypto'); const nodemailer = require('nodemailer'); // 全局配置项,可根据自身需求修改 const CONFIG = { TARGET_API: '你要监控的API完整地址', // cron表达式:分 时 日 月 周,*/10 * * * * 代表每10分钟执行一次 CRON_RULE: '*/10 * * * *', EMAIL_CONFIG: { // 以163邮箱为例,QQ邮箱替换host为smtp.qq.com即可 host: 'smtp.163.com', port: 465, secure: true, auth: { user: '你的发件邮箱地址@163.com', // 注意此处为邮箱SMTP授权码,不是登录密码,需要在邮箱设置中开启SMTP服务后获取 pass: '你的邮箱SMTP授权码' }, receiver: '接收通知的邮箱地址@xxx.com' } } // 存储上一次数据的哈希值,生产环境建议持久化存储到本地文件/Redis/数据库 let lastDataHash = null; // 计算数据的MD5哈希,用于快速比对数据是否变更 const calcDataHash = (data) => { return crypto.createHash('md5').update(JSON.stringify(data)).digest('hex'); } // 发送变更通知邮件 const sendAlertMail = async (newData) => { const transporter = nodemailer.createTransport(CONFIG.EMAIL_CONFIG); await transporter.sendMail({ from: `API数据监控通知 <${CONFIG.EMAIL_CONFIG.auth.user}>`, to: CONFIG.EMAIL_CONFIG.receiver, subject: '监控的API数据已发生变更', html: ` <h3>你监控的API数据有更新</h3> <p>最新数据内容如下:</p> <pre>${JSON.stringify(newData, null, 2)}</pre> ` }) } // 单次监控任务执行逻辑 const runMonitorTask = async () => { try { // 拉取API数据 const apiRes = await axios.get(CONFIG.TARGET_API, { // 如果API需要鉴权,在这里加headers参数即可,比如Authorization字段 }); const currentData = apiRes.data; const currentHash = calcDataHash(currentData); // 首次运行仅记录初始哈希,不触发通知 if (lastDataHash === null) { lastDataHash = currentHash; console.log('监控服务启动成功,已记录初始数据状态'); return; } // 哈希不一致判定为数据变更 if (currentHash !== lastDataHash) { console.log('检测到数据变更,正在发送通知邮件'); await sendAlertMail(currentData); lastDataHash = currentHash; // 更新哈希为最新值 } else { console.log('本次检查未发现数据变更'); } } catch (err) { console.error('监控任务执行出错:', err.message); } } // 启动定时任务 cron.schedule(CONFIG.CRON_RULE, runMonitorTask); console.log('API数据监控服务已启动,每10分钟检查一次');
3. 注意事项
- 如果需要服务重启后依然能正常比对历史数据,不要把
lastDataHash存在内存中,可持久化存储到本地JSON文件、Redis或者数据库,服务启动时先读取历史存储的哈希值即可 - 如果不想引入额外的定时任务依赖,也可以用原生
setInterval(runMonitorTask, 10 * 60 * 1000)实现定时,但生产环境更推荐用node-cron,避免任务执行超时导致的调度堆叠问题 - 部署到生产环境时建议用
pm2托管Node进程,避免服务意外退出
内容的提问来源于stack exchange,提问作者rocking
相关产品推荐
相关产品推荐

