作者:Chris Nwamba翻译:疯狂的技术宅
原文:https://scotch.io/tutorials/n...
未经允许严禁转载
我曾经想要在特定时间执行特定的操作,而无需亲自运行它们。
在本文中,我们将研究如何在 Node 程序中创建和使用 Cron 作业。为此我们将创建一个简单的程序,该应用程序会自动从服务器中删除自动生成的 error.log
文件。 Cron 作业的另一个优点是,你可以安排程序以不同的时间间隔执行不同的脚本。
前提条件
要继续学习本教程,你需要具备以下条件:
- 在你的机器上安装的 Node
- 在你的计算机上安装有NPM
- JavaScript 的基础知识
入门
首先,以下命令并为项目创建一个新的 Node 程序,然后其进行初始化:
mkdir cron-jobs-node cd cron-jobs-node
npm init -y
安装 Node 模块
为了使程序正常工作,我们将需要几个依赖项。你可以通过运行以下命令来安装它们:
npm install express node-cron fs
express
- Web 服务器
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");
当服务运行时,你将获得以下输出:
注意:要模拟本任务,可以通过在参数中设置分钟数来将间隔设置为较短的时间
你可以在调度程序中执行任何操作。从创建文件到发送电子邮件和运行脚本的各种操作。让我们看一下更多的用例
用例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 作业以及如何在 Node.js 程序中使用。这是 GitHub 上的源码链接。
本文首发微信公众号:前端先锋
欢迎扫描二维码关注公众号,每天都给你推送新鲜的前端技术文章
欢迎继续阅读本专栏其它高赞文章:
- 深入理解Shadow DOM v1
- 一步步教你用 WebVR 实现虚拟现实游戏
- 13个帮你提高开发效率的现代CSS框架
- 快速上手BootstrapVue
- JavaScript引擎是如何工作的?从调用栈到Promise你需要知道的一切
- WebSocket实战:在 Node 和 React 之间进行实时通信
- 关于 Git 的 20 个面试题
- 深入解析 Node.js 的 console.log
- Node.js 究竟是什么?
- 30分钟用Node.js构建一个API服务器
- Javascript的对象拷贝
- 程序员30岁前月薪达不到30K,该何去何从
- 14个最好的 JavaScript 数据可视化库
- 8 个给前端的顶级 VS Code 扩展插件
- Node.js 多线程完全指南
- 把HTML转成PDF的4个方案及实现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。