Часто в проектах необходимо автоматизировать запуск функций или файлов в определенное время. Для решения этой задачи в Node.js можно использовать библиотеку node-cron.
В этой статье мы разберем аспекты установки пакета, рассмотрим лучшие практики работы с библиотекой, напишем проект и задеплоим его в облаке.
Что такое cron и node-cron
Cron и node-cron
Cron — это планировщик задач в Unix-подобных операционных системах (например, Linux), который позволяет автоматически запускать команды или скрипты по расписанию. Расписание указывается в формате crontab, где каждая строка описывает время выполнения задачи и команду, которую нужно запустить.
node-cron — это библиотека для Node.js, которая реализует функциональность Cron внутри JavaScript-приложений. Она позволяет создавать задачи, которые будут выполняться по заданному расписанию, ориентируясь на реальное время в выбранном часовом поясе, аналогично Cron в Unix-системах
Основные преимущества node-cron:
- Простота интеграции в существующие Node.js-проекты.
- Возможность динамического управления задачами.
- Поддержка тех же форматов расписания, что и в классическом Cron.
Синтаксис node-cron
node-cron имеет синтаксис, аналогичный обычному Cron:

Допустимые значения для полей:
|
Поле |
Значение |
|
Секунды |
0-59 |
|
Минуты |
0-59 |
|
Часы |
0-23 |
|
День месяца |
1-31 |
|
Месяц |
1-12 (или названия на английском языке) |
|
День недели |
0-7 (или названия на английском языке, 0 или 7 — воскресенье) |
Использование кратных значений
Использование диапазона
Использование значений шагов
Значения шагов можно использовать в сочетании с диапазонами, указав после диапазона символ / и число. Например: 1-10/2 — это то же самое, что 2, 4, 6, 8, 10. Шаги могут использоваться после звездочки, поэтому, если вы хотите запускать каждые две минуты, просто используйте */2.
Использование наименований
Для обозначения месяца и дня недели можно использовать их полные названия:
Или сокращенные:
Методы cron
В node-cron используется основной метод, который планирует выполнение задачи, — Schedule. Как аргументы он принимает выражение cron, функцию-задачу и дополнительную конфигурацию:
scheduled— состояние задачи, запущена она или нет. Тип данных — Boolean.timezone— часовой пояс, время которого будет использовать cron. Тип данных — String.
Пример:
Методы ScheduledTask
Для управления статусами задач используются два метода:
Start— служит для запуска остановленной задачи.Stop— служит для остановки запущенной задачи.
Пример:
Запуск задачи
Остановка задачи
VDS и VPS
биллингом по всему миру: Россия, Азия и Европа.
Подготовка рабочего пространства
Подготовим наше пространство для работы с Node.js и node-cron.
Установка Node.js и npm
Чтобы запустить локальную разработку, нужно установить актуальную версию Node.js (рекомендуем v22.14.0 LTS). Вместе с Node.js установится npm — стандартный менеджер пакетов JavaScript.
Для Windows:
- Перейдите на официальный сайт nodejs.org и скачайте установщик.
- Запустите его и следуйте инструкциям.
Для Linux / MacOS:
- Выполните в терминале:
- После установки введите в командной строке:
Убедитесь, что версии Node.js и npm корректно отображаются.
Настройка директории
-
Создайте новый каталог для проекта и перейдите в него:
-
Инициализируйте проект:
-
Установите node-cron:
Базовый пример использования node-cron
Рассмотрим простой, но интересный проект на основе библиотеки node-cron.
Задача: автоматически получать курс доллара США к рублю и сохранять эти данные в файл.
Проект простой, но он отлично демонстрирует основные возможности node-cron и показывает, как использовать библиотеку для регулярных задач.
Установка дополнительных библиотек
Установим дополнительные зависимости для проекта:
axios— для выполнения HTTP-запросов, будем использовать для работы с API.fs— для работы с файловой системой, будем использовать для записи данных в файл.
Написание проекта
Задачи нашего приложения будут следующими:
- Создаем задачу, чтобы получать каждую минуту актуальный курс.
- Записываем данные в файл
exchange_rates.txt. - Пишем лог в консоль.
Создадим файл index.js, в котором мы будем писать весь наш код.
Рассмотрим код подробнее:
- Вначале при помощи
if (!fs.existsSync('exchange_rates.txt'))проверяем наличие файлаexchange_rates.txt. Если его нет — создаем. - Функция
getExchangeRate: Получает курс доллара к рублю через публичный API. В данном примере используется API от open.er-api.com. - Функция
saveData: Сохраняет полученные данные (курс и текущее время) в файлexchange_rates.txt. Данные добавляются в конец файла, чтобы можно было отслеживать историю изменений. - Основной цикл сбора данных: Настроено задание
cron.schedule('* * * * *'), которое выполняется каждую минуту. В это время вызывается функцияgetExchangeRate, а результат сохраняется в файл.
Тестирование написанного проекта
Для запуска нашего проекта воспользуемся командой:
После запуска получаем вывод в консоль:

Спустя некоторое время получаем логи в консоль:

И в созданном файле exchange_rates.txt появилась информация о дате, времени и курсе:

