Найти тему

Консольное приложение в бекенде

План статьи

  1. Введение, зачем нужны консольные приложения
  2. Принцип работы консольных команд, реализация на nest.js
  3. Выводы

Введение, зачем нужны консольные приложения

Всем привет, меня зовут Александр, я являюсь фронтенд разработчиком более 4-х лет. В этой статье хочу затронуть тему бекенд разработки, а именно консольных приложений. Я думаю, что все знакомы с тем, как работает бекенд в апи? От клиента прилетает запрос, дальше через nginx или apache данные передаются во фреймворк, который занимается обслуживанием данного приложения. В самом фреймворке запрос поступает на контроллер и далее выполняется логика, которая была заложена для этого запроса. Это описание касается стандартного процесса, к которому многие привыкли, а задумывались ли вы, что иногда такую логику необходимо запускать в консоли? Как при таком сценарии будет выполнятся вышеописанный алгоритм, если из него исключить запрос из вне? Так вот, такой запрос поступает из консоли. То есть вместо запроса от клиента и nginx (он передает запрос с клиента во фреймворк) запрос поступает из консоли, в которой запускается приложение и выполняется заложенная в него логика.

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

После вышеописанного может поступить вопрос: почему нельзя написать свой скрипт с нуля для выполнения консольных задач? В таком скрипте мне заново надо подключать базу данных, другие вспомогательные ресурсы, инициализировать рабочее окружение. Зачем мне писать такой скрипт, если все вышеописанное реализовано во фреймворке и разработчику необходимо только реализовать бизнес логику задачи? Это еще один ответ зачем использовать консольные приложения во фреймворке.

Принцип работы консольных команд, реализация на nest.js

Ранее я уже затрагивал принцип работы серверного приложения в этой статье, давайте теперь разберем его более подробно:

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

Весь вышеописанный алгоритм в общем описывает работу консольных приложений, он может меняться от фреймворка к фреймворку. Реализацию консольного приложения я хочу показать на примере nestjs, да именно на нем. Из коробки данный фреймворк не умеет работать с консольными приложения, но благодаря плагину seeder можно настроить работу с ними.

Теперь давайте разберем как он работает. В своем проекте я выделил их в отдельную папку, потому что посчитал отдельной сущностью.

Выделение консольных приложений в отдельную папку seeder
Выделение консольных приложений в отдельную папку seeder

Далее необходимо создать класс, в котором будет описана бизнес логика. В моем случае название класса строится следующим образом: [название файла].seeder.ts. Это сделано по аналогии с именованием файлов в nestjs, чтобы не нарушать общие правила именования фреймворка.

Пример реализации сидера
Пример реализации сидера

Давайте теперь подробнее разберем картинку «Пример реализации сидера». Для работы класс должен быть унаследован от интерфейса Seeder. Это сделано для того, чтобы в классе были реализованы обязательные методы seed и drop. Метод seed запускается по умолчанию, drop с флагом refresh.

Методы запуска консольного приложения
Методы запуска консольного приложения

Теперь разберем какие есть ограничения и нюансы в данной реализации:

  • под каждую задачу необходимо создавать свое консольное приложение;
  • в консольном приложении можно запускать команду только по двум функциям: seed и drop; остальные метод могут быть только вспомогательными;
  • при работе с консольными приложениями необходимо, чтобы был запущен режим разработки, в противном случае изменения в файлах могут не подтянутся;
  • запуск консольного приложения может быть сделан только из папки dist.

Вывод

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

Больше статей в моем блоге. Спасибо, что дочитали и до новых встреч в следующих статьях.