Поиск по сайту:

Как использовать node-cron для запуска запланированных заданий в Node.js


Введение

cron позволяет повторять задачу через определенный интервал времени. Могут быть повторяющиеся задачи, такие как ведение журнала и создание резервных копий, которые необходимо выполнять ежедневно, еженедельно или ежемесячно.

Одним из способов реализации cron на сервере Node.js является использование модуля node-cron. Эта библиотека использует синтаксис crontab, который может быть знаком пользователям с предыдущим опытом использования cron в Unix-подобных операционных системах.

В этой статье вы будете использовать node-cron для периодического удаления файлов журнала с сервера. Вам также будут представлены два других распространенных варианта использования — резервное копирование базы данных и отправка запланированных электронных писем.

Предпосылки

Чтобы пройти этот урок, вам понадобится:

  • Локальная среда разработки для Node.js. Следуйте инструкциям по установке Node.js и созданию локальной среды разработки.

Это руководство было проверено с помощью Node v17.2.0, npm v8.1.4, node-cron v2.0.3, shelljs v0.8.4 и nodemailer v6.7.2.

Шаг 1 — Создание приложения Node и установка зависимостей

Для начала создайте новое приложение Node, открыв терминал и создав новую папку для своего проекта:

  1. mkdir node-cron-example

Затем перейдите в новый каталог проекта:

  1. cd node-cron-example

Затем инициализируйте его, создав файл package.json, который вы будете использовать для отслеживания зависимостей:

  1. npm init --yes

Добавьте модуль node-cron, выполнив следующую команду:

  1. npm install node-cron@3.0.0

Модуль node-cron — это планировщик задач.

Зависимости проекта установлены. Давайте построим сервер.

Шаг 2 — Планирование задачи

Теперь вы можете собрать сервер и использовать node-cron, чтобы запланировать запуск задачи каждую минуту.

Создайте новый файл cron-ping.js:

  1. nano cron-ping.js

Затем потребуется node-cron:

const cron = require('node-cron');

Затем добавьте следующие строки кода в cron-ping.js:

// ...

// Schedule tasks to be run on the server.
cron.schedule('* * * * *', function() {
  console.log('running a task every minute');
});

Эти звездочки являются частью синтаксиса crontab для представления различных единиц времени:

  * * * * * *
  | | | | | |
  | | | | | day of week
  | | | | month
  | | | day of month
  | | hour
  | minute
  second ( optional )

Одна звездочка ведет себя как подстановочный знак. Это означает, что задача будет выполняться для каждого экземпляра этой единицы времени. Пять звездочек (* * * * *) обозначают запуск crontab по умолчанию каждую минуту.

Числа вместо звездочек будут рассматриваться как значения для этой единицы времени. Позволяет планировать выполнение задач ежедневно, еженедельно или более сложно.

Примечание. Узнайте больше о том, как работает эта нотация, в разделе Как использовать Cron для автоматизации задач на VPS.

Теперь запустите скрипт:

  1. node cron-ping.js

Через несколько минут вы получите следующий результат:

Output
running a task every minute running a task every minute running a task every minute ...

У вас есть пример задачи, которая выполняется каждую минуту. Вы можете остановить сервер с помощью CTRL+C (CONTROL+C).

Теперь давайте более подробно рассмотрим, как запускать задачи.

Шаг 3 — Удаление журнала ошибок

Рассмотрим сценарий, в котором вам необходимо регулярно удалять файл журнала с сервера двадцать первого числа каждого месяца. Вы можете сделать это с помощью node-cron.

Создайте пример файла журнала с именем error.log:

  1. nano error.log

Затем добавьте тестовое сообщение:

This is an example error message that in a log file that will be removed on the twenty-first day of the month.

Создайте новый файл cron-delete.js:

  1. nano cron-delete.js

Эта задача будет использовать fs для удаления связи с файлом. Добавьте его в начало файла:

const cron = require('node-cron');
const fs = require('fs');

Затем добавьте следующие строки кода:

// ...

// Remove the error.log file every twenty-first day of the month.
cron.schedule('0 0 21 * *', function() {
  console.log('---------------------');
  console.log('Running Cron Job');
  fs.unlink('./error.log', err => {
    if (err) throw err;
    console.log('Error file successfully deleted');
  });
});

Обратите внимание на шаблон: 0 0 21 * *.

  • Определяет значения минут и часов как 0 и 0 (\00:00 - начало дня).
  • Определяет значение дня как 21.
  • Он не определяет месяц или день недели.

Теперь запустите скрипт:

  1. node cron-delete.js

Двадцать первого числа месяца вы получите следующий вывод:

Output
--------------------- Running Cron Job Error file successfully deleted

Вы, вероятно, не хотите ждать двадцать первого числа месяца, чтобы убедиться, что задача выполнена. Вы можете изменить планировщик, чтобы он запускался через более короткий интервал времени, например, каждую минуту.

Проверьте каталог вашего сервера. Файл error.log будет удален.

Вы можете запускать любые действия внутри планировщика. Действия варьируются от создания файла до отправки электронных писем и запуска сценариев. Давайте посмотрим на другие варианты использования.

Шаг 4 — Изучение использования node-cron для резервного копирования баз данных

Обеспечение сохранности пользовательских данных является ключом к любому бизнесу. Если произойдет непредвиденное событие, и ваша база данных будет повреждена или повреждена, вам потребуется восстановить базу данных из резервной копии. У вас будут серьезные проблемы, если у вас не будет какой-либо существующей резервной копии для вашего бизнеса.

Рассмотрим сценарий, в котором вам необходимо регулярно создавать резервную копию дампа базы данных в 23:59 каждый день. Вы можете сделать это с помощью node-cron.

