標題:如何在 NodeJS 中建立任務排程程序
發表:真實
描述:在這篇文章中,我將描述如何設定任務以按特定計劃執行節點程式碼。
標籤: Node.js、JavaScript、ES6
封面圖片:https://thepracticaldev.s3.amazonaws.com/i/mnq83r0xggrefc94s16t.png
在 Wes 的影片中,他從自己的社交媒體頁面獲取資料,而我將建立一個小應用程式,該應用程式按計劃執行並每天下午 6 點下載隨機圖像。我知道,誰不想每天在他或她的磁碟上彈出一張隨機圖像?
我們首先需要安裝一些東西:
// create dir, go into it and install packages
mkdir image-downloader && cd image-downloader &&
npm i node-cron node-fetch esm
快速分解您剛安裝的內容:
node-cron :這是任務排程器的套件。它允許您設定自動執行某些操作(通常執行某個功能)的計劃。
node-fetch :使用 fetch api 的方法。這是一個原生的瀏覽器API——但是當我們使用node時我們沒有瀏覽器。您也可以在此處使用另一個套件。 Axios 是非常受歡迎的一款。它只允許您下載網址後面的內容。通常,您會使用它來連接 API 或抓取網路。
esm :我以前沒用過這個,但它非常有用。它允許您像在客戶端 JavaScript(例如 Vue 或 React)中一樣編寫程式碼。這意味著您可以存取匯入/匯出等內容。要啟用此 esm,您必須安裝它,然後將其新增至執行腳本。在我的 package.json 檔案中,我新增了這一行作為「開始」腳本:
"scripts": {
"start": "node -r esm index.js"
},
然後,您可以透過執行npm run start
來執行此腳本。
現在我們已經安裝了必要的套件,是時候建立第一個檔案了,我們將在其中獲取一個映像:fetch.js
// fetch.js
import fetch from "node-fetch";
import fs from "fs";
// create a function that grabs a random image
const fetchingData = async () => {
const res = await fetch("https://picsum.photos/200?random");
const date = Date.now();
const dest = fs.createWriteStream(`./image-${date}.png`);
res.body.pipe(dest);
};
// export the function so it can be used in the index.js file
export default fetchingData;
為了在每次執行此腳本時獲得隨機圖片,我使用Picsum 。網站可讓您產生具有固定寬度和高度的隨機圖像。您可以將這些尺寸附加到 url 中。我還建立了一個包含當前日期的變數。然後,該日期將附加到檔案名稱中,並防止檔案被覆蓋。因為我們在這裡使用 Promise,所以我使用 async/await。
如果你想測試這個文件,你可以使用node -r esm fetch.js
執行它
接下來您要建立一個index.js 檔案。這將是主入口文件,其中包含 node-cron 函數:
import cron from "node-cron";
cron.schedule("* * * * *", () => {
console.log(`this message logs every minute`);
});
這是一個非常小的應用程式,如果您執行它,它將向控制台記錄一條訊息。此訊息將每分鐘重複一次。很酷,但不是很有用。讓我們透過導入來新增圖像獲取器。 index.js 檔案將如下所示:
import cron from "node-cron";
import fetchingData from "./fetch";
cron.schedule("* * * * *", () => {
console.log(`one minute passed, image downloaded`);
fetchingData();
});
但是,這將每分鐘執行一次圖像下載程式。我們可以透過更改新增到計劃函數中的第一個參數來更改 cron 作業。您看到的五顆星意味著函數將每分鐘執行一次。您可以按照以下方式修改它(取自此處):
# ┌────────────── second (optional)
# │ ┌──────────── minute
# │ │ ┌────────── hour
# │ │ │ ┌──────── day of month
# │ │ │ │ ┌────── month
# │ │ │ │ │ ┌──── day of week
# │ │ │ │ │ │
# │ │ │ │ │ │
# * * * * * *
起初,我不太明白這代表什麼。經過一番谷歌搜尋後,我發現以下網站作為備忘單非常有用; crontabguru
這意味著您幾乎可以隨時設定時間表。也許一年一次?或一月和七月的每週二上午 8 點。確實沒有任何限制。我繼續設定一個時間表,使其在每天下午 6 點下載: 0 18 * * *
完整且最終的index.js
檔案如下:
import cron from "node-cron";
import fetchingData from "./fetch";
cron.schedule("0 18 * * *", () => {
console.log(`one minute passed, image downloaded`);
fetchingData();
});
想要查看完整的應用程式或克隆它嗎?前往我的 Github!
在 Dev. 上的第一篇文章所以要溫柔。最初發佈於andredevries.dev
原文出處:https://dev.to/andre347/how-to-create-a-task-scheduler-in-nodejs-4lo2