用 Node.js 实现定时任务

做者:Chris Nwambajavascript

翻译:疯狂的技术宅前端

原文:scotch.io/tutorials/n…java

未经容许严禁转载node

Node.js Cron Jobs By Examples

我曾经想要在特定时间执行特定的操做,而无需亲自运行它们。webpack

在本文中,咱们将研究如何在 Node 程序中建立和使用 Cron 做业。为此咱们将建立一个简单的程序,该应用程序会自动从服务器中删除自动生成的 error.log 文件。 Cron 做业的另外一个优势是,你能够安排程序以不一样的时间间隔执行不一样的脚本。git

Cron Job每分钟运行一个任务

前提条件

要继续学习本教程,你须要具有如下条件:github

  • 在你的机器上安装的 Node
  • 在你的计算机上安装有NPM
  • JavaScript 的基础知识

入门

首先,如下命令并为项目建立一个新的 Node 程序,而后其进行初始化:web

mkdir cron-jobs-node cd cron-jobs-node
npm init -y
复制代码

安装 Node 模块

为了使程序正常工做,咱们将须要几个依赖项。你能够经过运行如下命令来安装它们:sql

npm install express node-cron fs
复制代码

express - Web 服务器shell

node-cron - 用于 node.js 的纯 JavaScript 任务计划程序

fs - 文件系统模块

构建后端服务器

建立一个 index.js 文件,而后导入必要的 Node 模块:

touch index.js
复制代码

编辑 index.js 文件,以下所示:

// index.js
const cron = require("node-cron");
const express = require("express");
const fs = require("fs");

app = express();

[...]
复制代码

这是 node-cron 的入口。咱们但愿可以按期删除错误日志文件,而没必要进行手动操做。咱们将用 node-cron 来作到这一点。首先看一个简单的任务。将如下内容添加到你的 index.js 文件中:

// index.js
[...]
 // schedule tasks to be run on the server 
 cron.schedule("* * * * *", function() {
     console.log("running a task every minute");
 });

app.listen(3128);
[...]
复制代码

如今,当咱们运行服务器时将获得如下结果:

> node index.js

running a task every minute
running a task every minute
复制代码

调度任务的时间间隔

经过 node-cron,能够安排不一样时间间隔的任务。让咱们看看如何使用不一样的时间间隔来安排任务。在上面的示例中,咱们建立了一个简单的 Cron 做业,传递给 .schedule() 函数的参数为 ​​* * * * *。这些参数在使用时具备不一样的含义:

* * * * * *
| | | | | |
| | | | | day of week
| | | | month
| | | day of month
| | hour
| minute
second ( optional )
复制代码

在这个例子中,若是想在每个月的 21 号从服务器删除日志文件,能够把 index.js 更新为以下所示:

// index.js
const cron = require("node-cron");
const express = require("express");
const fs = require("fs");

app = express();

// schedule tasks to be run on the server
cron.schedule("* * 21 * *", function() {
    console.log("---------------------");
    console.log("Running Cron Job");
    fs.unlink("./error.log", err => {
        if (err) throw err;
        console.log("Error file succesfully deleted");
    });
});

app.listen("3128");
复制代码

当服务运行时,你将得到如下输出:

Cron Job自动删除错误文件

注意:要模拟本任务,能够经过在参数中设置分钟数来将间隔设置为较短的时间

你能够在调度程序中执行任何操做。从建立文件到发送电子邮件和运行脚本的各类操做。让咱们看一下更多的用例

用例2 - 备份数据库

确保用户数据的可访问性对于任何企业都是相当重要的。万一使你的数据库由于发生意外而受到损坏,若是没有备份的话,那么一切将会变得一团糟。为了不这种状况的发生,你还能够用 Cron 做业按期备份数据库中的现有数据。让咱们来看看如何作到这一点。

为了便于说明,咱们将使用 SQLite 数据库

首先,咱们须要安装一个 Node 模块,该模块容许咱们运行shell脚本:

npm install shelljs
复制代码

还要安装SQLite:

npm install sqlite3
复制代码

如今,经过运行如下命令来建立示例数据库:

sqlite3 database.sqlite
复制代码

想要天天晚上 11:59 备份数据库,请更新你的 index.js 文件,以下所示:

// index.js
const fs = require("fs");
let shell = require("shelljs");
const express = require("express");

app = express();

// To backup a database
cron.schedule("59 23 * * *", function() {
    console.log("---------------------");
    console.log("Running Cron Job");
    if (shell.exec("sqlite3 database.sqlite .dump > data_dump.sql").code !== 0) {
        shell.exit(1);
    }
    else{
        shell.echo("Database backup complete");
    }
});
app.listen("3128");
复制代码

如今,当你用如下命令运行服务时:

node index.js
复制代码

将会获得如下结果:

正在运行数据库备份的服务器

用例3 - 每隔 一段时间发送一次电子邮件

你还能够用 Cron 做业以不一样的时间间隔发送电子邮件,使你的用户了解企业的​​最新状况。例如,你能够策划一个有趣的连接列表,而后在每一个星期日将它们发送给用户。要执行此操做,你须要执行如下操做。

经过运行如下命令来安装 nodemailer:

npm install nodemailer
复制代码

完成后,更新 index.js 文件,以下所示:

// index.js
const cron = require("node-cron");
const express = require("express");
let nodemailer = require("nodemailer");

app = express();

// create mail transporter
let transporter = nodemailer.createTransport({
    service: "gmail",
    auth: {
        user: "COMPANYEMAIL@gmail.com",
        pass: "userpass"
    }
});

// sending emails at periodic intervals
cron.schedule("* * * * Wednesday", function(){
    console.log("---------------------");
    console.log("Running Cron Job");
    let mailOptions = {
        from: "COMPANYEMAIL@gmail.com",
        to: "sampleuser@gmail.com",
        subject: `Not a GDPR update ;)`,
        text: `Hi there, this email was automatically sent by us`
    };
    transporter.sendMail(mailOptions, function(error, info) {
        if (error) {
            throw error;
        } else {
            console.log("Email successfully sent!");
        }
    });
});

app.listen("3128");
复制代码

注意:出于测试目的,你须要暂时容许 Gmail 账户进行非安全登陆。

如今,当用 node index.js 运行服务时,将获得如下结果:

服务正在运行的Cron做业

由Cron Job自动发送的电子邮件

总结

在本文中,我介绍了 Cron 做业以及如何在 Node.js 程序中使用。这是 GitHub 上的源码连接。

欢迎关注前端公众号:前端先锋,免费领取webpack从入门到进阶全系列教程。

相关文章
相关标签/搜索