Как быстро начать работу с VUE3.0: войдите и изучите
Nest.js — это серверная среда Nodejs. Она инкапсулирует Express и другие http-платформы для решения архитектурных проблем. Он предоставляет MVC, IOC, AOP и другие архитектурные функции, которых нет в Express, что упрощает поддержку и расширение кода.
Что здесь означают MVC, IOC и AOP? Давайте рассмотрим их отдельно:
MVC — это аббревиатура Model View Controller. В архитектуре MVC запрос сначала будет отправлен контроллеру, который отправит службу уровня модели для завершения бизнес-логики, а затем вернет соответствующее представление.
Nest.js предоставляет декоратор @Controller для объявления контроллера:
Служба будет объявлена с помощью декоратора @Injectable:
Классы, объявленные через декораторы @Controller и @Injectable, будут проверены Nest.js, соответствующие объекты будут созданы и добавлены в контейнер. Все эти объекты будут автоматически внедрены в соответствии с объявленными в конструкторе зависимостями, то есть DI (зависимостью). inject) ), эта идея называется IOC (Inverse Of Control).
Преимущество архитектуры IOC в том, что нет необходимости вручную создавать объекты и передавать их в конструкторы разных объектов на основе зависимостей. Все автоматически сканируется, создается и внедряется.
Кроме того, Nest.js также предоставляет возможность АОП (аспектно-ориентированного программирования), то есть возможности аспектно-ориентированного программирования:
Что означает АОП? Что такое аспектно-ориентированное программирование?
Запрос может проходить через логику контроллера, сервиса и репозитория (доступ к базе данных):
Если вы хотите добавить к этой ссылке вызова некоторую общую логику, как вам ее добавить? Например, ведение журнала, контроль разрешений, обработка исключений и т. д.
Легко придумать, как напрямую преобразовать код уровня контроллера и добавить эту логику. Это работает, но не элегантно, поскольку эта общая логика вторгается в бизнес-логику. Можем ли мы прозрачно добавлять журналы, разрешения и т. д. в эту бизнес-логику?
Можно ли добавить этап для выполнения общей логики до и после вызова контроллера?
Например:
Такие точки горизонтального расширения называются аспектами, а этот метод программирования, который прозрачно добавляет некоторую логику аспектов, называется АОП (аспектно-ориентированное программирование).
Преимущество АОП заключается в том, что он может разделить некоторую общую логику на аспекты и сохранить чистоту бизнес-логики. Таким образом, логику аспектов можно повторно использовать, динамически добавлять и удалять.
Фактически луковичная модель промежуточного программного обеспечения Express также является реализацией. АОП, т.к. можно слой снаружи обернуть прозрачно и добавить немного логики, а внутренний слой не будет заметен.
Nest.js имеет больше способов реализации АОП, всего их пять, включая промежуточное ПО, Guard, Pipe, Inteceptor, ExceptionFilter:,
Nest.js основано на Express и может, естественно, использовать промежуточное ПО, но оно подразделяется дальше. , разделенный на глобальное промежуточное программное обеспечение и промежуточное программное обеспечение маршрутизации:
глобальное промежуточное программное обеспечение — это промежуточное программное обеспечение Express. Некоторая логика обработки добавляется до и после запроса. Каждый запрос будет идти сюда:
Промежуточное программное обеспечение маршрутизации предназначено для определенного маршрута с меньшей областью действия:
Эта концепция напрямую наследует Express и ее легче понять.
Давайте взглянем на некоторые расширенные концепции Nest.js, такие как Guard:
Guard означает защиту маршрутизации. Его можно использовать для определения разрешений перед вызовом контроллера и возврата true или false, чтобы решить, следует ли освободить:
Способ создания Guard следующий:
Guard необходимо реализовать интерфейс CanActivate и метод canActive. Он может получать запрошенную информацию из контекста, а затем выполнять некоторую проверку разрешений и другую обработку, прежде чем возвращать true или false.
Добавьте его в контейнер IOC через декоратор @Injectable, а затем включите в контроллере:
Сам контроллер модифицировать не нужно, но логика определения разрешений добавляется прозрачно. В этом преимущество архитектуры АОП.
И так же, как промежуточное ПО поддерживает глобальный уровень и уровень маршрутов, Guard также можно включить глобально:
Guard может абстрагировать логику управления доступом для маршрутизации, но не может изменять запросы и ответы. Эта логика может использовать Interceptor:
Interceptor означает перехватчик. Вы можете добавить некоторую логику до и после метода целевого контроллера.
Способ создания Inteceptor следующий:
Перехватчику необходимо реализовать интерфейс NestInterceptor, а метод перехвата вызовет next.handle(). Вы можете добавить некоторую логику обработки до и после.
Логика обработки до и после контроллера может быть асинхронной. Nest.js организует их через rxjs, поэтому вы можете использовать различные операторы rxjs.
Interceptor поддерживает включение каждого маршрута индивидуально, что влияет только на определенный контроллер, а также поддерживает глобальное включение, которое влияет на все контроллеры:
В дополнение к управлению разрешениями маршрутов и обработке до и после целевого контроллера, которые являются общей логикой, обработка параметров также является общей логикой, поэтому Nest.js также извлекает соответствующие аспекты, то есть Pipe:
Pipe означает трубу, используемую для некоторой проверки и преобразования параметров:
Способ создания трубы следующий:
Pipe необходимо реализовать интерфейс PipeTransform и метод преобразования, который может выполнять проверку значения входящего параметра, например, правильность формата и типа. Если оно неверно, будет выдано исключение. Вы также можете выполнить преобразование и вернуть преобразованное значение.
Существует 8 встроенных каналов, и их значения можно увидеть из названий:
ValidationPipe
ParseIntPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
DefaultValuePipe
ParseEnumPipe
ParseFloatPipe
Аналогично, Pipe может действовать только на определенном маршруте или на каждом маршруте:
Независимо от того, вызывается ли в конечном итоге Pipe, Guard, Interceptor или Controller, во время процесса могут быть выброшены некоторые исключения. Как реагировать на определенные исключения?
Такое сопоставление исключений с ответами также является общей логикой. Nest.js предоставляет поддержку ExceptionFilter:
ExceptionFilter может обрабатывать возникающие исключения и возвращать соответствующие ответы:
Форма создания ExceptionFilter следующая:
Во-первых, вам необходимо реализовать интерфейс ExceptionFilter и метод catch для перехвата исключений. Однако исключения, которые вы хотите перехватывать, необходимо объявить с помощью декоратора @Catch. После перехвата исключения вы можете ответить исключением, соответствующим предоставлению. пользователю более дружелюбная подсказка.
Конечно, не все исключения будут обрабатываться ExceptionFilter. В Nest.js имеется
ServiceUnavailableException
GoneException
ConflictException
InternalServerErrorException
PayloadTooLargeException
BadGatewayException
UnprocessableException
UnsupportedMediaTypeException
BadRequestException
UnauthorizedException
NotFoundException
ForbiddenException
NotImplementedException
NotAcceptableException
RequestTimeoutException
GatewayTimeoutException
Конечно, вы также можете расширить его самостоятельно:
Nest.js таким образом реализует соответствие между исключениями и ответами. Пока в коде выбрасываются разные HttpExceptions, будут возвращаться соответствующие ответы, что очень удобно.
Аналогичным образом, ExceptionFilter также может действовать глобально или действовать на определенном маршруте:
определенном маршруте:
Глобальный:
Мы понимаем механизм АОП, предоставляемый Nest.js, но каково их соотношение порядка?
промежуточного программного обеспечения, защиты, канала, перехватчика и фильтра исключений, может прозрачно добавлять определенную логику обработки к определенному маршруту или всем маршрутам. В этом преимущество АОП.
Но какова последовательная связь между ними?
Отношения вызова зависят от исходного кода.
Соответствующий исходный код выглядит следующим образом:
Очевидно, что при входе на этот маршрут сначала будет вызван Guard, чтобы определить, есть ли разрешение и т. д. Если разрешения нет, здесь будет выдано исключение:
Выброшенное исключение HttpException будет обработано ExceptionFilter.
Если у вас есть разрешение, будет вызван перехватчик. Перехватчик организует цепочку, вызывает один за другим и, наконец, вызывает метод контроллера:
Перед вызовом метода контроллера для обработки параметров будет использоваться канал:
Каждый параметр будет преобразован:
Легко представить время вызова ExceptionFilter, который должен обрабатывать исключение перед ответом.
Промежуточное программное обеспечение — это экспресс-концепция, Nest.js просто наследует ее, и она вызывается на самом внешнем уровне.
Это последовательность вызовов этих механизмов АОП. Как только вы разберетесь с этими вещами, вы получите хорошее представление о Nest.js.
Nest.js инкапсулирован на основе экспресс-платформы http и применяет такие архитектурные идеи, как MVC, IOC и AOP.
MVC — это разделение модели и контроллера представления. Запрос сначала проходит через контроллер, затем вызывает сервис и репозиторий уровня модели для завершения бизнес-логики и, наконец, возвращает соответствующее представление.
IOC означает, что Nest.js будет автоматически сканировать классы с помощью декораторов @Controller и @Injectable, создавать их объекты и автоматически внедрять объекты, от которых он зависит, на основе зависимостей, устраняя проблемы с созданием и сборкой объектов вручную.
АОП извлекает общую логику и добавляет ее в определенное место посредством аспектов. Он может повторно использовать, а также динамически добавлять и удалять логику аспектов.
Промежуточное ПО, Guard, Interceptor, Pipe и ExceptionFileter в Nest.js — это всего лишь аспекты в разных местах. Их можно гибко применять к определенному маршруту или ко всем маршрутам. В этом преимущество АОП.
Мы рассмотрели их последовательность вызовов в исходном коде. Промежуточное программное обеспечение — это концепция Express. На самом внешнем уровне после достижения определенного маршрута сначала вызывается Guard, чтобы определить, есть ли у маршрута разрешение на доступ. Будет вызван Interceptor. Расширьте некоторую логику вперед и назад и вызовите Pipe для проверки и преобразования параметров перед достижением целевого контроллера. Все исключения HttpException будут обрабатываться ExceptionFilter и возвращать разные ответы.
Nest.js использует эту архитектуру АОП для создания слабосвязанной, простой в обслуживании и расширяемой архитектуры.
Ощутили ли вы преимущества архитектуры АОП?