介绍
cron
提供了一种以特定时间间隔重复任务的方法。可能存在需要每天或每周进行的重复性任务,例如日志记录和执行备份。
cron
在 Node.js 服务器上实现的一种方法是使用node-cron
模块。这个库使用的crontab
语法对于以前cron
在类 Unix 操作系统中使用过的用户来说可能很熟悉。
在本文中,您将构建一个定期从服务器删除日志文件的小应用程序。您还将看到另外两个用例 – 备份数据库和发送预定的电子邮件。
先决条件
要完成本教程,您需要:
- Node.js 的本地开发环境。遵循如何安装 Node.js 并创建本地开发环境。
本教程已通过 Node v14.2.0、npm
v6.14.5、express
v4.17.1 和node-cron
v2.0.3 验证。
第 1 步 – 创建节点应用程序并安装依赖项
首先,通过打开终端并为您的项目创建一个新文件夹来创建一个新的 Node 应用程序:
- mkdir cron-jobs-node
接下来,切换到新的项目目录:
- cd cron-jobs-node
然后初始化它,这将创建一个package.json
文件,您将使用该文件来跟踪依赖项:
- npm init -y
通过运行以下命令添加express
Web 框架和node-cron
模块:
- npm install express@4.17.1 node-cron@2.0.3
该express
模块为您将构建的网络服务器提供动力。该node-cron
模块是任务调度程序。
安装了项目依赖项。让我们构建服务器。
第 2 步 – 构建后端服务器并安排任务
现在,您可以构建服务器并使用它node-cron
来安排每分钟运行一次的任务。
创建一个index.js
文件:
- nano index.js
然后,要求node-cron
和express
:
const cron = require('node-cron');
const express = require('express');
并创建一个 Express 实例:
// ...
app = express();
app.listen(3000);
接下来,将以下代码行添加到您的index.js
文件中的app
声明和之间app.listen
:
// ...
app = express();
// Schedule tasks to be run on the server.
cron.schedule('* * * * *', function() {
console.log('running a task every minute');
});
app.listen(3000);
这些星号是crontab
表示不同时间单位的语法的一部分:
* * * * * *
| | | | | |
| | | | | day of week
| | | | month
| | | day of month
| | hour
| minute
second ( optional )
单个星号的作用类似于通配符。这意味着应该为该时间单位的每个实例运行该任务。五个星号 ( '* * * * *'
) 表示crontab
每分钟运行一次的默认值。
星号位置的数字将被视为该时间单位的值。允许您安排每天和每周或更复杂的任务
在如何使用 Cron 在 VPS 上自动化任务中了解有关此符号如何工作的更多信息。
现在,运行服务器:
- node index.js
您将得到以下结果:
Outputrunning a task every minute
running a task every minute
running a task every minute
...
您有一个每分钟运行一次的示例任务。您可以使用CTRL+C
.
现在,让我们更详细地了解如何运行任务。
步骤 3 — 删除错误日志
考虑这样一个场景,您需要在每个月的第 21 天定期从服务器中删除日志文件。您可以使用node-cron
.
创建一个名为 的示例日志文件error.log
:
- nano error.log
然后,添加一条测试消息:
This is an example error message that should be removed on the twenty-first day of the month.
接下来,回顾index.js
:
- nano index.js
此任务将使用fs
到unlink
一个文件。将其添加到文件顶部:
const cron = require('node-cron');
const express = require('express');
const fs = require('fs');
然后,注释掉或删除您之前的示例任务:
// ...
// Schedule tasks to be run on the server.
// cron.schedule('* * * * *', function() {
// console.log('running a task every minute');
// });
app.listen(3000);
接下来,添加以下代码行:
// ...
// 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');
});
});
app.listen(3000);
注意模式:0 0 21 * *
。
- 它将分钟和小时的值定义为
0
和0
(“00:00” – 一天的开始)。 - 它将 day 的值定义为
21
。 - 它不定义月份或一周中的某一天。
现在,运行服务器:
- node index.js
在本月的 21 日,您将获得以下输出:
Output---------------------
Running Cron Job
Error file successfully deleted
您可能不想等到本月二十一点来验证任务是否已执行。您可以修改调度程序以在更短的时间间隔内运行。
检查您的服务器目录。该error.log
文件应该被删除。
您可以在调度程序中运行任何操作。操作范围从创建文件到发送电子邮件和运行脚本。让我们来看看更多的用例。
步骤 4 — 探索使用node-cron
备份数据库
确保保存用户数据对任何企业都非常关键。如果发生不可预见的事件并且您的数据库损坏或损坏,您将需要从备份中恢复您的数据库。如果您的企业没有任何形式的现有备份,您将遇到严重的麻烦。
考虑这样一个场景,您需要在每天晚上 11:59 定期备份数据库的转储。您可以使用node-cron
.
注意:此用例需要设置本地数据库。由于这超出了本文的范围,因此不讨论安装和设置过程的更详细的细节。
假设您已在您的环境中安装并运行 SQLite。用于进行数据库备份的 shell 命令可能类似于:
- sqlite3 database.sqlite .dump > data_dump.sql
此命令获取数据库,database.sqlite
并运行该.dump
命令,并将结果输出为名为的文件data_dump.sql
接下来,安装shelljs
一个 Node 模块,它允许你运行之前的 shell 命令:
- npm install shelljs@0.8.4
接下来,回顾index.js
:
- nano index.js
然后,要求shelljs
:
const cron = require('node-cron');
const express = require('express');
const fs = require('fs'); // previous example
const shell = require('shelljs');
接下来,添加以下代码行:
// ...
// 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');
}
});
app.listen(3000);
注意模式:59 23 * * *
。
- 它将分钟的值定义为
59
。 - 它将小时值定义为
23
(或11 PM
24 小时制)。 - 它没有定义一天、一个月或一周中的某一天。
此代码将运行备份 shell 命令。如果有错误,它将退出。如果成功,它会回显一条消息。
现在,运行服务器:
- node index.js
在晚上 11:59,您将获得以下输出:
Output---------------------
Running Cron Job
Database backup complete
您可能不想等到晚上 11:59 来验证任务是否已执行。您可以修改调度程序以在更短的时间间隔内运行。
检查您的服务器目录。data_dump.sql
应该有一个文件。
接下来,让我们看看发送定期电子邮件。
第 5 步 – 探索使用node-cron
发送预定电子邮件
考虑这样一个场景,您策划一个有趣的链接列表,然后每周三通过电子邮件将它们发送给订阅者。您可以使用node-cron
.
您将需要来自受支持的 SMTP 服务之一的电子邮件帐户。
警告:强烈建议避免在此步骤中使用您的个人电子邮件帐户。互联网上的快速解决方案可能会引导您降低安全措施。考虑使用新的独立开发者帐户以避免对您的个人电子邮件帐户造成任何风险。
接下来,安装nodemailer
一个 Node 模块,允许您发送电子邮件:
- npm install nodemailer@6.4.11
接下来,回顾index.js
:
nano index.js
然后,要求nodemailer
:
const cron = require('node-cron');
const express = require('express');
const fs = require('fs'); // previous example
const shell = require('shelljs'); // previous example
const nodemailer = require('nodemailer');
添加定义邮件程序并设置电子邮件帐户的用户名和密码的部分:
// ...
// Create mail transporter.
let transporter = nodemailer.createTransport({
host: 'your_demo_email_smtp_host.example.com',
port: your_demo_email_port,
secure: true,
auth: {
user: '[email protected]',
pass: 'your_demo_email_password'<^>
}
});
app.listen(3000);
警告:此步骤仅用于示例目的。在生产环境中,您将使用环境变量来保密您的密码。不要在您上传到代码存储库(如 GitHub)的任何代码中保存您的密码(凭据)。
接下来,添加以下代码行:
// ...
// Sending emails every Wednesday.
cron.schedule('0 0 * * 3', function() {
console.log('---------------------');
console.log('Running Cron Job');
let messageOptions = {
from: '[email protected]',
to: '[email protected]',
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!');
}
});
});
app.listen(3000);
注意模式:0 0 * * 3
。
- 它将分钟和小时的值定义为
0
和0
(“00:00” – 一天的开始)。 - 它不定义月份或月份中的某一天。
- 它将星期几的值定义为
'3'
(星期三)。
此代码将使用提供的凭据从[email protected]
向发送电子邮件[email protected]
。主题行:'Scheduled Email'
和正文:'Hi there. This email was automatically sent by us.'
。或者如果失败则记录错误。
现在,运行服务器:
- node index.js
在星期三,您将获得以下输出:
Output---------------------
Running Cron Job
Email successfully sent!
您可能不想等到星期三来验证任务是否已执行。您可以修改调度程序以在更短的时间间隔内运行。
检查收件人的电子邮件。'Scheduled Email'
收件箱中应该有一个新的。
结论
在本文中,您学习了如何使用node-cron
在 Node.js 服务器上调度作业。
向您介绍了以一致和可预测的方式自动化重复性任务的更广泛概念。这个概念可以应用于您当前和未来的项目。
还有其他可用的任务调度程序工具。请务必对其进行评估,以确定哪种工具最适合您的特定项目。
如果您想了解有关 Node.js 的更多信息,请查看我们的 Node.js 主题页面以获取练习和编程项目。