Использование node-cron для запуска запланированных заданий в Node.js
Введение
cron позволяет повторять задачу через определенный интервал времени. Могут быть повторяющиеся задачи, такие как ведение журнала и создание резервных копий, которые необходимо выполнять ежедневно, еженедельно или ежемесячно.
Одним из способов реализации cron
на сервере Node.js является использование модуля node-cron
. Эта библиотека использует синтаксис crontab
, который может быть знаком пользователям с предыдущим опытом использования cron
в Unix-подобных операционных системах.
Для того чтоб пройти этот мини курс вам понадобится локальная среда разработки для Node.js.
*Это руководство было проверено с помощью Node v17.2.0, npm v8.1.4, node-cron v2.0.3, shelljs v0.8.4.
Создание приложения Node и установка зависимостей
Для начала создайте новое приложение Node, открыв терминал и создав новую папку для своего проекта:
mkdir node-cron-example
Затем перейдите в новый каталог проекта:
cd node-cron-example
Затем инициализируйте его, создав файл package.json
, который вы будете использовать для отслеживания зависимостей:
npm init -y
Установите модуль node-cron
, выполнив следующую команду:
npm install node-cron@3.0.0
Создание планировщика задач
Создайте новый файл cron-ping.js:
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
для представления различных единиц времени:
_________________ second ( optional )
| ________________ minute
| | _____________ hour
| | | ___________ day of month
| | | | _________ month
| | | | | _______ day of week
| | | | | |
* * * * * *
Одна звездочка ведет себя как подстановочный знак. Это означает, что задача будет выполняться для каждого экземпляра этой единицы времени. Пять звездочек (* * * * *
) обозначают запуск crontab
по умолчанию каждую минуту.
Числа вместо звездочек будут рассматриваться как значения для этой единицы времени. Позволяет планировать выполнение задач ежедневно, еженедельно или более сложно.
Примечание. Узнайте больше о том, как работает эта нотация, в разделе Как использовать Cron для автоматизации задач на VPS.
Теперь запустите скрипт:
node cron-ping.js
Через несколько минут вы получите следующий результат:
Output:
running a task every minute
running a task every minute
running a task every minute
...
У вас есть пример задачи, которая выполняется каждую минуту. Вы можете остановить сервер с помощью CTRL+C
(CONTROL+C
).
Теперь давайте более подробно рассмотрим, как запускать задачи.
Пример использования node-cron для резервного копирования баз данных
Рассмотрим сценарий, в котором вам необходимо регулярно создавать резервную копию дампа базы данных в 23:59 каждый день. Вы можете сделать это с помощью node-cron
.
Примечание. Этот вариант использования предполагает настройку локальной базы данных SQLite. Более тонкие детали установки и создания базы данных здесь не рассматриваются. Не стесняйтесь заменять на другую команду оболочки.
Предположим, что у вас установлен и запущен SQLite в вашей среде. При наличии базы данных с именем database.sqlite
ваша команда оболочки для создания резервной копии базы данных может выглядеть следующим образом:
sqlite3 database.sqlite .dump > data_dump.sql
Эта команда берет базу данных database.sqlite
, запускает команду .dump
и выводит результат в виде файла с именем data_dump.sql
.
Затем установите shelljs
, модуль Node, который позволит вам запустить предыдущую команду оболочки:
npm install shelljs@0.8.4
Создайте новый файл cron-dump.js
:
nano cron-dump.js
Затем потребуйте shelljs
:
const cron = require('node-cron');
const shell = require('shelljs');
Затем добавьте следующие строки кода:
// ...
// Backup a database at 11:59 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-часовом формате).Он не определяет день, месяц или день недели.
Этот код запустит команду оболочки резервного копирования. В случае успеха будет выведено сообщение. В противном случае, если есть ошибка, он выйдет.
Теперь запустите скрипт:
node cron-dump.js
В 23:59 вы получите следующий вывод:
Output---------------------
Running Cron Job
Database backup complete
На этом у меня всё! Надеюсь кому-то да помог)