Планирование задач в Node.js с помощью Node Cron


ВВЕДЕНИЕ

Суть технологии заключается в том, чтобы сделать работу быстрее и проще. Вы когда-нибудь хотели автоматизировать некоторые задачи в вашем приложении? Тогда этот учебник для вас.

В этой статье вы узнаете, как автоматизировать планирование писем в вашем приложении node.js с помощью node-cron.

Даже если вы не заинтересованы в планировании заданий в node.js, вы можете найти знания синтаксиса cron из этой статьи очень полезными, так что оставайтесь с нами👌.

ПРЕКВИЗИТЫ

Этот учебник представляет собой практическую демонстрацию того, как можно автоматизировать рассылку писем по расписанию. Перед началом работы убедитесь, что на вашем компьютере установлена среда выполнения Javascript Node.js.

ЧТО ТАКОЕ ПЛАНИРОВАНИЕ И ПОЧЕМУ ИМЕННО NODE-CRON?

Согласно Оксфордскому словарю, планирование означает планирование деятельности на определенную дату или время в будущем. Этот учебник основан на выделенных словах.

В node.js мы можем планировать (называемую функцией) деятельность (называемую заданием) для выполнения в определенную дату или время (называемое выражением) в будущем. Это очень важно, поскольку вы не можете запланировать выполнение задания на прошлое время.

Node cron — это пакет npm, используемый для планирования заданий, которые выполняются в определенные интервалы времени или даты. Примеры заданий, которые можно запланировать, включают ведение журнала через определенные промежутки времени, резервное копирование базы данных, отправку запланированных электронных писем и уведомлений по электронной почте. Node-cron основан на cron, планировщике заданий по времени в Unix-подобных системах.

Существует несколько пакетов npm, которые работают с планированием в node.js, такие как node-schedule, node-cron , Agenda, Bree, Cron и Bull, но для целей этого руководства мы будем работать с node-cron, поскольку он достаточно зрелый и стабильный. Он также предпочтителен, поскольку мы создаем простое планирование заданий.

НАСТРОЙКА ПРОЕКТА

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

mkdir email-node-cron

Войти в полноэкранный режим Выйти из полноэкранного режима

Затем мы можем перейти в созданный каталог с помощью команды cd.

cd email-node-cron

Войти в полноэкранный режим Выйти из полноэкранного режима

Нам нужно создать новый файл index.js в директории email-node-cron

touch index.js

Войти в полноэкранный режим Выйти из полноэкранного режима

Следующая команда инициализирует проект и создает файл package.json в корневой папке.

npm init -y

Войти в полноэкранный режим Выйти из полноэкранного режима

Суффикс -y является сокращенной формой флага -yes. Он используется для автоматического принятия подсказок, которые приходят из npm init. Все опции будут автоматически заполнены значениями по умолчанию npm init.

  • Установка зависимостей

Как было сказано ранее, node-cron является пакетом npm, поэтому нам нужно установить его как зависимость пакета в нашем проекте.

npm install node-cron

Войдите в полноэкранный режим Выход из полноэкранного режима

Нам также необходимо установить зависимости пакетов nodemailer и dotenv. Nodemailer — это пакет npm, который позволяет отправлять электронные письма.

Dotenv — это модуль с нулевой зависимостью, который загружает переменные окружения из файла .env в process.env.

npm install nodemailer
npm install dotenv

Вход в полноэкранный режим Выход из полноэкранного режима

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

ПЛАНИРОВАНИЕ ЗАДАНИЯ АВТОМАТИЗАЦИИ ЭЛЕКТРОННОЙ ПОЧТЫ

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

// index.js
const cron = require('node-cron');

Вход в полноэкранный режим Выйти из полноэкранного режима

Для планирования задания в пакете node cron есть метод schedule, который принимает три аргумента.

const cronJob = cron.schedule(expression, function, options)

Войти в полноэкранный режим Выйти из полноэкранного режима
  • Первый аргумент, известный как выражение cron, указывает дату и время, в которое должно выполняться задание.

  • Второй аргумент определяет функцию, которая будет выполняться через определенные промежутки времени.

  • Третий аргумент — это необязательная конфигурация задания node cron.


  1. ВЫРАЖЕНИЕ NODE CRON

Выражение cron, которое является первым аргументом, представляет собой строку, задающую дату и временной интервал выполнения задания. Она имеет формат * * * * * * *. Каждый * является полем, и представление каждого поля со значениями показано на рисунке ниже.

Поле seconds является необязательным полем и может быть опущено при написании выражения.

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

Например, если мы хотим отправлять письмо нашим подписчикам каждый четверг в 9:50:10 утра, наше выражение будет иметь вид 10 50 9 * * 4.

Это запустит задание node-cron в десятую секунду пятидесятой минуты девятого часа. Поскольку мы не указали значение для поля дня месяца и месяца, программа интерпретирует * как каждый месяц. Но мы указали четвертый день недели, поэтому это задание будет выполняться каждый четверг в 9:50:10 утра.

Можем ли мы попробовать написать выражение cron для отправки письма нашим подписчикам 15 числа каждого месяца в 14:30 😊.


  1. ФУНКЦИЯ NODE CRON

Функция является вторым аргументом метода schedule и указывает функцию, которая должна быть выполнена. В нашем случае функция будет отправлять электронные письма нашим подписчикам.

Здесь мы потребуем пакет nodemailer, а затем создадим почтовый транспортер transporter, который установит имя пользователя и пароль нашего почтового аккаунта.

