Файл: Разработка клиентсерверных приложений введение в nestjs.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.11.2023
Просмотров: 36
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
РАЗРАБОТКА КЛИЕНТ-СЕРВЕРНЫХ ПРИЛОЖЕНИЙ
ВВЕДЕНИЕ В NESTJS
Рзазаде Ульви Азар оглы
1
ВИДЫ ВЕБ-СЕРВЕРОВ
Только статические веб-страницы, которые не изменяются динамически в процессе работы. Например, Apache
HTTP Server и Nginx (Engine X) являются популярными статическими веб-серверами.
Динамический веб-сервер - это сервер, который может обслуживать динамические веб-страницы, которые могут изменяться в зависимости от контекста. Динамические веб-серверы используются для создания интерактивных веб-приложений, таких как онлайн-магазины, социальные сети и т.д. Некоторые популярные динамические веб-серверы включают Apache Tomcat, Node.js и Microsoft IIS.
Обратный прокси-сервер - это сервер, который служит промежуточным звеном между клиентом и сервером. Он может обслуживать запросы клиента, выполнять балансировку нагрузки и кэширование ответов сервера.
Некоторые популярные обратные прокси-серверы включают Nginx и Apache HTTP Server.
Контейнер приложений - это сервер, который предоставляет среду для работы веб-приложений в изолированном окружении. Он позволяет запускать несколько веб-приложений на одном сервере и управлять ими независимо друг от друга. Некоторые популярные контейнеры приложений включают Docker и Kubernetes.
РКСП, 2023 2
SERVICE-ORIENTED ARCHITECTURE (SOA)
Под сервис-ориентированной архитектурой понимается модульный подход к проектированию прикладных информационных систем, который руководствуется следующими принципами:
Явное отделение бизнес-логики прикладной системы от логики представления информации;
Реализация бизнес-логики прикладной системы в виде программных модулей (сервисов), которые доступны извне (пользователям и другим модулям), чаще всего в режиме "запрос-ответ", через четко определенные формальные интерфейсы доступа;
При этом "потребитель сервиса" (прикладная система или другой сервис), имеет возможность вызвать сервис через программные интерфейсы, используя соответствующие коммуникационные механизмы.
Базовыми понятиями в такой архитектуре являются "информационная услуга" (сервис) и "композитное приложение".
РКСП, 2023 3
SOA: КОМПОЗИТНОЕ ПРИЛОЖЕНИЕ
Композитное (составное) приложение - программное решение для конкретной прикладной проблемы,
которое связывает прикладную логику процесса с источниками данных и информационных услуг,
хранящихся на гетерогенном множестве базовых информационных систем.
Обычно композитные приложения ассоциированы с процессами деятельности и могут объединять различные этапы процессов, представляя их пользователю через единый интерфейс.
РКСП, 2023 4
НЕОБХОДИМОСТЬ API
Web service (Веб-сервис, веб-служба) – сервис (набор методов),
предоставляемый приложением и доступный для использования по сети.
Стандартизированный способ для взаимодействия разнородных приложений;
Без ограничений на ОС, язык программирования или устройство;
Предоставление услуг для любого приложения.
РКСП, 2023 5
API
API (Application Programming Interface) - это набор инструкций и стандартов,
которые определяют взаимодействие между различными программами.
1.
REST API (Representational State Transfer) - это стандартный протокол взаимодействия между клиентом и сервером, который использует HTTP-запросы для получения и передачи данных. Он использует стандартные
HTTP-методы, такие как GET, POST, PUT и DELETE, для операций чтения, создания, обновления и удаления данных. REST API является наиболее распространенным типом API и широко используется в веб-разработке.
2.
SOAP API (Simple Object Access Protocol) - это протокол, который использует XML-сообщения для обмена данными между клиентом и сервером. Он использует WSDL (Web Services Description Language) для описания доступных функций API и может использовать различные протоколы транспортировки, такие как HTTP, SMTP и FTP.
3.
GraphQL API - это новый стандарт API, который позволяет клиенту запросить только те данные, которые ему нужны, вместо того, чтобы получать все доступные данные. Он использует свой язык запросов и позволяет делать более гибкие запросы, чем REST API.
4.
Webhooks - это механизм, который позволяет приложению получать уведомления о событиях, происходящих на другом сервере или приложении. Это позволяет приложению реагировать на события в режиме реального времени и обновлять свои данные соответствующим образом.
РКСП, 2023 6
REST API
REST API имеет несколько преимуществ перед другими типами API.
1.
Гибкость - REST API позволяет клиенту выбирать формат данных, которые он хочет получить, и использовать различные HTTP-методы для выполнения различных операций.
2.
Масштабируемость - REST API позволяет легко масштабировать приложение, так как каждый запрос обрабатывается независимо от других запросов, и сервер может обслуживать множество клиентов одновременно.
3.
Кэширование - REST API может использовать кэширование для ускорения производительности, так как клиент может кэшировать ответы сервера на запросы и повторно использовать их в будущем.
4.
Совместимость - REST API основан на стандартных протоколах HTTP и может быть использован с любым языком программирования или платформой, которые поддерживают HTTP.
РКСП, 2023 7
REST API
РКСП, 2023 8
REST API: ТРЕБОВАНИЯ К АРХИТЕКТУРЕ
Модель клиент-сервер.
Отсутствие состояния.
Кэширование.
Единообразие интерфейса.
Слои.
Код по требованию
(необязательное ограничение).
Системы, поддерживающие REST, называются
RESTful-системами:
Явное использование HTTP-методов.
Предоставление URI, аналогичных структуре каталогов.
Передача данных в XML, JavaScript Object
Notation (JSON).
РКСП, 2023 9
CRUD = CREATE, READ, UPDATE, DELETE
CRUD – аббревиатура, обозначающая четыре базовые функции, используемые при работе с базами данных:
создание (create), чтение (read), модификация (update), удаление (delete). Термин введен Джеймсом
Мартином в 1983 г. как стандартная классификация функций по манипуляции данными.
В системах, реализующих доступ к базе данных через API в стиле REST, эти функции реализуются зачастую
(но не обязательно) через HTTP-методы POST, GET, PUT и DELETE соответственно:
Действие -> HTTP-метод
Create -> POST
Read -> GET
Update -> PUT
Delete -> DELETE
РКСП, 2023 10
ОСОБЕННОСТИ NESTJS
NestJS - фреймворк для создания масштабируемых серверных приложений на Node.js
Поддержка TypeScript и JavaScript
Основан на принципах SOLID и DRY
Использование декораторов для описания компонентов
Организация приложения в модули и компоненты
Интеграция с популярными библиотеками
Поддержка множественных протоколов (HTTP, WebSocket, gRPC и другие)
Предоставление инструментов для тестирования и отладки
Поддерживает популярные библиотеки, такие как TypeORM, GraphQL и WebSocket
РКСП, 2023 11
МОДУЛИ
Модуль - фундаментальная единица приложения в NestJS
Каждый модуль имеет свой контекст выполнения, собственный набор провайдеров и экспортируемых объектов
Помогает организовать приложение на отдельные логические блоки, упрощает тестирование и повторное использование кода
РКСП, 2023 12
МОДУЛИ
РКСП, 2023 13
КОНТРОЛЛЕР
Контроллер в NestJS - это класс, который определяет маршруты и обработчики запросов. Контроллеры обычно содержат методы, которые соответствуют HTTP
методам, таким как
GET
,
POST
,
PUT
и
DELETE
, и обрабатывают запросы на соответствующие маршруты.
import
{ Controller, Get } from
'@nestjs/common'
;
@Controller
(
'cats'
)
export class
CatsController
{
@Get
()
findAll(): string
{
return
'This action returns all cats'
;
}
}
Контроллеры могут использовать различные декораторы для настройки маршрутов и
обработчиков запросов. Например, декоратор
@Param()
может использоваться для извлечения параметров маршрута, а
@Body()
- для извлечения тела запроса.
РКСП, 2023 14
КОНТРОЛЛЕР
РКСП, 2023 15
КОНТРОЛЛЕР
Контроллеры - обработчики HTTP-запросов
Отвечают за обработку входящих запросов, передачу данных в провайдеры и формирование ответов
Декорируются декоратором
@Controller и могут иметь дополнительные декораторы для обработки конкретных маршрутов
РКСП, 2023 16
ДЕКОРАТОРЫ КОНТРОЛЛЕРА
1.
@Controller()
: декоратор, который определяет класс как контроллер. Пример:
2.
@Get()
,
@Post()
,
@Put()
,
@Delete()
:
декораторы, которые определяют маршруты
HTTP методов для обработки запросов. Пример:
3.
@Param()
: декоратор, который извлекает параметры маршрута. Пример:
@Controller
(
'cats'
)
export class
CatsController
{
// ...
}
@Get
()
findAll(): string
{
return
'This action returns all cats'
;
}
@Post
()
create(): string
{
return
'This action creates a new cat'
;
}
@Get
(
':id'
)
findOne(
@Param
(
'id'
) id: string
): string
{
return
`This action returns a #
${id}
cat`
;
}
4.
@Query()
: декоратор, который извлекает параметры запроса. Пример:
5.
@Body()
: декоратор, который извлекает тело запроса. Пример:
6.
@Headers()
: декоратор, который извлекает заголовки запроса. Пример:
7.
@Redirect()
: декоратор, который перенаправляет запрос на другой маршрут.
Пример:
@Get
()
findAll
(
@Query
() query: ListAllEntitiesDto) {
return
`This action returns all cats (limit:
${query.limit}
item
}
@Post
()
create
(
@Body
() createCatDto: CreateCatDto) {
return
`This action adds a new cat:
${createCatDto.name}
`
;
}
@Get
()
findAll
(
@Headers
(
'authorization'
) auth: string
) {
return
`This action requires [authorization header](poe://www.p
}
@Get
(
'docs'
)
@Redirect
(
'https://docs.nestjs.com'
)
getDocs
() {}
РКСП, 2023 17
ДЕКОРАТОРЫ КОНТРОЛЛЕРА
@UseGuards()
: декоратор, который применяет гварды к методам контроллера.
@UseFilters()
: декоратор, который применяет фильтры к методам контроллера.
@UsePipes()
: декоратор, который применяет конвейеры к методам контроллера.
@UseGuards
(AuthGuard())
@Get
()
findAll(): string
{
return
'This action returns all cats'
;
}
@UseFilters
(HttpExceptionFilter)
@Get
()
findAll(): string
{
return
'This action returns all cats'
;
}
@UsePipes
(
new
ValidationPipe())
@Post
()
create
(
@Body
() createCatDto: CreateCatDto) {
return
`This action adds a new cat:
${createCatDto.name}
`
;
}
@Render()
: декоратор, который указывает, что метод контроллера должен отображать шаблон представления.
@HttpCode()
: декоратор, который позволяет установить код состояния HTTP для ответа метода контроллера. Пример:
@Header()
: декоратор, который позволяет установить заголовок HTTP для ответа метода контроллера.
@Get
(
'about'
)
@Render
(
'about'
)
getAbout
() {}
@Post
()
@HttpCode
(
201
)
create(): string
{
return
'This action creates a new cat'
;
}
@Get
()
@Header
(
'Cache-Control'
,
'none'
)
findAll(): string
{
return
'This action returns all cats'
;
}
РКСП, 2023
18
ПРОВАЙДЕРЫ
Провайдеры - компоненты, которые могут быть инжектированы в другие компоненты
Могут быть сервисами, репозиториями, фабриками и т.д.
Декорируются декоратором
@Injectable и могут иметь зависимости, которые будут автоматически инжектированы
РКСП, 2023 19
ПРОВАЙДЕРЫ
РКСП, 2023 20
СЕРВИС
Сервисы в NestJS - это классы, которые содержат бизнес-логику приложения, выполняют операции с данными и предоставляют функциональность для контроллеров и других сервисов.
1. Создайте класс сервиса, используя декоратор
@Injectable()
2. Зарегистрируйте сервис в провайдере модуля, используя массив провайдеров в декораторе
@Module()
Вы можете зарегистрировать сервис в корневом модуле, чтобы сделать его доступным во всем приложении, или в других модулях, чтобы сделать его доступным только внутри этих модулей
3. Инжектируйте сервис в контроллер или другой сервис, используя декоратор
@Inject()
@Module
({
providers: [CatsService],
})
export class
CatsModule
{}
@Controller
(
'cats'
)
export class
CatsController
{
constructor
(
private readonly catsService: CatsService) {}
РКСП, 2023 21
ДЕКОРАТОРЫ СЕРВИСА
1.
@Injectable()
: декоратор, который указывает,
что класс является сервисом и может быть инжектирован в другие классы.
2.
@Inject()
: декоратор, который указывает,
какую зависимость нужно инжектировать в класс сервиса.
3.
@Optional()
: декоратор, который указывает,
что зависимость не является обязательной для инжектирования. Если зависимость не найдена,
то будет использовано значение по умолчанию.
@Injectable
()
export class
CatsService
{
// ...
}
@Injectable
()
export class
CatsService
{
constructor
(
private readonly db: DatabaseService) {}
}
@Injectable
()
export class
CatsService
{
constructor
(
@Optional
() private readonly logger: LoggerService
}
4.
@SkipSelf()
: декоратор, который указывает,
что зависимость должна быть найдена в родительском провайдере, а не в текущем.
5.
@Self()
: декоратор, который указывает, что зависимость должна быть найдена в текущем провайдере, а не в родительском.
6.
@Global()
: декоратор, который указывает, что провайдер должен быть доступен во всем приложении, а не только в текущем модуле.
@Injectable
()
export class
CatsService
{
constructor
(
@SkipSelf
() private readonly parent: CatsService)
}
@Injectable
()
export class
CatsService
{
constructor
(
@Self
() private readonly logger: LoggerService) {
}
@Global
()
@Module
({
providers: [DatabaseService],
exports: [DatabaseService],
})
export class
DatabaseModule
{}
РКСП, 2023 22