Node 调度器:如何在 NodeJS 中创建任务调度器
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
Wes Bos 发布了一个非常有用的视频,讲解了如何使用 NodeJS 从网络抓取数据。在他的第二个视频中,他讲解了如何为这项任务设置计划任务。这在我之前使用 Node 时从未做过,所以我认为这在将来可能会派上用场,因此我应该写一篇简短的博客文章来介绍一下。
韦斯在他的视频中是从他自己的社交媒体页面获取数据,而我打算创建一个小型应用程序,它会按计划运行,每天下午 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 的方法。fetch API 是一个原生浏览器 API,但我们在使用 Node.js 时并没有浏览器。你也可以使用其他包,例如 Axios,它非常流行。Axios 允许你下载 URL 后面的内容。通常,你会用它来连接 API 或抓取网页。
- esm:我之前没用过这个,但它真的超级实用。它允许你像在 Vue 或 React 等客户端 JavaScript 中那样编写代码。这意味着你可以使用 import 和 exports 之类的功能。要启用这个 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.to 上的第一篇帖子,请多多包涵。原文发布于andredevries.dev
文章来源:https://dev.to/andre347/how-to-create-a-task-scheduler-in-nodejs-4lo2