Этот проект демонстрирует простое и эффективное использование node-cron для регулярного сбора данных и их сохранения. Вы можете легко адаптировать его для других целей, заменив источник данных или частоту выполнения задачи.
Использование node-cron в реальном проекте
Применим node-cron в прикладной задаче. Напишем скрипт, который автоматически отправляет письма. Данный кейс часто применяется компаниями для отправки различной рекламной информации. Это решение простое в реализации, но функциональное.
Получение пароля приложения
Для начала нам необходимо получить токен для своей почты Gmail:
- Перейдите в свой аккаунт Google.
- Перейдите в раздел «Безопасность».
- Выберите двухэтапную аутентификацию. Здесь вам нужно подтвердить свою личность, например, через код подтверждения, отправленный по смс. После этого вы сможете включить двухэтапную аутентификацию.

- Перейдите к «Паролям приложений», чтобы создать свое приложение.
- Присвойте имя, например,
nodemailerсвоему приложению и создайте его.

- Появится модальное окно с паролем. Скопируйте этот пароль и используйте его в коде.

Написание кода
Для начала установим необходимые библиотеки. node-cron уже установлен, поэтому нам необходимо установить только nodemailer.
Теперь создайте файл app.js и напишите туда следующий код:
Здесь:
- Массив
recipientsс получателями нашего письма. - Переменная
let transporterхранит в себе информацию об аутентификации отправителя. В переменнуюuserвам необходимо написать свою gmail-почту, а вpass— полученный ранее код. - Функция
sendEmailпринимает в себя получателя письма, переменнаяlet mailOptionsхранит информацию о нашем письме: получателя, тему и текст (в примере указаны два варианта: просто текст и текст в HTML-формате). Функцияtransporter.sendMailотправляет письмо. - Функция
cron.schedule('* * * * *')создает задачу отправлять письмо каждую минуту.
Тестирование приложения
Для запуска файла пишем команду:
И спустя пару минут получаем вывод в консоль:

Проверив почту, получаем наши письма:

Деплой проекта на облачный сервер Timeweb Cloud
После всех этапов создания нам необходимо выгрузить наше приложение в облако.
Для нашего небольшого приложения с автоматической отправкой писем подойдет конфигурация CPU 1 x 3.3ГГц, RAM 1 ГБ, NVMe 15 ГБ, 1 IPv4 стоимостью 300 ₽ в месяц.
- После создания сервера нам необходимо установить среду Node.js на сервер. Для этого используем команды:
- Проверяем версии при помощи:
Если всё установлено корректно, мы получим следующий вывод:

- Далее необходимо создать каталог, это можно сделать при помощи команды:
- Перенесите в каталог файлы
app.jsиpackage.json.
На Windows для этого можно использовать FileZilla. На Linux/MacOS воспользуйтесь командой:
Она состоит из:
-
--exclude="node_modules"— не включаем директорию с установленными библиотеками../— путь, откуда копируемroot@109.73.207.170:/home/nodemailer— путь, куда копируем. Обратите внимание на формат:username@server_ip:/path.
- После того как мы перенесли файлы, перейдем в директорию и проверим, что они там действительно есть:
Если всё правильно, мы получим вывод:

- Далее нам необходимо установить все библиотеки. Вводим команду:
- Проверяем, что всё корректно работает. Запускаем скрипт командой:
- Проверяем, что сообщения успешно отправляются. Если возникает проблема с отправкой письма, проверьте, что у вас не закрыт порт 465 на сервере. В случае проблем напишите в поддержку, специалисты проверят и откроют порт. Если всё корректно, переходим к следующему шагу.
- Создайте юнит-файл
/etc/systemd/system/nodemailer.service:
Добавьте в файл следующее содержимое:
Данный файл необходим для удобного управления и постоянной работы нашего приложения, даже после закрытия терминала. Обратите внимание, в ExecStart необходимо указать абсолютный путь до установленной node и абсолютный путь до файла который мы будем запускать.
При необходимости измените значения следующих переменных:
WorkingDirectory— директория проектаExecStart— команда для запуска приложения
- Перезапустите
systemdи включите службу:
- Проверьте статус службы и при необходимости просмотрите логи:
При нормальном запуске в поле «Active» находится значение «active (running)».

Просмотр логов:
При необходимости управлять службами можно командами:
-
Перезапуск
-
Остановка
-
Удаление службы (если необходимо)
Надежные VDS/VPS для ваших проектов
477 ₽/мес
657 ₽/мес
Заключение
Библиотека node-cron в проектах на платформе Node.js является мощным инструментом для автоматизации задач, связанных с выполнением повторяющихся операций в заданное время. В данной статье мы создали простое приложение, которое получает по API курс доллара к рублю и записывает данные в файл, и рассмотрели реальный пример использования библиотеки. Мы наглядно убедились, что библиотека позволяет легко настраивать выполнение заданий по расписанию, будь то получение и дальнейшая обработка данных либо взаимодействие с пользователями.
Таким образом, node-cron представляет собой отличный выбор для тех разработчиков, которым требуется надежная и удобная система планирования задач в рамках проектов на Node.js. Ее функциональность и удобство делают эту библиотеку незаменимым инструментом в арсенале любого современного backend-разработчика.
