【Node.js】定时任务

Cron表达式

Cron表达式是用于表示定时任务的一种语法。它由6个字段组成,按顺序分别表示分、时、日、月、周几和年份。

sh 复制代码
*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    │
│    │    │    │    │    └── 星期(0 - 6,0表示星期日)
│    │    │    │    └───── 月份(1 - 12)
│    │    │    └────────── 日(1 - 31)
│    │    └─────────────── 小时(0 - 23)
│    └──────────────────── 分钟(0 - 59)
└───────────────────────── 秒(0 - 59)
  • 秒(0-59)
  • 分(0-59)
  • 时(0-23)
  • 日(1-31)
  • 月(1-12)
  • 周几(0-7,其中0和7都表示周日)
  • 年份(可选,1970-2099)

除了基本的数字之外,Cron表达式还支持以下特殊的符号:

  • 星号(*):表示匹配任意值。例如,使用星号(*)表示分字段,表示每分钟都触发。
  • 逗号(,):表示枚举值。例如,使用1,3,5表示分字段,表示在第1、3、5分钟执行。
  • 连字符(-):表示范围。例如,使用10-20表示分字段,表示在第10到20分钟之间执行。
  • 正斜线(/):表示步长值。例如,使用0/2表示秒字段,表示每2秒执行一次。
  • 问号(?):用于日和周几字段,表示任意值。在日和周几字段中只能有一个是问号。
  • L:表示最后。例如,使用L表示日字段,表示本月的最后一天执行。在周几字段中,L表示本周的最后一天(周六)。
  • W:表示工作日。例如,使用3W表示日字段,表示最接近3号的工作日执行。如果3号是周六,则任务将会在最近的上周五执行。
  • #:表示第几个。例如,使用3#2表示周几字段,表示每月的第2个周几执行。

定时任务使用场景

定时任务在实际应用中非常常见,以下列举了一些常见的定时任务应用场景:

  1. 数据备份:定时将重要的数据备份到远程服务器,以防止数据丢失或损坏。
  2. 日志清理:定时清理过期的日志文件,以释放磁盘空间并维护系统正常运行。
  3. 批量任务:定时执行批量处理任务,如数据导入导出、邮件发送等。
  4. 数据同步:定时将数据从一个系统同步到另一个系统,保持数据的一致性。
  5. 定时通知:定时发送通知或提醒,如生日祝福、任务提醒等。
  6. 自动化测试:定时运行自动化测试脚本,确保系统功能正常。
  7. 数据统计:定时统计数据,生成报表或分析结果,用于业务决策。

定时任务

先安装 npm install node-schedulenpm install request

小案例

我这里是用了定时任务 + 邮件服务,在初恋生日当天 0 时 0 分,给她发了一封邮件(痛,太痛了😭

邮件服务具体用法见 http 邮件服务,这里就不再赘述了。

复制代码
import schedule from 'node-schedule'
import yaml from "js-yaml";
import nodemailer from "nodemailer";
import http from "http";
import url from "url";
import fs from 'fs'
import request from 'request'

const userInfo = yaml.load(fs.readFileSync('./user.yaml', 'utf8'))
//初始化邮件服务
const transport = nodemailer.createTransport({
    service: 'qq',  // 服务商
    host: 'smtp.qq.com',  //主机
    port: 465,
    secure: true,
    auth: {
        user: userInfo.user,  // 邮箱账号
        pass: userInfo.pass  // 密码 / 授权码
    }
})

schedule.scheduleJob('0 0 0 20 5 *', function () {
    request({
        url: 'http://localhost:3000/send/mail',
        method: 'POST',
        // 注:这里需要使用字符串,直接使用对象类型会报错
        body: JSON.stringify({
            to: "xxxx@qq.com",
            subject: "标题",
            text: "我想你了,你还好吗。那天分别之后,你就一句话也没说..."
        })
    },function (err,response, body) {
        console.log('邮件已发送')
    })
})
http.createServer(async (req, res) => {
    const {method} = req
    const {pathname} = url.parse(req.url)
    if (method === 'POST' && pathname === '/send/mail') {
        let data = ''
        req.on('data', chunk => {
            data += chunk
        })
        req.on('end', () => {
            const {to, subject, text} = JSON.parse(data)
            transport.sendMail({
                to,
                from: userInfo.user,
                subject,
                text
            })
            res.end('ok')
        })
    }
}).listen(3000, () => {
    console.log('listening on port 3000')
})

// 定时任务:
// schedule.scheduleJob('*/2 * * * * *', function () {
// })
// schedule.cancelJob('*/2 * * * * *', function () {
// })
相关推荐
没事别瞎琢磨26 分钟前
十、统一 Runner 入口——能力检测与模式回退
人工智能·node.js
没事别瞎琢磨36 分钟前
八、环境隔离——构建安全的子进程环境
人工智能·node.js
没事别瞎琢磨2 小时前
六、输出捕获与截断
人工智能·node.js
没事别瞎琢磨2 小时前
七、敏感路径预检——Protected Paths
人工智能·node.js
没事别瞎琢磨2 小时前
五、进程执行——spawn、超时与进程树清理
人工智能·node.js
没事别瞎琢磨2 小时前
四、命令风险分级与审批策略
人工智能·node.js
没事别瞎琢磨2 小时前
三、配置系统——默认值与解析
人工智能·node.js
右耳朵猫AI4 小时前
Node.js周刊2026W22 | Node.js 26、Deno 2.8、Rolldown 1.0、TypeORM 1.0、Bun v1.3.14
node.js
没事别瞎琢磨4 小时前
二、类型系统——给所有概念起名字
人工智能·node.js
Java.熵减码农7 小时前
Hermes Agent 安装踩坑记录:DNS 解析失败 & Node.js 幽灵文件冲突
node.js·ai编程·hermes