Знакомство с Нестом
предисловие
Недавно задумал сделать себе с друзьями платформу тодолистов, давно научился.express
, я хочу идти в ногу со временем и посмотреть, как выглядят самые горячие фреймворки последнего времени. выбрано из нескольких сравненийnest
Запишите его после первого использования, чтобы вы могли обратиться к нему позже.
Размещайте китайские документы для всех, чтобы узнать большеNest
Введение в структуру
- Nest — это инструмент для создания эффективных, масштабируемыхNode.jsФреймворк для серверных приложений. Он использует прогрессивный JavaScript со встроенной и полной поддержкойTypeScript(но все еще позволяет разработчикам кодировать на чистом JavaScript) и сочетает в себе элементы ООП (объектно-ориентированное программирование), FP (функциональное программирование) и FRP (функционально-реактивное программирование).
- Базовая HTTP-платформа фреймворка Nest по умолчанию реализована на основе Express, поэтому не нужно беспокоиться об отсутствии сторонних библиотек. Nest стремится быть платформенно-независимой структурой. Платформа позволяет создавать многократно используемые логические компоненты, которые разработчики могут использовать во многих различных типах приложений. В настоящее время у Nest есть две HTTP-платформы, которые поддерживают «из коробки»: express и fastify могут быть непосредственно введены в проект.
Почему выбирают Нест
- На рынке существует множество фреймворков узлов, из которых вы можете выбирать.
- Express.js — это начало рождения Node.JS,Node.jsИ движок Chrome V8, быстрый и минималистичный серверный JS-фреймворк для разработки.
- Koa.js — это микровеб-фреймворк, на котором очень просто написать hello world, но веб-приложения неотделимы от сессий, шаблонов просмотра, маршрутизации, загрузки файлов и управления журналами. Эти Koa не предоставляются, вам нужно зайти на официальный Middleware, чтобы найти их. Однако 100 человек могут найти 100 комбинаций.
- Egg.js основан на Koa.js, который решает вышеуказанные проблемы, интегрирует лучшие практики сообщества в Koa.js и называется Egg.js, а также решает такие проблемы, как многопроцессный запуск и горячее обновление во время разработки. . Это удобно для разработчиков и работает «из коробки» с лучшей (предпочтительной) конфигурацией «из коробки». Во время разработки Egg.js ECMAScript представил асинхронное ожидание, которое более просто, чем асинхронный синтаксис yield. Позже Koa.js также синхронно последовал этому примеру.
- Midway — это фреймворк Node.js, разработанный командой Alibaba на основе прогрессивной концепции, сочетающей парадигмы ООП и функционального программирования. С яйцом в качестве базовой структуры, а также множеством новых функций, таких как хорошая поддержка определений TypeScript, был запущен Midway, и заинтересованные партнеры могут обратиться к официальной документации, чтобы узнать
- Nest.js – это полнофункциональный фреймворк, основанный на Express.js. Nest.js инкапсулирован в Express.js и в полной мере использует возможности TypeScript. Преимущество Nest.js в том, что сообщество активно и темпы роста радует.GitHubимеют
43.7k Star
В последнее время это популярный фреймворк корпоративного уровня. - Основываясь на всестороннем рассмотрении поддержки базовой поддержки, уровня предприятия и активности сообщества, здесь я решил использовать гнездо для обучения. Студенты могут выбирать в соответствии со своими потребностями.
Создать проект
-
Убедитесь, что на вашем компьютере установлен Node.js (>= 10.13.0)
-
Версия узла, которую я использую здесь,
v14.16.1
Пакет использует управляемую пряжей версию1.22.17
Создать проект
-
$ npm i -g @nestjs/cli $ nest new project-name
-
После создания проекта загляните в каталог проекта.Ниже приводится краткое описание основных файлов:
-
app.controller.ts Пример базового контроллера с одним маршрутом app.controller.spec.ts Пример модульного теста для базового контроллера app.module.ts Корневой модуль приложения. app.service.ts Базовый сервис одним методом main.ts Файл входа приложения. Используется для создания экземпляра приложения Nest. /* main.ts */ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 使用核心类 NestFactory 返回一个 接口对象 await app.listen(3000); // 这里是默认设置的端口号 } bootstrap();
запустить проект
-
$ npm run start:watch // 启动项目并监听代码变动 这里可以在package.json 中进行配置指令
-
我们可以看到服务已经启动,输入本机地址并带上端口号3000,发送一次 get 请求 则会返回 `Hello World`。 这里是因为在 app.controll.ts 文件中 @Get()HTTP请求装饰器告诉Nest为HTTP请求的特定端点创建处理程序。
маршрутизация
-
Прежде чем мы начнем писать код, давайте кратко рассмотрим базовую конфигурацию маршрутизации в гнезде.На данный момент я понимаю, что маршрутизация гнезда состоит из Глобальная маршрутизация Префикс маршрутизации (локальная маршрутизация) Декоратор методов Составная карта маршрутизации для внешнего использования.
-
/* main.ts */ main文件中我们可以在项目监听前配置一个全局的api前缀 async function bootstrap() { const app = await NestFactory.create(AppModule); //设置全局前缀 app.setGlobalPrefix('api'); await app.listen(3000); } /* app.controller.ts */ @Controller('user') // 控制器设置路由前缀 我理解为局部路由 export class AppController { constructor(private readonly appService: AppService) {} @Get('find') // 方法装饰器设置路由路径 这里我理解为设置api子路由 getHello(): string { return this.appService.getHello(); } }
-
Вышеупомянутый метод отображается в полный маршрут в API как
GET api/user/find
. -
где декоратор HTTP-запроса @Get() указывает Nest создать обработчик для конкретной конечной точки HTTP-запроса.
- можно увидеть выше
get
Получите запросы и маршруты для использования, давайте посмотримnest
Как получитьpost
и другие методы запроса
Получайте запросы разными способами
-
Здесь используется точка знаний о декораторе запросов, предоставленная Nest.
Request
представитель объектаHTTP
запрос и имеет строку запроса, параметры параметров запроса, атрибуты HTTP-заголовка и тела (HTTP body) (вздесьПодробнее). В большинстве случаев нет необходимости получать их вручную. Мы можем использовать специальные декораторы, такие как готовые@Body()
или@Query()
. Ниже приведен параллельный список декораторов, предоставляемых Nest, и базовых объектов для конкретных платформ, которые они представляют. -
Давайте посмотрим, как получить в гнезде
get post put delete
Делается запрос на создание базового контроллера с несколькими доступными декораторами. Контроллер предоставляет несколько методов доступа к внутренним данным и управления ими.
Get
-
Сначала мы создаем пользовательский сервис/контроллер/модуль
/ * user.service.ts */ 先创建一个 user service服务文件 import { Injectable } from '@nestjs/common'; @Injectable() // // 这里 export class UserService { findUser(sid: string): string { console.log(sid); if (sid === '123456') { return 'kid is here'; } return 'No one here'; } }
-
Служба будет отвечать за хранение и извлечение данных, которыми занимается
UserController
пользуемся, пользуемся@Injectable()
украсить этот класс/ * user.controller.ts */ 创建一个 user 控制器文件 import { Controller, Get, Query } from '@nestjs/common'; import { UserService } from './user.service'; @Controller('user') export class UserController { constructor(private readonly userService: UserService) {} @Get('findOne') //这里暴露出的路由为 user/find findUser(@Query() query: any) { return this.userService.findUser(query.sid); }
-
Назначение контроллера — получать запросы, специфичные для приложения.маршрутизацияМеханизм контролирует, какой контроллер получает какие запросы. Как правило, на контроллер приходится несколько маршрутов, и разные маршруты могут выполнять разные действия.
-
Чтобы создать базовый контроллер, мы используем класс и
装饰器
. Декоратор связывает класс с необходимыми метаданными и позволяет Nest создавать карты маршрутов (привязывая запросы к соответствующим контроллерам)./ * user.module.ts */ 创建一个 user mod import { Module } from '@nestjs/common'; import { UserController } from './user.controller'; import { UserService } from './user.service'; @Module({ controllers: [UserController], providers: [UserService], }) export class UserModule {} /* app.module.ts */ 最后在app.module中引入我们自己写的module import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { UserModule } from './user/user.module'; @Module({ imports: [UserModule], controllers: [AppController], providers: [AppService], }) export class AppModule {}
-
Контроллер готов к использованию, но Nest еще не знает об этом
UserController
существует, поэтому он не создает экземпляр этого класса. -
Контроллеры всегда принадлежат модулям, поэтому мы
@Module()
Декоратор содержитcontrollers
Причина массива. В связи с добавлением корневого модуляAppModule
, мы не определяли никакие другие модули, поэтому воспользуемся ими, чтобы представитьUserController
Используйте почтальон, чтобы увидеть эффект
-
- Вы можете видеть, что запрос на отправку запроса на получение атакован.
- Далее мы переходим к использованию
post put delete
Отправьте запрос, узнайте, как Nest принимает и обрабатывает
Post
-
файл user.service
/ * user.service.ts */ 先创建一个 user service服务文件 import { Injectable } from '@nestjs/common'; @Injectable() // // 这里 setUser(sid: string, body: any): any { if (sid === '123456') { return { msg: '设置成功', body, }; } }
-
файл user.controller
/ * user.controller.ts */ 创建一个 user 控制器文件 import { Controller, Get, Query } from '@nestjs/common'; import { UserService } from './user.service'; @Controller('user') export class UserService { @Post('set') setUser(@Body() body: any, @Query() query: any) { return this.userService.setUser(query.sid, body); } }
Используйте почтальон, чтобы увидеть эффект
-
- Вы можете видеть, что отправка почтового запроса является атакой.
Put
-
файл user.service
/ * user.service.ts */ 先创建一个 user service服务文件 import { Injectable } from '@nestjs/common'; @Injectable() // // 这里 updateUser(sid: string, body: any): any { if (sid === '123456') { return { msg: '设置成功', body, }; } }
-
файл user.controller
-
Здесь используется декоратор Param
@Param()
Параметры, используемые для украшения метода (в приведенном выше примереparams
), и в рамках этого методапараметр маршрутаАтрибут, являющийся параметром декорируемого метода. Как показано в приведенном выше коде, мы можем обратиться кparams.id
для доступа (в пути маршрутизации)id
параметр. Вы также можете передать определенные маркеры параметров в декоратор, а затем ссылаться на параметры маршрута непосредственно по имени параметра в теле метода./ * user.controller.ts */ 创建一个 user 控制器文件 import { Body, Controller, Get, Param, Post, Put, Query } from '@nestjs/common'; import { UserService } from './user.service'; @Controller('user') export class UserService { @Put(':sid') updateUser(@Param('sid') sid: string, @Body() body: any) { return this.userService.updateUser(sid, body); } }
Используйте почтальон, чтобы увидеть эффект
-
- Вы можете видеть, что отправка запроса на размещение является атакой.
Delete
-
файл user.service
/ * user.service.ts */ 先创建一个 user service服务文件 import { Injectable } from '@nestjs/common'; @Injectable() // // 这里 deleteUser(sid: string): any { if (sid === '123456') { return { msg: '删除成功', }; } }
-
файл user.controller
/ * user.controller.ts */ 创建一个 user 控制器文件 import { Body, Controller, Get, Param, Post, Put, Query } from '@nestjs/common'; import { UserService } from './user.service'; @Controller('user') export class UserService { @Delete(':sid') deleteUser(@Param('sid') sid: string) { return this.userService.deleteUser(sid); } }
Используйте почтальон, чтобы увидеть эффект
-
-
Вы можете видеть, что отправка запроса на удаление является атакой.
-
Суммировать
- До сих пор мы использовали декоратор Nest для имитации основного запроса интерфейса на добавление, удаление, изменение и проверку, а также распознавание трех основных строительных блоков приложения в Nest.
Module Controller Service
- Разделение служб и элементов управления четкое, что улучшает работу с кодом.
TypeScrip
личного использования все еще нуждается в улучшении и будет продолжать учиться в будущем hhh