专栏首页京程一灯用 Node.js 实现定时任务[每日前端夜话0xFE]

用 Node.js 实现定时任务[每日前端夜话0xFE]

翻译:疯狂的技术宅

作者:Chris Nwamba

来源:scotch.io

Node.js Cron Jobs By Examples

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

在本文中,我们将研究如何在 Node 程序中创建和使用 Cron 作业。为此我们将创建一个简单的程序,该应用程序会自动从服务器中删除自动生成的 error.log 文件。Cron 作业的另一个优点是,你可以安排程序以不同的时间间隔执行不同的脚本。

Cron Job每分钟运行一个任务

前提条件

要继续学习本教程,你需要具备以下条件:

  • 在你的机器上安装的 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");

当服务运行时,你将获得以下输出:

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 上的源码链接:https://github.com/christiannwamba/node-cron-jobs。

原文:https://scotch.io/tutorials/nodejs-cron-jobs-by-examples

本文分享自微信公众号 - 前端先锋(jingchengyideng),作者:疯狂的技术宅

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一小时内搭建一个全栈Web应用框架

    把想法变为现实的能力是空想家与实干家的区别。不管你是在一家跨国公司工作,还是正在为自己的创业公司而努力,那些有能力将创意转化为真正产品的人,都具有宝贵的技能并拥...

    疯狂的技术宅
  • Webpack快速上手指南

    Webpack用于编译JavaScript模块。安装以后,可以通过CLI或API使用它。如果你对webpack还有点陌生,可以先看看它的核心概念以及一些比较,了...

    疯狂的技术宅
  • three.js 新手指南

    在这个分步指南中,我们将使用一个基于 WebGL 的 3D 图形的框架 three.js, 创建一个 3D 版本的 Treehouse 徽标。你可以通过点击或者...

    疯狂的技术宅
  • 针对校园某服务器的一次渗透测试

    由于是对内网直接进行大扫描,所以直接判断这不仅是一个 Web 服务器(多个),同时还运行着 FTP、数据库。

    HACK学习
  • 利用Python进行XML转CSV

        csvFile = open(filePrefix+'.csv', 'wb')  #注意是二进制写入,否则会有多余空格

    用户2398817
  • Github项目推荐 | DoodleNet - 用Quickdraw数据集训练的CNN涂鸦分类器

    DoodleNet 是一个涂鸦分类器(CNN),对来自Quickdraw数据集的所有345个类别进行了训练。

    AI研习社
  • leecode刷题(20)-- 删除链表中的节点

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

    希希里之海
  • Perl遍历目录

    1、默认activePerl下的采用的编码是gbk,所以需要将字符串转为gbk才不会显示乱码

    meteoric
  • 浅谈MVC--Node中如何使用ORM?

    在正常的开发中,大部分都会使用MVC为主要的系统架构模式。而Model一般包含了复杂的业务逻辑以及数据逻辑,因为Model中逻辑的复杂度,所以我们有必要降低系统...

    逆月翎
  • Python--URL操作

    目标URL:http://127.0.0.1:5000/oauth/authorize?redirect_uri=http%3A%2F%2F127.0.0.1%...

    用户2398817

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动