Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Использование node-cron для автоматизации задач в Node.js

625
12 минут чтения
Средний рейтинг статьи: 5

Часто в проектах необходимо автоматизировать запуск функций или файлов в определенное время. Для решения этой задачи в 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:

Image2

Допустимые значения для полей:

Поле

Значение

Секунды

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:

  1. Перейдите на официальный сайт nodejs.org и скачайте установщик.
  2. Запустите его и следуйте инструкциям.

Для Linux / MacOS:

  1. Выполните в терминале:
    
  1. После установки введите в командной строке:
    

Убедитесь, что версии Node.js и npm корректно отображаются.

Настройка директории

  1. Создайте новый каталог для проекта и перейдите в него:

    
  1. Инициализируйте проект:

  1. Установите node-cron:

Базовый пример использования node-cron

Рассмотрим простой, но интересный проект на основе библиотеки node-cron.

Задача: автоматически получать курс доллара США к рублю и сохранять эти данные в файл. 

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

Установка дополнительных библиотек

Установим дополнительные зависимости для проекта:

    
  • axios — для выполнения HTTP-запросов, будем использовать для работы с API.
  • fs — для работы с файловой системой, будем использовать для записи данных в файл.

Написание проекта

Задачи нашего приложения будут следующими:

  1. Создаем задачу, чтобы получать каждую минуту актуальный курс.
  2. Записываем данные в файл exchange_rates.txt.
  3. Пишем лог в консоль.

Создадим файл index.js, в котором мы будем писать весь наш код.

    

Рассмотрим код подробнее:

  1. Вначале при помощи if (!fs.existsSync('exchange_rates.txt')) проверяем наличие файла exchange_rates.txt. Если его нет — создаем.
  2. Функция getExchangeRate: Получает курс доллара к рублю через публичный API. В данном примере используется API от open.er-api.com.
  3. Функция saveData: Сохраняет полученные данные (курс и текущее время) в файл exchange_rates.txt. Данные добавляются в конец файла, чтобы можно было отслеживать историю изменений.
  4. Основной цикл сбора данных: Настроено задание cron.schedule('* * * * *'), которое выполняется каждую минуту. В это время вызывается функция getExchangeRate, а результат сохраняется в файл.

Тестирование написанного проекта

Для запуска нашего проекта воспользуемся командой:

    

После запуска получаем вывод в консоль:

Image7

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

Image6

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

Image12

Этот проект демонстрирует простое и эффективное использование node-cron для регулярного сбора данных и их сохранения. Вы можете легко адаптировать его для других целей, заменив источник данных или частоту выполнения задачи.

Использование node-cron в реальном проекте

Применим node-cron в прикладной задаче. Напишем скрипт, который автоматически отправляет письма. Данный кейс часто применяется компаниями для отправки различной рекламной информации. Это решение простое в реализации, но функциональное.

Получение пароля приложения

Для начала нам необходимо получить токен для своей почты Gmail: 

  1. Перейдите в свой аккаунт Google.
  2. Перейдите в раздел «Безопасность».
  3. Выберите двухэтапную аутентификацию. Здесь вам нужно подтвердить свою личность, например, через код подтверждения, отправленный по смс. После этого вы сможете включить двухэтапную аутентификацию.

Image1

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

Image10

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

Image3

Написание кода

Для начала установим необходимые библиотеки. node-cron уже установлен, поэтому нам необходимо установить только nodemailer.

    

Теперь создайте файл app.js и напишите туда следующий код:

    

Здесь:

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

Тестирование приложения

Для запуска файла пишем команду:

    

И спустя пару минут получаем вывод в консоль:

Image11

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

Image4

Деплой проекта на облачный сервер Timeweb Cloud

После всех этапов создания нам необходимо выгрузить наше приложение в облако.

Для нашего небольшого приложения с автоматической отправкой писем подойдет конфигурация CPU 1 x 3.3ГГц, RAM 1 ГБ, NVMe 15 ГБ, 1 IPv4 стоимостью 300 ₽ в месяц.

  1. После создания сервера нам необходимо установить среду Node.js на сервер. Для этого используем команды:
    
  1. Проверяем версии при помощи:
    

Если всё установлено корректно, мы получим следующий вывод:

Image14

  1. Далее необходимо создать каталог, это можно сделать при помощи команды:
    
  1. Перенесите в каталог файлы app.js и package.json.

На Windows для этого можно использовать FileZilla. На Linux/MacOS воспользуйтесь командой:

    

Она состоит из:

    • --exclude="node_modules" — не включаем директорию с установленными библиотеками.
    • ./ — путь, откуда копируем
    • root@109.73.207.170:/home/nodemailer — путь, куда копируем. Обратите внимание на формат: username@server_ip:/path.
  1. После того как мы перенесли файлы, перейдем в директорию и проверим, что они там действительно есть:
    

Если всё правильно, мы получим вывод:

Image13

  1. Далее нам необходимо установить все библиотеки. Вводим команду:
    
  1. Проверяем, что всё корректно работает. Запускаем скрипт командой:
    
  1. Проверяем, что сообщения успешно отправляются. Если возникает проблема с отправкой письма, проверьте, что у вас не закрыт порт 465 на сервере. В случае проблем напишите в поддержку, специалисты проверят и откроют порт. Если всё корректно, переходим к следующему шагу.
  2. Создайте юнит-файл /etc/systemd/system/nodemailer.service:
    

Добавьте в файл следующее содержимое:

    

Данный файл необходим для удобного управления и постоянной работы нашего приложения, даже после закрытия терминала. Обратите внимание, в ExecStart необходимо указать абсолютный путь до установленной node и абсолютный путь до файла который мы будем запускать. 

При необходимости измените значения следующих переменных:

  • WorkingDirectory — директория проекта
  • ExecStart — команда для запуска приложения
  1. Перезапустите systemd и включите службу:
    
  1. Проверьте статус службы и при необходимости просмотрите логи:
    

При нормальном запуске в поле «Active» находится значение «active (running)».

Image5

Просмотр логов:

    

При необходимости управлять службами можно командами:

  • Перезапуск  

    
  • Остановка

    
  • Удаление службы (если необходимо)

    

Надежные VDS/VPS для ваших проектов

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

Библиотека node-cron в проектах на платформе Node.js является мощным инструментом для автоматизации задач, связанных с выполнением повторяющихся операций в заданное время. В данной статье мы создали простое приложение, которое получает по API курс доллара к рублю и записывает данные в файл, и рассмотрели реальный пример использования библиотеки. Мы наглядно убедились, что библиотека позволяет легко настраивать выполнение заданий по расписанию, будь то получение и дальнейшая обработка данных либо взаимодействие с пользователями.

Таким образом, node-cron представляет собой отличный выбор для тех разработчиков, которым требуется надежная и удобная система планирования задач в рамках проектов на Node.js. Ее функциональность и удобство делают эту библиотеку незаменимым инструментом в арсенале любого современного backend-разработчика.

625
12 минут чтения
Средний рейтинг статьи: 5
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server