Планировщик задач на TypeScript: подробное руководство по библиотеке node-schedule

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

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

Начать курс

Планировщик задач TypeScript: автоматизация с node-schedule

В современной веб-разработке часто возникает необходимость выполнять код по расписанию: отправлять уведомления, очищать кэш, генерировать отчёты или синхронизировать данные. Для TypeScript-проектов одной из самых мощных и гибких библиотек является node-schedule. Это планировщик задач, который позволяет задавать как одноразовые, так и рекуррентные выполнения с использованием cron-выражений, дат или произвольных правил.

Установка и настройка

Для установки библиотеки выполните команду:

npm install node-schedule
npm install @types/node-schedule --save-dev

После установки вы можете импортировать модуль в свой TypeScript-файл:

import * as schedule from 'node-schedule';

Основные возможности node-schedule

  • Планирование по cron-выражениям — поддержка классических 6-польных масок (секунды, минуты, часы, день месяца, месяц, день недели).
  • Одноразовые задачи — выполнение кода в конкретный момент времени.
  • Рекуррентные правила — создание кастомных интервалов с помощью объекта RecurrenceRule.
  • Отмена задач — возможность остановить выполнение запланированного задания.
  • Поддержка таймзон — точное выполнение в указанном часовом поясе.

Пример 1: Простой cron-планировщик

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

import * as schedule from 'node-schedule';

const job = schedule.scheduleJob('*/1 * * * *', () => {
  console.log('Задача выполнена:', new Date().toLocaleString());
});

// Через 5 минут отменим задачу
setTimeout(() => {
  job.cancel();
  console.log('Задача отменена');
}, 5 * 60 * 1000);

В этом примере cron-выражение '*/1 * * * *' означает «каждую минуту». Обратите внимание на порядок полей: секунды, минуты, часы, день месяца, месяц, день недели.

Пример 2: Задача с конкретной датой

Вы можете запланировать выполнение на определённое время в будущем:

import * as schedule from 'node-schedule';

const date = new Date(2025, 11, 31, 23, 59, 0); // 31 декабря 2025, 23:59

const job = schedule.scheduleJob(date, () => {
  console.log('Новый год наступил!');
});

// Проверяем, запланирована ли задача
console.log('Задача активна:', job !== null);

Пример 3: Рекуррентное правило (RecurrenceRule)

Если cron-выражения кажутся сложными, используйте объект RecurrenceRule для создания понятных правил:

import * as schedule from 'node-schedule';

const rule = new schedule.RecurrenceRule();
rule.hour = 9;
rule.minute = 30;
rule.dayOfWeek = [1, 3, 5]; // Понедельник, Среда, Пятница

const job = schedule.scheduleJob(rule, () => {
  console.log('Утренняя встреча в 9:30 по будням (Пн, Ср, Пт)');
});

// Для отмены через месяц:
setTimeout(() => job.cancel(), 30 * 24 * 60 * 60 * 1000);

Пример 4: Задача с таймзоной

Если ваше приложение работает в разных часовых поясах, укажите таймзону:

import * as schedule from 'node-schedule';

const job = schedule.scheduleJob(
  { hour: 8, minute: 0, tz: 'Europe/Moscow' },
  () => {
    console.log('Московское утро: 8:00');
  }
);

Обработка ошибок и отмена задач

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

import * as schedule from 'node-schedule';

const job = schedule.scheduleJob('*/5 * * * *', async () => {
  try {
    // Ваш асинхронный код
    const data = await fetchDataFromAPI();
    console.log('Данные получены:', data);
  } catch (error) {
    console.error('Ошибка в планировщике:', error);
  }
});

// Принудительная отмена
// job.cancel();

// Проверка статуса
console.log('Запланировано:', job.pendingInvocations?.length ?? 0);

Сравнение с альтернативами

На рынке существуют и другие планировщики для TypeScript:

  • node-cron

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