如何使用node-cron在Node.js中运行计划作业

来自菜鸟教程
跳转至:导航、​搜索

介绍

cron 提供了一种以特定时间间隔重复任务的方法。 可能存在需要每天或每周或每月进行的重复性任务,例如记录和执行备份。

在 Node.js 服务器上实现 cron 的一种方法是使用 node-cron 模块。 该库使用 crontab 语法,以前在类 Unix 操作系统中使用 cron 的用户可能会熟悉该语法。

在本文中,您将使用 node-cron 定期从服务器中删除日志文件。 您还将看到另外两个常见用例 - 备份数据库和发送预定的电子邮件。

先决条件

要完成本教程,您需要:

  • Node.js 的本地开发环境。 关注【X7X】如何安装Node.js并创建本地开发环境【X76X】。

本教程已使用 Node v17.2.0、npm v8.1.4、node-cron v2.0.3、shelljs v0.8.4 和 nodemailer v6.7.2 进行了验证.

第 1 步 - 创建节点应用程序并安装依赖项

首先,通过打开终端并为您的项目创建一个新文件夹来创建一个新的 Node 应用程序:

mkdir node-cron-example

接下来,切换到新的项目目录:

cd node-cron-example

然后初始化它,这将创建一个 package.json 文件,您将使用它来跟踪依赖关系:

npm init --yes

通过运行以下命令添加 node-cron 模块:

npm install node-cron@3.0.0

node-cron 模块是任务调度器。

已安装项目依赖项。 让我们构建服务器。

第 2 步 — 安排任务

现在,您可以构建服务器并使用 node-cron 安排任务每分钟运行一次。

创建一个新的 cron-ping.js 文件:

nano cron-ping.js

然后,要求 node-cron

cron-ping.js

const cron = require('node-cron');

接下来,将以下代码行添加到 cron-ping.js

cron-ping.js

// ...

// Schedule tasks to be run on the server.
cron.schedule('* * * * *', function() {
  console.log('running a task every minute');
});

这些星号是 crontab 语法的一部分,用于表示不同的时间单位:

  * * * * * *
  | | | | | |
  | | | | | day of week
  | | | | month
  | | | day of month
  | | hour
  | minute
  second ( optional )

单个星号的行为类似于通配符。 这意味着该任务将针对该时间单位的每个实例运行。 五个星号 ('* * * * *') 表示 crontab 默认每分钟运行一次。

代替星号的数字将被视为该时间单位的值。 允许您安排每天和每周或更复杂的任务。

注意:如何使用 Cron 在 VPS 上自动执行任务中了解有关此符号如何工作的更多信息。


现在,运行脚本:

node cron-ping.js

几分钟后,您将获得以下结果:

Outputrunning a task every minute
running a task every minute
running a task every minute
...

您每分钟都有一个示例任务运行。 您可以使用 CTRL+C (CONTROL+C) 停止服务器。

现在,让我们更详细地看看如何运行任务。

第 3 步 — 删除错误日志

考虑一个场景,您需要在每个月的二十一天定期从服务器中删除日志文件。 您可以使用 node-cron 完成此操作。

创建一个名为 error.log 的示例日志文件:

nano error.log

然后,添加一条测试消息:

错误日志

This is an example error message that in a log file that will be removed on the twenty-first day of the month.

创建一个新的 cron-delete.js 文件:

nano cron-delete.js

此任务将使用 fsunlink 一个文件。 将其添加到文件顶部:

cron-delete.js

const cron = require('node-cron');
const fs = require('fs');

接下来,添加以下代码行:

cron-delete.js

// ...

// Remove the error.log file every twenty-first day of the month.
cron.schedule('0 0 21 * *', function() {
  console.log('---------------------');
  console.log('Running Cron Job');
  fs.unlink('./error.log', err => {
    if (err) throw err;
    console.log('Error file successfully deleted');
  });
});

注意模式:0 0 21 * *

  • 它将分钟和小时的值定义为 00(“00:00” - 一天的开始)。
  • 它将天的值定义为 21
  • 它没有定义月份或星期几。

现在,运行脚本:

node cron-delete.js

在本月的二十一天,您将获得以下输出:

Output---------------------
Running Cron Job
Error file successfully deleted

您可能不想等到本月的二十一天来验证任务是否已执行。 您可以修改调度程序以在更短的时间间隔内运行 - 例如每分钟。

检查您的服务器目录。 error.log 文件将被删除。

您可以在调度程序内运行任何操作。 从创建文件到发送电子邮件和运行脚本的各种操作。 让我们看看更多的用例。

第 4 步 — 探索使用 node-cron 备份数据库

确保保存用户数据是任何业务的关键。 如果发生意外事件并且您的数据库损坏或损坏,您将需要从备份中恢复您的数据库。 如果您的企业没有任何形式的现有备份,您将遇到严重的麻烦。

考虑一个场景,您需要在每天晚上 11:59 例行备份数据库的转储。 您可以使用 node-cron 完成此操作。

