在 Node.js 中实现作业调度程序

2025-06-05

在 Node.js 中实现作业调度程序

在本文中,我们将了解什么是作业调度程序以及如何在 Node.js 中实现作业调度程序。在 Node.js 中实现作业调度程序

最近有一篇关于 Nodejs 的文章,

面向 Node.js 开发人员的 PM2

使用 webRTC 和 Node.js 构建 P2P 视频聊天应用程序

通过用例理解 Node.js 中的 EventEmitter

您是否曾经好奇过,应用服务器如何在不发生任何物理中断的情况下定期备份文件?这就是 Cron 作业的作用所在。

Cron Jobs 定期安排一项作业来执行配置的操作。

有几个用例需要 cron 任务发挥重要作用。它们是:

  • 删除日志文件- 应用程序生成大量日志。清除旧日志将节省服务器中的大量空间。可以使用 cron 作业来完成。
  • 数据库备份- 数据库备份可防止应用程序遭受灾难。Cron 作业将有助于实现这一点。
  • 应用程序逻辑- 我们可以使用 cron 作业根据时间执行一些应用程序逻辑。

cron 作业如何工作

我们将编写一个 cron 作业来在生产应用程序中存档数据库中的旧记录。

首先,创建一个项目并安装以下依赖项,

npm init --yes
npm install express node-cron mongoose faker
  • express - Node.js 中的 Web 服务器库
  • node-cron - nodejs 中的 cron 作业调度程序库
  • mongoose - MongoDB 的 ORM

之后,创建一个名为Model.js的文件并添加以下代码

const mongoose = require('mongoose');

const weatherSchema = new mongoose.Schema({
    minTemp : {
        type: Number
    },
    maxTemp : {
        type : Number
    },
    recordedDate : {
        type : Date
    },
    isArchived : {
        type : Boolean,
        default : false
    }
});

class Weather {

    static getRec(date) {
        return this.find({
            recordedDate : {
                '$lte' :new Date(date)
            }
        }).exec();
    }

    static insertBulkData(data){
        return this.insertMany(data);
    }

    static archiveData(date){
        
        return this.updateMany({
            recordedDate : {
                '$lte' :new Date(date)
            }
        },{
            $set : {
                isArchived : true
            }
        }).exec();
    }

    static getArchivedData(){
        return this.find({
            isArchived : true
        }).exec();
    }
}

weatherSchema.loadClass(Weather);

module.exports = mongoose.model('Weather',weatherSchema)

主要是,Model.js为数据库中存储天气数据的 DB 表创建了一个 mongoose 模式。

之后,创建一个名为scheduler.js的文件并添加作业调度程序的代码。

cron.schedule("* * * * * *",() => {
    console.log("Running every minute");
})

cron Schedule 按照提到的时间格式安排作业。

要了解有关 cron 作业格式的更多信息,有一个很棒的网站crontab-guru,其中有详细的解释

将 mongoose 与 Express 连接起来,向数据库插入一些虚拟数据。

const cron = require('node-cron');
const express = require('express');
const mongoose = require('mongoose');
const app = express();
const faker = require('faker');
const model = require('./Model');


mongoose.connect('mongodb://localhost:27017/nodescheduler').then((res) => {

    console.log('mongoose connected successfully');

    app.get("/insertdata",async (req,res) => {
        let data = [];
        for(let i=0;i < 100;i++){
            let record = {
                minTemp: faker.random.number(),
                maxTemp : faker.random.number(),
                recordedDate : faker.date.past()
            }
            data.push(record);
        }

        await model.insertBulkData(data);

        res.send("Data is inserted");
    })

    app.listen(4000,() => {
        console.log("Server is running port 4000");
    })
    

})
.catch((err) => {
    console.error(err);
})

要使用fakerjs插入一些虚拟数据,请使用以下命令运行脚本,然后访问 URL http://localhost:4000/insertdata

node scheduler.js

它将创建一些批量虚拟数据来测试作业调度程序。现在是时候添加作业调度程序了。

cron.schedule("* * * * */3 *",async() => {

    var d = new Date();
    d.setMonth(d.getMonth() - 2); //1 month ago
    
    await model.archiveData(d);

    console.log("scheduler => archived");  
})

上述 cron 作业将每 3 个月运行一次,以将数据标记为已在数据库中存档。

同样,我们可以使用 cron 作业来为我们的应用程序逻辑安排作业。

概括

最重要的是,cron 作业在某些应用程序开发用例中发挥着至关重要的作用。了解 cron 作业在应用程序开发中的工作原理总是有好处的。

如果你想以最小的努力实现生产级标准的作业调度程序,我建议你查看bree

参考:https://crontab.guru

文章来源:https://dev.to/ganeshmani/implementing-job-schedulers-in-node-js-j2f
PREV
面向前端开发人员的 Nginx - 超越基础知识
NEXT
React-Table 如何使用 React Table 和 TailwindCSS 构建可操作的数据表