<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Публичное облако на базе VMware с управлением через vCloud Director
Вход / Регистрация

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

Вячеслав Печенов
Вячеслав Печенов
Технический писатель
31 марта 2025 г.
37
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 — воскресенье)

Использование кратных значений

const cron = require('node-cron');
cron.schedule('1,2,4,5 * * * *', () => {
  console.log('выполняется каждую 1, 2, 4 и 5 минуту');
});

Использование диапазона 

const cron = require('node-cron');
cron.schedule('1-5 * * * *', () => {
  console.log('выполняется каждую 1-5 минуту');
});

Использование значений шагов

Значения шагов можно использовать в сочетании с диапазонами, указав после диапазона символ / и число. Например: 1-10/2 — это то же самое, что 2, 4, 6, 8, 10. Шаги могут использоваться после звездочки, поэтому, если вы хотите запускать каждые две минуты, просто используйте */2.

const cron = require('node-cron');
cron.schedule('*/2 * * * *', () => {
  console.log('выполняется каждые 2 минуты');
});

Использование наименований

Для обозначения месяца и дня недели можно использовать их полные названия:

const cron = require('node-cron');
cron.schedule('* * * January,September Sunday', () => {
  console.log('выполняется по воскресеньям января и сентября');
});

Или сокращенные:

const cron = require('node-cron');
cron.schedule('* * * Jan,Sep Sun', () => {
  console.log(''выполняется по воскресеньям января и сентября');
});

Методы cron

В node-cron используется основной метод, который планирует выполнение задачи, — Schedule. Как аргументы он принимает выражение cron, функцию-задачу и дополнительную конфигурацию:

  • scheduled — состояние задачи, запущена она или нет. Тип данных — Boolean.
  • timezone — часовой пояс, время которого будет использовать cron. Тип данных — String.

Пример:

 const cron = require('node-cron');
 cron.schedule('0 1 * * *', () => {
   console.log('Выполнится в 01:00 по Московскому времени');
 }, {
   scheduled: true,
   timezone: "Europe/Moscow"
 });

Методы ScheduledTask

Для управления статусами задач используются два метода:

  • Start — служит для запуска остановленной задачи.
  • Stop — служит для остановки запущенной задачи.

Пример:

Запуск задачи

const cron = require('node-cron');
const task = cron.schedule('* * * * *', () =>  {
  console.log('Остановленная задача');
}, {
  scheduled: false
});
task.start();

Остановка задачи

const cron = require('node-cron');
const task = cron.schedule('* * * * *', () =>  {
  console.log(Будет выполняться каждую минуту, пока не остановится);
});
task.stop();
vds

Подготовка рабочего пространства

Подготовим наше пространство для работы с 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. Выполните в терминале:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
\. "$HOME/.nvm/nvm.sh"
nvm install 22
  1. После установки введите в командной строке:
node -v && npm -v

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

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

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

mkdir node-cron-project && cd node-cron-project
  1. Инициализируйте проект:

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

npm install --save node-cron

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

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

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

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

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

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

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

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

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

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

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

const cron = require('node-cron');
const axios = require('axios');
const fs = require('fs');

if (!fs.existsSync('exchange_rates.txt')) {
    fs.writeFileSync('exchange_rates.txt', '');
}

async function getExchangeRate() {
    try {
        const response = await axios.get('https://open.er-api.com/v6/latest/USD');
        const rate = response.data.rates.RUB;
        return rate;
    } catch (error) {
        console.error('Ошибка при получении курса:', error);
        return null;
    }
}

function saveData(rate) {
    const currentTime = new Date().toLocaleString();
    const data = { time: currentTime, rate };

    fs.appendFileSync('exchange_rates.txt', `${JSON.stringify(data)}\n`);
    console.log(`Курс сохранён: ${currentTime} - ${rate} RUB`);
}

cron.schedule('* * * * *', async () => { 
    const rate = await getExchangeRate();
    if (rate !== null) {
        saveData(rate);
    }
});

console.log('Сбор данных запущен...');

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

  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, а результат сохраняется в файл.

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

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

node index.js

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

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.

npm install nodemailer

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

const nodemailer = require('nodemailer');
const cron = require('node-cron');

const recipients = [
    'recipient1@gmail.com',
    'recipient2@mail.ru'
];

let transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: 'sender@example.com',
        pass: 'PASSWORD'
    }
});

function sendEmail(recipient) {
    let mailOptions = {
        to: recipient, 
        subject: 'Запланированное письмо',
        text: 'Письмо отправленное автоматически по заданному расписанию node-cron',
        html: '<b>Письмо отправленное автоматически по заданному расписанию node-cron</b>'
    };

    transporter.sendMail(mailOptions, function(error, info){
        if (error) {
        console.log(`Ошибка отправки письма на email ${recipient}:`, error);
        } else {
        console.log(`Письмо успешно отправлено на email ${recipient}:`, info.response);
        }
    });
}

cron.schedule('* * * * *', () => {
    console.log('Запуск cron-tab');

    recipients.forEach((recipient) => {
        sendEmail(recipient);
    });
});

Здесь:

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

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

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

node app.jS

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

Image11

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

Image4

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

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

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

  1. После создания сервера нам необходимо установить среду Node.js на сервер. Для этого используем команды:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
\. "$HOME/.nvm/nvm.sh"
nvm install 22
  1. Проверяем версии при помощи:
node -v && npm -v

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

Image14

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

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

rsync -av --exclude="node_modules" ./ root@109.73.207.170:/home/nodemailer

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

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

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

Image13

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

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

[Unit]
Description=NodeMailer Service
After=network.target

[Service]
User=root
WorkingDirectory=/home/nodemailer
ExecStart=/root/.nvm/versions/node/v22.14.0/bin/node /home/nodemailer/app.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

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

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

  • WorkingDirectory — директория проекта
  • ExecStart — команда для запуска приложения
  1. Перезапустите systemd и включите службу:
sudo systemctl daemon-reload
sudo systemctl enable nodemailer.service
sudo systemctl start nodemailer.service
  1. Проверьте статус службы и при необходимости просмотрите логи:
sudo systemctl status nodemailer.service

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

Image5

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

sudo journalctl -u nodemailer.service -f

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

  • Перезапуск  

sudo systemctl restart nodemailer.service
  • Остановка

sudo systemctl stop nodemailer.service
  • Удаление службы (если необходимо)

sudo systemctl disable nodemailer.service
sudo rm /etc/systemd/system/nodemailer.service
sudo systemctl daemon-reload
Надежные VDS/VPS для ваших проектов

Заключение

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

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

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