注意:这个用例需要设置一个本地 SQLite 数据库。 此处不涉及安装和创建数据库的详细信息。 随意替换为另一个 shell 命令。


假设您已在您的环境中安装并运行 SQLite。 给定一个名为 database.sqlite 的数据库,用于进行数据库备份的 shell 命令可能类似于以下内容:

sqlite3 database.sqlite .dump > data_dump.sql

此命令获取数据库 database.sqlite,并运行 .dump 命令,并将结果输出为名为 data_dump.sql 的文件

接下来,安装 shelljs,一个允许您运行之前的 shell 命令的 Node 模块:

npm install shelljs@0.8.4

创建一个新的 cron-dump.js 文件:

nano cron-dump.js

然后,要求 shelljs

cron-dump.js

const cron = require('node-cron');
const shell = require('shelljs');

接下来,添加以下代码行:

cron-dump.js

// ...

// Backup a database at 11:59 PM every day.
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');
  }
});

注意模式:59 23 * * *

  • 它将分钟的值定义为 59
  • 它将小时的值定义为 23(或 24 小时制中的 11 PM)。
  • 它没有定义一天、一个月或一周中的某一天。

此代码将运行备份 shell 命令。 如果成功,它将回显一条消息。 否则,如果出现错误,它将退出。

现在,运行脚本:

node cron-dump.js

在晚上 11:59,您将获得以下输出:

Output---------------------
Running Cron Job
Database backup complete

您可能不想等待晚上 11:59 来验证任务是否已执行。 您可以修改调度程序以在更短的时间间隔内运行。

检查您的服务器目录。 将出现一个 data_dump.sql 文件。

接下来,让我们看看发送定期电子邮件。

第 5 步 — 探索使用 node-cron 发送预定电子邮件

考虑这样一个场景,您策划一个有趣的链接列表,然后每周三将它们通过电子邮件发送给订阅者。 您可以使用 node-cron 完成此操作。

Nodemailer 支持 Ethereal Email 提供的测试账户。 创建一个 Ethereal 帐户并使用为您生成的用户名和密码。

警告:强烈建议您不要在此步骤中使用您的个人电子邮件帐户。 考虑使用新的单独测试帐户以避免对您的个人电子邮件帐户造成任何风险。


接下来,安装 nodemailer,一个允许您发送电子邮件的 Node 模块:

npm install nodemailer@6.7.2

创建一个新的 cron-mail.js 文件:

nano cron-mail.js

然后,要求 nodemailer

cron-mail.js

const cron = require('node-cron');>
const nodemailer = require('nodemailer');

添加一个定义邮件程序并设置电子邮件帐户的用户名和密码的部分:

cron-mail.js

// ...

// Create mail transporter.
let transporter = nodemailer.createTransport({
  host: 'your_demo_email_smtp_host.example.com',
  port: your_demo_email_port,
  auth: {
    user: 'your_demo_email_address@example.com',
    pass: 'your_demo_email_password'
  }
});

Warning:此步骤仅供参考。 在生产环境中,您将使用环境变量来保密您的密码。 不要将您的密码(凭证)保存在您上传到 GitHub 等代码存储库的任何代码中。


接下来,添加以下代码行:

cron-mail.js

// ...

// Sending emails every Wednesday.
cron.schedule('0 0 * * 3', function() {
  console.log('---------------------');
  console.log('Running Cron Job');

  let messageOptions = {
    from: 'your_demo_email_address@example.com',
    to: 'your_demo_email_address@example.com',
    subject: 'Scheduled Email',
    text: 'Hi there. This email was automatically sent by us.'
  };

  transporter.sendMail(messageOptions, function(error, info) {
    if (error) {
      throw error;
    } else {
      console.log('Email successfully sent!');
    }
  });
});

注意模式:0 0 * * 3

  • 它将分钟和小时的值定义为 00(“00:00” - 一天的开始)。
  • 它没有定义一个月中的某一天或一个月。
  • 它将星期几的值定义为 '3'(星期三)。

此代码将使用提供的凭据向您自己发送电子邮件。 带有主题行:'Scheduled Email' 和正文:'Hi there. This email was automatically sent by us.'。 否则,如果失败,它将记录错误。

现在,运行脚本:

node cron-mail.js

在星期三,您将获得以下输出:

Output---------------------
Running Cron Job
Email successfully sent!

您可能不想等待星期三来验证任务是否已执行。 您可以修改调度程序以在更短的时间间隔内运行。

打开 Ethereal 电子邮件邮箱。 收件箱中会有一个新的'Scheduled Email'

结论

在本文中,您学习了如何使用 node-cron 在 Node.js 服务器上调度作业。 向您介绍了以一致且可预测的方式自动执行重复性任务的更广泛概念。 这个概念可以应用于您当前和未来的项目。

还有其他可用的任务计划程序工具。 请务必对它们进行评估,以确定哪种工具最适合您的特定项目。

如果您想了解有关 Node.js 的更多信息,请查看 我们的 Node.js 主题页面 以获取练习和编程项目。