zoukankan      html  css  js  c++  java
  • 初识nest.js

    nest的核心概念:

    Nest的核心概念是提供一种体系结构,它帮助开发人员实现层的最大分离,并在应用程序中增加抽象。

    架构预览:

    主要有三个核心概念:模块Module,  控制器Controller, 服务与依赖注入 Provider Dependency injection

    1. 模块Module:   用于将代码拆分为独立的和可重用的模块,例如用户信息模块,然后将该用户模块的控制器和服务集合进来,最后直接将用户模块导入到根Module就可以使用了。
    2. 控制器Controller: 负责处理客户端传入的请求参数并向客户端返回响应数据。nest.js提供许多http请求的装饰器,如例如@Body(),@Post()等。控制器不需要定义任何诸如从客户端获取数据、验证用户输入等工作,这些都是交给服务Provider处理,通过把任务委托给各种服务,可以让控制器类更加精简、高效。
    3. 服务Provider :在这里处理所有请求执行逻辑,在控制器中通过constructor函数以依赖注入的方式实现。
      constructor(private readonly catsService: CatsService) {}

    其他概念:

    中间件Middleware: 中间件功能可以访问请求和响应对象,在路由处理程序之前调用。

    // 实现一个带有`@Injectable()`装饰器的类打印中间件
    import { Injectable, NestMiddleware, MiddlewareFunction } from '@nestjs/common';
    
    @Injectable()
    export class LoggerMiddleware implements NestMiddleware {
      resolve(...args: any[]): MiddlewareFunction {
        return (req, res, next) => {
          console.log('Request...');
          next();
        };
      }
    }

    使用有两种方式:全局注册和局部模块注册。

    //  全局注册
    async function bootstrap() {
      // 创建Nest.js实例
      const app = await NestFactory.create(AppModule, application, {
        bodyParser: true,
      });
      // 注册中间件
      app.use(LoggerMiddleware());
      // 监听3000端口
      await app.listen(3000);
    }
    bootstrap();
    //  模块局部注册
    export class CnodeModule implements NestModule {
      configure(consumer: MiddlewareConsumer) {
        consumer
          .apply(LoggerMiddleware)
          .with('ApplicationModule')
          .exclude(
            { path: 'user', method: RequestMethod.GET },
            { path: 'user', method: RequestMethod.POST },
          )
          .forRoutes(UserController);
      }
    }

    全局注册影响全部路由,局部注册只是影响当前路由下的路由。

    过滤器Exception filter:负责在整个应用程序中处理所有抛出的异常,同时可以自定义错误状态码和错误消息内容。

    管道 Pipe:管道可以把你的请求参数根据特定条件验证类型、对象结构或映射数据。管道是一个纯函数,不应该从数据库中选择或调用任何服务操作。

    守卫 Guard:通常用作权限认证

    他们之间的执行顺序:

    客户端请求 ---> 中间件 ---> 守卫 ---> 拦截器之前 ---> 管道 ---> 控制器处理并响应 ---> 拦截器之后 ---> 过滤器

    安装:

    npm i -g @nestjs/cli

     初始化项目:

    $ nest new my-awesome-app
    或者
    $ nest n my-awesome-app

    初始化完成之后,需要创建模块,控制器等,除了手动创建,可以直接用命令的方式创建,以下是常用的创建的命令:

    class (简写: cl) 类
    controller (简写: co) 控制器
    decorator (简写: d) 装饰器
    exception (简写: e) 异常捕获
    filter (简写: f) 过滤器
    gateway (简写: ga) 网关
    guard (简写: gu) 守卫
    interceptor (简写: i) 拦截器
    middleware (简写: mi) 中间件
    module (简写: mo) 模块
    pipe (简写: pi) 管道
    provider (简写: pr) 供应商
    service (简写: s) 服务

    例如创建一个car的module,可以使用nest g mo car

    了解了框架的基本内容之后,就可以连接数据库进行CURD练习上手了。

    这里用的是Mysql,先安装基本包:

    npm install --save @nestjs/typeorm typeorm mysql

    这里用typeorm基本数据库操作,如对typeorm不熟悉可以点击这里了解:typeorm

    安装完之后在app.module.ts中设置数据库

    import { Module } from '@nestjs/common';
    import { AppController } from './app.controller';
    import { AppService } from './app.service';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { PhotoModule } from './photo/photo.module';
    
    
    @Module({
      imports: [
        TypeOrmModule.forRoot({
            type: 'mysql',
            host: 'localhost',
            port: 3306,
            username: 'root',
            password: 'root',
            database: 'test',
            entities: [__dirname + '/**/*.entity{.ts,.js}'],
            synchronize: true,
          }),
          PhotoModule
      ],
      controllers: [AppController],
      providers: [AppService],
    })
    export class AppModule {}

    为方便,这里直接用安装typeorm时生成的photo文件demo从数据库中进行增删改查,使用时先将photo.module.ts在app.module.ts中先注册下。

    photo.controller.ts内容如下

    import { Controller, Get, Post, Param, Body } from '@nestjs/common';
    import { PhotoService } from './photo.service';
    import { Photo } from './photo.entity';
    
    @Controller()
    export class PhotoController {
      constructor(private readonly photoService: PhotoService) {}
    
      @Get('photo')
      findAll(): Promise<Photo[]> {
        return this.photoService.findAll();
      }
    
      @Post('photo/create')
      create(@Body() params) {
          return this.photoService.create(params);
      }
    }

    photo.service.ts内容如下:

    import { Injectable, Inject } from '@nestjs/common';
    import { InjectRepository } from '@nestjs/typeorm';
    import { Repository } from 'typeorm';
    import { Photo } from './photo.entity';
    
    @Injectable()
    export class PhotoService {
      constructor(
        @InjectRepository(Photo)
        private readonly photoRepository: Repository<Photo>,
      ) {}
    
      async findAll(): Promise<Photo[]> {
        return await this.photoRepository.find();
      }
    
      async create(params) {
       // 增加一条数据 let photo
    = new Photo(); photo.name = params.name; photo.description = params.description; photo.filename = params.filename; photo.views = params.views; photo.isPublished = params.isPublished; return this.photoRepository.save(photo) .then(res => { return this.findAll(); }) .catch(err => { return err; }) } }

    然后打开postman工具模拟post请求:

    可以看到成功插入并返回数据,去数据库中再看下:

    其他更新,删除操作也同理。。。

    基本入门完毕~

  • 相关阅读:
    Java文件之NIO核心组件之三选择器
    plsql备份表---只是表---不包含表数据
    根据id来大量删除数据between
    符号的问题
    excel表格中添加单引号的方法
    oracle中insert 多条数据方法
    sql developer以字段来删除大量数据
    Day 29
    Day 28
    Day 27
  • 原文地址:https://www.cnblogs.com/pjl43/p/9826748.html
Copyright © 2011-2022 走看看