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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 13:24:03