Считается хорошей практикой разработки программного обеспечения всегда хранить учетные данные в файле переменной окружения (.env).

Поэтому давайте создадим файл .env в корневой папке.

touch .env

Вход в полноэкранный режим Выйти из полноэкранного режима

Выполните следующие фрагменты кода, чтобы добавить учетные данные в файл .env.

//.env file
EMAIL=youremailaddress@gmail.com
PASSWORD=youremailpassword

Вход в полноэкранный режим Выйти из полноэкранного режима

Вам необходимо настроить файл index.js так, чтобы он имел доступ к переменным вашего файла .env.

const nodemailer = require('nodemailer');
const dotenv = require('dotenv');

// .env configuration
dotenv.config()

Вход в полноэкранный режим Выход из полноэкранного режима

В файле index.js приведенный выше фрагмент кода требует наличия зависимостей nodemailer и dotenv, установленных ранее. Затем он конфигурируется с помощью метода .config(). Чтобы использовать nodemailer, мы должны сделать следующее:

  • Создайте объект Transporter transporter.
// creates a mail transporter here
let transporter = nodemailer.createTransport({
   service: "gmail",
   auth: {
      user: process.env.EMAIL,
      pass: process.env.PASSWORD,
   },
});

Войти в полноэкранный режим Выйти из полноэкранного режима
  • Создайте объект MailOptions.
let mailOptions = {
      from: 'EMAIL NODE CRON APP',
      to: process.env.EMAIL,
      subject: "Scheduled Email",
      html: `<p>Hello there,</p>
      <p> You have an email scheduled from <b>EMAIL NODE CRON APP</b> </p>
      <p>Keep learning👌👌</p>
      Kind regards, <br>
      <h4> EMAIL NODE CRON APP</h4>`
   };

Войдите в полноэкранный режим Выйти из полноэкранного режима
  • Используйте метод sendMail на объекте transporter
transporter.sendMail(mailOptions, (error, info) => {
      if (error) {
         console.log("Email error application", error.message);
      } else {
         console.log(`${new Date().toLocaleString()} - Email sent successfully:` + info.response);
      }
   });

Войти в полноэкранный режим Выйти из полноэкранного режима

В файле index.js у нас есть функция, которую нужно выполнить для отправки писем нашим подписчикам. Прежде чем правильно настроить наше задание cron, мы рассмотрим дополнительный аргумент.

  1. ОПЦИЯ NODE CRON

Опция является третьим аргументом метода cron schedule и представляет собой необязательную конфигурацию для планирования заданий. Это объект, который содержит следующее:

  • scheduled : Это булево значение, чтобы установить, будет ли созданное задание запланировано. По умолчанию установлено значение true. Если значение переменной scheduled_ установлено в true, задание запускается автоматически при выполнении выражения cron, однако если установлено в false, вам необходимо вызвать метод start() для объекта задания, как показано ниже job.start().

  • часовой пояс : Это часовой пояс, который используется для планирования заданий. По умолчанию используется часовой пояс системы, используемой при планировании задания cron. Вы можете посмотреть в moment-timezone допустимые значения часового пояса.

Например:

{ 
scheduled: false, 
timezone: Asia/Tokyo
}

Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь мы достаточно хорошо понимаем, что означает каждый аргумент и как они важны для создания хорошего задания cron. Мы настроим наше задание cron и выполним его.

В приведенном ниже фрагменте кода мы создадим задание node cron, которое будет планировать отправку писем нашим подписчикам каждую минуту.

Наш файл index.js должен выглядеть следующим образом:

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

// .env configuration
dotenv.config();

// creates a mail transporter here
let transporter = nodemailer.createTransport({
   service: "gmail",
   auth: {
      user: process.env.EMAIL,
      pass: process.env.PASSWORD,
   },
});

// Sending emails every minute
cronJob.schedule('59 * * * * *', () => {
   let mailOptions = {
      from: 'EMAIL NODE CRON APP',
      to: process.env.EMAIL,
      subject: "Scheduled Email",
      html: `<p>Hello there,</p>
      <p> You have an email scheduled from <b>EMAIL NODE CRON APP</b> </p>
      <p>Keep learning👌👌</p>
      Kind regards, <br>
      <h4> EMAIL NODE CRON APP</h4>`
   };

   transporter.sendMail(mailOptions, (error, info) => {
      if (error) {
         console.log("Email error application", error.message);
      } else {
         console.log(`${new Date().toLocaleString()} - Email sent successfully:` + info.response);
      }
   });
});

console.log('Application started.....');

Вход в полноэкранный режим Выйти из полноэкранного режима

В терминале введите фрагмент кода node index.js, чтобы запустить ваше приложение.

Примечание: Если вы получаете сообщение об ошибке в виде

Email error application Invalid login: 535-5.7.8 Username and Password not accepted.

Вам может потребоваться разрешить тестирование менее защищенных приложений, если вы используете адрес Gmail.

Вот скриншот моего терминала и письма, доставленного в мой почтовый ящик.

  • Терминал

  • Входящие сообщения электронной почты


ЗАКЛЮЧЕНИЕ

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

Вы можете получить доступ к репозиторию GitHub для примера кода, использованного в этом руководстве.

ССЫЛКИ

Быстрый и простой редактор для выражений расписания cron от Cronitor

https://www.freecodecamp.org/news/schedule-a-job-in-node-with-nodecron/

https://www.digitalocean.com/community/tutorials/nodejs-cron-jobs-by-examples

Оцените статью
Procodings.ru
Добавить комментарий