如何使用Node.js构建Cron Job

505 阅读6分钟

image.png

cron作业是一种基于时间的任务调度器,通常在Linux或unix的系统上自动执行重复性任务。这些任务包括备份、更新数据库、生成报告和发送电子邮件提醒。在本文中,我们将讨论如何使用Node.js构建cron作业。

Node.js是一个开源、跨平台的JavaScript运行时,允许开发人员使用JavaScript构建服务器端应用程序。使用Node.js构建cron作业的好处之一是它可以处理多个并发连接,并且具有高度可扩展性。本文将介绍使用Node.js创建cron作业的基础知识,包括设置调度和运行作业。我们还将讨论在生产环境中构建和部署cron作业的一些最佳实践。在本文结束时,您将掌握使用Node.js构建cron作业所需的知识和工具。

什么是cron job?

cron作业是在unix的操作系统上自动运行的计划任务。“cron”这个名字来源于希腊语“Chronos”,意思是时间。Cron重复执行任务,如发送电子邮件、更新数据库和生成报告。它们通常按照时间表运行,例如每天在特定时间或每小时运行。

Cron作业是使用一个名为crontab的简单文本文件定义的,该文件包含要执行的命令和时间表。crontab中的每一行都代表一个cron作业,并遵循特定的格式。格式包括六个字段,以空格分隔:

  1. 分钟(0-59)
  2. 小时(0-23)
  3. 月份中的某一天(1-31)。
  4. 月(1-12)
  5. 星期几(0-7,其中0和7都表示星期日)。
  6. 要执行的命令

image.png

例如,下面的代码片段说明了如何设置任务以每分钟运行一次:

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

cron.schedule("* * * * *", () => {
   console.log("running a task at every minute");
})

传递给cron的第一个参数,是cron表达式。您可以使用表达式指定作业应该运行的时间。

第二个参数是要执行的函数。

node-cron调度函数有一个可选的第三个参数,用于作业调度的配置对象。下面的代码演示了可选参数应该是什么样子:

{
    schedule: true,
    timezone: "Asia/Kolkata"
 }

默认情况下,调度为true。如果将其设置为false,则必须调用作业对象上的start方法。每当调用调度函数时,都会返回一个Job对象。

使用实例执行cron任务。

cron.start();

Cron是在服务器上自动执行任务的强大工具,但是必须谨慎使用。配置错误的cron可能导致系统崩溃或数据丢失。在将cron作业部署到生产环境之前,测试并定期监视它们的性能是非常重要的。

设置cron作业

Node.js包管理器(NPM)有一个非常有用的cron作业包node-cron,它可以用来调度以特定间隔运行的作业。

我假设你已经知道如何安装和设置一个Node.js开发环境。

要开始学习本教程,在终端上运行以下命令创建一个新的项目:

mkdir project-folder-name

在文件夹的根目录下运行如下命令:

npm init -y

现在运行下面的命令安装 node-cron 包:

npm i node-cron

接下来,构建Node.js服务器并使用node-cron来调度任务。在本例中,我们希望每分钟向控制台上打印“Zenrow technical writer”这条语句。

创建一个新文件cronapp.js。

在cronapp.js文件中添加以下代码行:

const cron = require("node-cron")

cron.schedule("* * * * *", () => {
    console.log("Zenrow technical writer");
 })

要运行这个脚本,你需要运行下面的命令:

node cronapp.js

预期的输出应该如下所示:

Zenrow technical writer
Zenrow technical writer
Zenrow technical writer
Zenrow technical writer
Zenrow technical writer
...

发送邮件

定期发送电子邮件是cron job的一个重要应用领域。在本节中,我们将使用Node.js的nodemailer和node-cron模块来实现定期发送电子邮件的功能。Nodemailer模块支持用Ethereal Email创建的测试帐户。

请单击create Ethereal account按钮, 创建一个测试帐户。

image.png

系统将自动为您生成一封测试邮件。

使用以下命令安装nodemailer模块:

npm i nodemailer

创建一个新文件cronEmail.js

接下来,添加以下代码:

const cron = require("node-cron");
const nodemailer = require("nodemailer");

const transporter = nodemailer.createTransport({
    host: "smtp.ethereal.email",
    port: 587,
    auth: {
        user: "demoemail@ethereal.email",
        pass: "demopassword"
    }
 })

上面的代码创建了一个邮件传送器,并设置了用户和密码。

接下来,添加以下代码片段:

cron.schedule("24 13 * * *", () => {
    console.log("test")

    let data = {
        from: "demoemail@ethereal.email",
        to: "demoemail@ethereal.email",
        subject: "Test Email",
        text: "This is a test email"
    };

    transporter.sendMail(data, (err, info) =>{
        if(err){
            throw err;
        }else{
            console.log("Email sent");
        }
    })
 })

上面的代码片段安排在(“ 24 13 * * * ”)发送一封电子邮件,该模式意味着电子邮件将在每天下午1:24发送。

我们已经介绍了如何使用cron来调度任务和发送电子邮件,下面的部分将说明如何使用cron删除文件。当您希望定期地从服务器上删除日志文件时,这个用例变得很方便。

创建一个日志文件:

zenrow.log

然后,添加一条消息:

Zenrow logs

创建一个新的cronDelete.js文件

接下来,添加以下代码片段:

const cron = require("node-cron")
const fs = require("fs")

cron.schedule("48 14 * * *", function() {
    console.log("Running Cron Job");
    fs.unlink("Zenrow.log", (err) => {
      if (err) throw err;
      console.log('Log file successfully deleted');
    });
});

时间表模式:“48 14 * * *”

以如下命令运行脚本:

node cronDelete.js

脚本将在14:48PM执行,zenrow.log将被删除。

cron作业的常见问题

Cron是服务器上执行自动化任务的强大工具,但它们也可能带来一些潜在问题。cron作业的一些最常见问题包括:

  • 缺乏监视:如果没有适当的监视,很难检测到cron作业何时失败。这可能导致数据不一致或延迟完成重要任务。
  • Cron作业失败:Cron作业可能由于各种原因而失败,例如网络问题、缺少依赖项或代码中的错误。重要的是要有适当的错误处理和日志记录,以诊断可能出现的任何问题。
  • 重复的cron作业:另一个常见问题是计划同时运行的多个cron作业可能导致资源冲突和潜在的数据不一致。
  • 安全风险:如果配置不当,Cron作业也可能带来安全风险。例如,以root权限运行的cron作业可能被恶意行为者利用,以获得对敏感信息的访问权。

原文: dev.to/frankdev20/…