План статьи
- Введение, зачем нужны консольные приложения
- Принцип работы консольных команд, реализация на nest.js
- Выводы
Введение, зачем нужны консольные приложения
Всем привет, меня зовут Александр, я являюсь фронтенд разработчиком более 4-х лет. В этой статье хочу затронуть тему бекенд разработки, а именно консольных приложений. Я думаю, что все знакомы с тем, как работает бекенд в апи? От клиента прилетает запрос, дальше через nginx или apache данные передаются во фреймворк, который занимается обслуживанием данного приложения. В самом фреймворке запрос поступает на контроллер и далее выполняется логика, которая была заложена для этого запроса. Это описание касается стандартного процесса, к которому многие привыкли, а задумывались ли вы, что иногда такую логику необходимо запускать в консоли? Как при таком сценарии будет выполнятся вышеописанный алгоритм, если из него исключить запрос из вне? Так вот, такой запрос поступает из консоли. То есть вместо запроса от клиента и nginx (он передает запрос с клиента во фреймворк) запрос поступает из консоли, в которой запускается приложение и выполняется заложенная в него логика.
Давайте теперь разберемся для чего это нужно? Представьте следующую ситуацию, вы ведете блог и для статей у вас в определенный размер нарезаются картинки. После какого-то периода времени необходимо внести поправки в логику, которая занимается нарезкой картинок и заново нарезать все картинки. Поменять логику и чтобы после этого новые картинки нарезались по новому функционалу сделать не проблема, а вот что делать со старыми картинками? Сходить по всем статьям и пересохранить их? Такое себе решение, а если таких статей сотни? Вот здесь и кроется ответ на вопрос зачем нужны консольные приложения во фреймворке — они позволяют автоматизировать некую повторяющуюся логику. Под логикой имеется ввиду любая бизнес задача, которую можно выполнить в консоли.
После вышеописанного может поступить вопрос: почему нельзя написать свой скрипт с нуля для выполнения консольных задач? В таком скрипте мне заново надо подключать базу данных, другие вспомогательные ресурсы, инициализировать рабочее окружение. Зачем мне писать такой скрипт, если все вышеописанное реализовано во фреймворке и разработчику необходимо только реализовать бизнес логику задачи? Это еще один ответ зачем использовать консольные приложения во фреймворке.
Принцип работы консольных команд, реализация на nest.js
Ранее я уже затрагивал принцип работы серверного приложения в этой статье, давайте теперь разберем его более подробно:
- в консоле запускается команда, которая обращается к фреймворку;
- инициализируется приложение;
- идет обращение к контроллеру;
- выполняется бизнес логика, которая была заложена в приложение;
- приложение закрывается.
Весь вышеописанный алгоритм в общем описывает работу консольных приложений, он может меняться от фреймворка к фреймворку. Реализацию консольного приложения я хочу показать на примере nestjs, да именно на нем. Из коробки данный фреймворк не умеет работать с консольными приложения, но благодаря плагину seeder можно настроить работу с ними.
Теперь давайте разберем как он работает. В своем проекте я выделил их в отдельную папку, потому что посчитал отдельной сущностью.
Далее необходимо создать класс, в котором будет описана бизнес логика. В моем случае название класса строится следующим образом: [название файла].seeder.ts. Это сделано по аналогии с именованием файлов в nestjs, чтобы не нарушать общие правила именования фреймворка.
Давайте теперь подробнее разберем картинку «Пример реализации сидера». Для работы класс должен быть унаследован от интерфейса Seeder. Это сделано для того, чтобы в классе были реализованы обязательные методы seed и drop. Метод seed запускается по умолчанию, drop с флагом refresh.
Теперь разберем какие есть ограничения и нюансы в данной реализации:
- под каждую задачу необходимо создавать свое консольное приложение;
- в консольном приложении можно запускать команду только по двум функциям: seed и drop; остальные метод могут быть только вспомогательными;
- при работе с консольными приложениями необходимо, чтобы был запущен режим разработки, в противном случае изменения в файлах могут не подтянутся;
- запуск консольного приложения может быть сделан только из папки dist.
Вывод
В этой статье мы узнали, что такое консольное приложение, для чего его можно использовать. Также, мною было описано, как можно добавить реализацию консольных приложений во фреймворке nestjs и как реализовать консольное приложение в нем.
Больше статей в моем блоге. Спасибо, что дочитали и до новых встреч в следующих статьях.