发布于 2026-01-06 6 阅读
0

Node 调度器 如何在 NodeJS 中创建任务调度器 DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

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
Enter fullscreen mode Exit fullscreen mode

以下是您刚刚安装的软件的简要说明:

  1. node-cron:这是任务调度器的软件包。它允许您设置自动执行某些操作(通常是执行某个函数)的计划任务。
  2. node-fetch:一种使用 fetch API 的方法。fetch API 是一个原生浏览器 API,但我们在使用 Node.js 时并没有浏览器。你也可以使用其他包,例如 Axios,它非常流行。Axios 允许你下载 URL 后面的内容。通常,你会用它来连接 API 或抓取网页。
  3. esm:我之前没用过这个,但它真的超级实用。它允许你像在 Vue 或 React 等客户端 JavaScript 中那样编写代码。这意味着你可以使用 import 和 exports 之类的功能。要启用这个 esm,你需要先安装它,然后把它添加到你的运行脚本中。在我的 package.json 文件中,我添加了以下这行作为“启动”脚本:
    "scripts": {
        "start": "node -r esm index.js"
      },
Enter fullscreen mode Exit fullscreen mode

然后,您可以通过执行以下操作来运行此脚本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;
Enter fullscreen mode Exit fullscreen mode

为了每次运行此脚本时都能获得随机图片,我使用了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`);
});
Enter fullscreen mode Exit fullscreen mode

这是一个非常小的应用程序,运行后会在控制台输出一条消息。这条消息每分钟重复一次。挺酷的,但没什么实际用处。我们来添加图片抓取器,方法是导入它。index.js 文件的内容如下:

import cron from "node-cron";
import fetchingData from "./fetch";

cron.schedule("* * * * *", () => {
  console.log(`one minute passed, image downloaded`);
  fetchingData();
});
Enter fullscreen mode Exit fullscreen mode

但是,这样一来,图像下载器就会每分钟运行一次。我们可以通过修改添加到调度函数中的第一个参数来更改 cron 任务。您看到的五个星号表示该函数将每分钟运行一次。您可以按照以下步骤进行修改(摘自此处):

 # ┌────────────── second (optional)
 # │ ┌──────────── minute
 # │ │ ┌────────── hour
 # │ │ │ ┌──────── day of month
 # │ │ │ │ ┌────── month
 # │ │ │ │ │ ┌──── day of week
 # │ │ │ │ │ │
 # │ │ │ │ │ │
 # * * * * * *
Enter fullscreen mode Exit fullscreen mode

一开始,我不太明白这是什么意思。一番谷歌搜索之后,我找到了一个非常有用的速查表网站: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();
});
Enter fullscreen mode Exit fullscreen mode

想查看完整版应用或克隆它吗?请访问我的 Github页面

这是我在 Dev.to 上的第一篇帖子,请多多包涵。原文发布于andredevries.dev

文章来源:https://dev.to/andre347/how-to-create-a-task-scheduler-in-nodejs-4lo2