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