Примечание. Этот вариант использования предполагает настройку локальной базы данных SQLite. Более тонкие детали установки и создания базы данных здесь не рассматриваются. Не стесняйтесь заменять на другую команду оболочки.

Предположим, что у вас установлен и запущен SQLite в вашей среде. При наличии базы данных с именем database.sqlite ваша команда оболочки для создания резервной копии базы данных может выглядеть следующим образом:

  1. sqlite3 database.sqlite .dump > data_dump.sql

Эта команда берет базу данных database.sqlite, запускает команду .dump и выводит результат в виде файла с именем data_dump.sql.

Затем установите shelljs, модуль Node, который позволит вам запустить предыдущую команду оболочки:

  1. npm install shelljs@0.8.4

Создайте новый файл cron-dump.js:

  1. nano cron-dump.js

Затем потребуйте shelljs:

const cron = require('node-cron');
const shell = require('shelljs');

Затем добавьте следующие строки кода:

// ...

// Backup a database at 11:59 PM every day.
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');
  }
});

Обратите внимание на шаблон: 59 23 * * *.

  • Определяет значение минуты как 59.
  • Определяет значение часа как 23 (или 23:00 в 24-часовом формате).
  • Он не определяет день, месяц или день недели.

Этот код запустит команду оболочки резервного копирования. В случае успеха будет выведено сообщение. В противном случае, если есть ошибка, он выйдет.

Теперь запустите скрипт:

  1. node cron-dump.js

В 23:59 вы получите следующий вывод:

Output
--------------------- Running Cron Job Database backup complete

Вероятно, вы не хотите ждать 23:59, чтобы убедиться, что задача выполнена. Вы можете изменить планировщик, чтобы он запускался через более короткий интервал времени.

Проверьте каталог вашего сервера. Будет присутствовать файл data_dump.sql.

Далее давайте рассмотрим отправку периодических электронных писем.

Шаг 5 — Изучение использования node-cron для отправки запланированных электронных писем

Рассмотрим сценарий, в котором вы составляете список интересных ссылок, а затем отправляете их подписчикам по электронной почте каждую среду. Вы можете сделать это с помощью node-cron.

Nodemailer поддерживает тестовые учетные записи, предоставленные Ethereal Email. Создайте учетную запись Ethereal и используйте сгенерированные для вас имя пользователя и пароль.

Предупреждение. Настоятельно рекомендуется не использовать для этого шага личную учетную запись электронной почты. Рассмотрите возможность использования новой отдельной тестовой учетной записи, чтобы избежать риска для вашей личной учетной записи электронной почты.

Затем установите nodemailer, модуль Node, который позволит вам отправлять электронные письма:

  1. npm install nodemailer@6.7.2

Создайте новый файл cron-mail.js:

  1. nano cron-mail.js

Затем потребуется nodemailer:

const cron = require('node-cron');>
const nodemailer = require('nodemailer');

Добавьте раздел, который определяет почтовую программу и устанавливает имя пользователя и пароль для учетной записи электронной почты:

// ...

// Create mail transporter.
let transporter = nodemailer.createTransport({
  host: 'your_demo_email_smtp_host.example.com',
  port: your_demo_email_port,
  auth: {
    user: 'your_demo_email_address@example.com',
    pass: 'your_demo_email_password'
  }
});

Предупреждение: этот шаг представлен только в качестве примера. В производственной среде вы должны использовать переменные среды, чтобы сохранить свой пароль в секрете. Не сохраняйте свой пароль (учетные данные) в любом коде, который вы загружаете в репозитории кода, такие как GitHub.

Затем добавьте следующие строки кода:

// ...

// Sending emails every Wednesday.
cron.schedule('0 0 * * 3', function() {
  console.log('---------------------');
  console.log('Running Cron Job');

  let messageOptions = {
    from: 'your_demo_email_address@example.com',
    to: 'your_demo_email_address@example.com',
    subject: 'Scheduled Email',
    text: 'Hi there. This email was automatically sent by us.'
  };

  transporter.sendMail(messageOptions, function(error, info) {
    if (error) {
      throw error;
    } else {
      console.log('Email successfully sent!');
    }
  });
});

Обратите внимание на шаблон: 0 0 * * 3.

  • Определяет значения минут и часов как 0 и 0 (\00:00 - начало дня).
  • Он не определяет день месяца или месяц.
  • Определяет значение дня недели как 3 (среда).

Этот код будет использовать предоставленные учетные данные для отправки электронного письма самому себе. Со строкой темы: Запланированное электронное письмо и основным текстом: Привет. Это электронное письмо было отправлено нами автоматически.. В противном случае, если это не удастся, он зарегистрирует ошибку.

Теперь запустите скрипт:

  1. node cron-mail.js

В среду вы получите следующий вывод:

Output
--------------------- Running Cron Job Email successfully sent!

Вы, вероятно, не хотите ждать среды, чтобы убедиться, что задача выполнена. Вы можете изменить планировщик, чтобы он запускался через более короткий интервал времени.

Откройте почтовый ящик Ethereal Email. В папке «Входящие» появится новое Запланированное электронное письмо.

Заключение

В этой статье вы узнали, как использовать node-cron для планирования заданий на сервере Node.js. Вы познакомились с более широкой концепцией автоматизации повторяющихся задач последовательным и предсказуемым образом. Эта концепция может быть применена к вашим текущим и будущим проектам.

Доступны и другие инструменты планировщика задач. Обязательно оцените их, чтобы определить, какой инструмент лучше всего подходит для вашего конкретного проекта.

Если вы хотите узнать больше о Node.js, посетите нашу тематическую страницу Node.js, где вы найдете упражнения и проекты по программированию.