Знакомство с Node Framework Nest.js

Node.js NestJS
Знакомство с Node Framework Nest.js

Знакомство с Нестом

предисловие

Недавно задумал сделать себе с друзьями платформу тодолистов, давно научился.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 中进行配置指令
    

image.png

  •   我们可以看到服务已经启动,输入本机地址并带上端口号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-запроса.

image.png

  • можно увидеть вышеgetПолучите запросы и маршруты для использования, давайте посмотримnestКак получитьpostи другие методы запроса

Получайте запросы разными способами

  • Здесь используется точка знаний о декораторе запросов, предоставленная Nest.Requestпредставитель объектаHTTPзапрос и имеет строку запроса, параметры параметров запроса, атрибуты HTTP-заголовка и тела (HTTP body) (вздесьПодробнее). В большинстве случаев нет необходимости получать их вручную. Мы можем использовать специальные декораторы, такие как готовые@Body() или @Query(). Ниже приведен параллельный список декораторов, предоставляемых Nest, и базовых объектов для конкретных платформ, которые они представляют.

  • image.png

  • Давайте посмотрим, как получить в гнезде 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

    Используйте почтальон, чтобы увидеть эффект
  • image.png

    • Вы можете видеть, что запрос на отправку запроса на получение атакован.
    • Далее мы переходим к использованию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);
        } 
    }
    
Используйте почтальон, чтобы увидеть эффект
  • image.png
    • Вы можете видеть, что отправка почтового запроса является атакой.

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);
       }
    }
    
Используйте почтальон, чтобы увидеть эффект
  • image.png

    • Вы можете видеть, что отправка запроса на размещение является атакой.

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);
       }
    }
    
Используйте почтальон, чтобы увидеть эффект
  • image.png

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

Суммировать

  • До сих пор мы использовали декоратор Nest для имитации основного запроса интерфейса на добавление, удаление, изменение и проверку, а также распознавание трех основных строительных блоков приложения в Nest.Module Controller Service
  • Разделение служб и элементов управления четкое, что улучшает работу с кодом.TypeScripличного использования все еще нуждается в улучшении и будет продолжать учиться в будущем hhh

использованная литература