用 Node.js 實現定時任務

做者:Chris Nwambajavascript

翻譯:瘋狂的技術宅前端

原文:scotch.io/tutorials/n…java

未經容許嚴禁轉載node

Node.js Cron Jobs By Examples

我曾經想要在特定時間執行特定的操做,而無需親自運行它們。webpack

在本文中,咱們將研究如何在 Node 程序中建立和使用 Cron 做業。爲此咱們將建立一個簡單的程序,該應用程序會自動從服務器中刪除自動生成的 error.log 文件。 Cron 做業的另外一個優勢是,你能夠安排程序以不一樣的時間間隔執行不一樣的腳本。git

Cron Job每分鐘運行一個任務

前提條件

要繼續學習本教程,你須要具有如下條件:github

  • 在你的機器上安裝的 Node
  • 在你的計算機上安裝有NPM
  • JavaScript 的基礎知識

入門

首先,如下命令併爲項目建立一個新的 Node 程序,而後其進行初始化:web

mkdir cron-jobs-node cd cron-jobs-node
npm init -y
複製代碼

安裝 Node 模塊

爲了使程序正常工做,咱們將須要幾個依賴項。你能夠經過運行如下命令來安裝它們:sql

npm install express node-cron fs
複製代碼

express - Web 服務器shell

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 上的源碼連接。

歡迎關注前端公衆號:前端先鋒,免費領取webpack從入門到進階全系列教程。

相關文章
相關標籤/搜索