【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 () {
// })
相关推荐
浪裡遊13 分钟前
Nivo图表库全面指南:配置与用法详解
前端·javascript·react.js·node.js·php
weixin_405023372 小时前
包资源管理器NPM 使用
前端·npm·node.js
Q_Q5110082858 小时前
python+django/flask婚纱摄影拍照管理系统
spring boot·python·django·flask·node.js·php
长空任鸟飞_阿康8 小时前
Node.js 核心模块详解:fs 模块原理与应用
前端·人工智能·ai·node.js
CS Beginner8 小时前
【node】运行windows7下的高版本node.js
node.js
水冗水孚11 小时前
fastify-sse-v2搭配EventSource实现SSE中的AI流式回复打字机效果&Fetch+ReadableStream+Chunked分块也可实现
node.js
小于小于091211 小时前
npx 与 npm 区别
前端·npm·node.js
Shi_haoliu12 小时前
Vue2 + Office Add-in关于用vue项目于加载项控制excel单元格内容(Demo版)
前端·javascript·vue.js·node.js·html·excel·office
aesthetician16 小时前
Node.js v25 重磅发布!革新与飞跃:深入探索 JavaScript 运行时的未来
javascript·node.js·vim
代码搬运媛1 天前
【架构相关】tsconfig.json 与 tsconfig.node.json、tsconfig.app.json 的关系和作用
node.js·json