Планировщик задач на Node.js: node-schedule и node-cron
В современной веб-разработке часто возникает необходимость выполнять определенные действия в заданное время или через равные промежутки времени. Например, отправка отчетов по email, очистка базы данных, парсинг внешних ресурсов или обновление кэша. В среде Node.js для этих целей используются планировщики задач. Два самых популярных инструмента — node-schedule и node-cron. В этой статье мы подробно разберем оба, приведем примеры кода и поможем выбрать подходящий для вашего проекта.
Зачем нужен планировщик задач в Node.js?
Node.js — однопоточная среда с событийно-ориентированной архитектурой. Встроенные функции setTimeout и setInterval позволяют выполнять код с задержкой или периодически, но они не подходят для сложных сценариев:
- Нет гибкости в настройке (например, «каждый второй понедельник месяца в 10:30»).
- Не сохраняют состояние после перезапуска приложения.
- Трудности с управлением (отмена, изменение расписания).
Планировщики решают эти проблемы, предоставляя простой API для создания, запуска и отмены задач по расписанию.
Библиотека node-schedule
node-schedule — это гибкий планировщик, основанный на cron-подобном синтаксисе, но с расширенными возможностями. Он позволяет задавать повторяющиеся задачи с точностью до минуты, а также разовые задачи на определенную дату.
Установка
npm install node-schedule
Основные возможности
- Поддержка cron-выражений (6 полей: секунды, минуты, часы, день месяца, месяц, день недели).
- Возможность задать разовое выполнение с помощью объекта Date.
- Рекуррентные правила с использованием объекта
RecurrenceRule. - Методы
cancel()иcancelNext()для управления задачами.
Пример 1: Запуск задачи каждые 5 минут
const schedule = require('node-schedule');
const job = schedule.scheduleJob('*/5 * * * *', function() {
console.log('Задача выполняется каждые 5 минут:', new Date().toLocaleString());
});
// Отменить задачу через 20 минут
setTimeout(() => {
job.cancel();
console.log('Задача отменена');
}, 20 * 60 * 1000);
Пример 2: Задача на определенную дату
const schedule = require('node-schedule');
const date = new Date(2025, 5, 15, 10, 30, 0); // 15 июня 2025, 10:30:00
const job = schedule.scheduleJob(date, function() {
console.log('Разовая задача выполнена в', new Date().toLocaleString());
});
console.log('Задача запланирована на', date.toLocaleString());
Пример 3: Сложное рекуррентное правило
const schedule = require('node-schedule');
const rule = new schedule.RecurrenceRule();
rule.dayOfWeek = [1, 3, 5]; // Понедельник, среда, пятница
rule.hour = 9;
rule.minute = 0;
const job = schedule.scheduleJob(rule, function() {
console.log('Задача выполняется в 9:00 по будням (Пн, Ср, Пт)');
});
Библиотека node-cron
node-cron — это легковесная альтернатива, основанная на классическом cron из Unix-систем. Она проще в использовании, но менее гибкая, чем node-schedule. Поддерживает 5 полей (минуты, часы, день месяца, месяц, день недели).
Установка
npm install node-cron
Основные возможности
- Стандартный cron-синтаксис (5 полей).
- Методы
start(),stop(),destroy(). - Поддержка часовых поясов через опцию
timezone. - Возможность запускать задачу немедленно с помощью
now().
Пример 1: Запуск задачи каждый день в полночь
const cron = require('node-cron');
const task = cron.schedule('0 0 * * *', () => {
console.log('Выполняется ежедневно в полночь');
}, {
scheduled: true,
timezone: "Europe/Moscow"
});
// Остановить задачу через 10 секунд
setTimeout(() => {
task.stop();
console.log('Задача остановлена');
}, 10000);