Планировщик задач на Node.js: node-schedule и node-cron

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Планировщик задач на 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);                    

Рекомендаций