• Nest.js总结


    参考Nest中文文档

    启动项目

    全局安装Nest.js脚手架,然后利用脚手架创建一个新项目指令如下所示:

    $ npm i -g @nestjs/cli
    
    $ nest new my-project-name
    
    • 1
    • 2
    • 3

    要使用 TypeScript 的 更严格 功能集创建新项目,请将 --strict 标志传递给 nest new 命令。
    如下所示:nest new [my-project-name] --strict


    项目文件

    打开刚刚创建的项目文件,展开如下图所示:

    ├── my-test
    │ ├── src
    │ │ ├── app.controller.spec.ts
    │ │ ├── app.controller.ts
    │ │ ├── app.module.ts
    │ │ ├── app.service.ts
    │ │ └── main.ts
    │ ├── test
    │ │ ├── app.e2e-spec.ts
    │ │ └── jest-e2e.json
    │ ├── package.json
    │ ├── README.md
    │ ├── tsconfig.json
    │ ├── …

    文件名说明
    app.controller.spec.ts控制器的单元测试。
    app.controller.ts具有单一路由的基本控制器。
    app.module.ts应用的根模块。
    app.service.ts具有单一方法的基本服务。
    main.ts使用核心函数 NestFactory 创建 Nest 应用实例的应用入口文件。
    test/*模块的单元测试文件。

    启动项目需要热更新的可以运行指令"start:dev"


    创建一个控制器

    $ nest g controller [name]
    
    • 1

    要使用 CLI 创建控制器,只需执行 $ nest g controller [name] 命令即可。
    为了避免生成测试文件,你可以传递 --no-spec 标志,如下所示:nest g resource [name] --no-spec

    // cats.controller.ts
    import { Controller, Get, Post } from '@nestjs/common';
    
    @Controller('cats')
    export class CatsController {
      @Post()
      create(): string {
        return 'This action adds a new cat';
      }
    
      @Get()
      findAll(): string {
        return 'This action returns all cats';
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    Nest 为所有标准的 HTTP 方法提供装饰器:@Get()、@Post()、@Put()、@Delete()、@Patch()、@Options() 和 @Head()。

    状态码
    // code.controller.ts
    import { Controller, HttpCode, Post } from '@nestjs/common';
    
    @Controller('code')
    export class CodeController {
      @Post()
      @HttpCode(204)
      create() {
        return 'This action adds a new cat';
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    重定向
    // redirect.controller.ts
    import { Controller, Get, Redirect } from '@nestjs/common';
    
    @Controller('redirect')
    export class NofoundController {
      @Get()
      @Redirect('/')
      redirectToNewRoute() {}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    使用数据库

    本地安装一个MySQL,然后启动数据库服务,为了方便演示,使用phpStudy这个集成环境;

    在项目安装访问数据库的模块:

    $ npm install --save @nestjs/typeorm typeorm mysql2
    
    
    • 1
    • 2

    安装过程完成后,我们可以将 TypeOrmModule 导入到根 AppModule 中。

    // app.module.ts
    import { Module } from '@nestjs/common';
    import { TypeOrmModule } from '@nestjs/typeorm';
    
    @Module({
      imports: [
        TypeOrmModule.forRoot({
          type: 'mysql',
          host: 'localhost',
          port: 3306,
          username: 'root',
          password: 'root',
          database: 'test',
          entities: [],
          synchronize: true,
        }),
      ],
    })
    export class AppModule {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    以上链接数据库的方式可通过配置config,使用环境变量传递,如下所示:

    DATABASE_USER=root
    DATABASE_PASSWORD=root
    
    • 1
    • 2
    实现一个新增接口
    
    import { Injectable } from '@nestjs/common';
    import { CreateUserDto } from './dto/create-user.dto';
    import { InjectRepository } from '@nestjs/typeorm';
    import { User } from './entities/user.entity';
    import { DataSource, Repository } from 'typeorm';
    
    @Injectable()
    export class UserService {
      constructor(
        @InjectRepository(User)
        private usersRepository: Repository<User>,
        private dataSource: DataSource,
      ) {}
      async create(createUserDto: CreateUserDto) {
        const { firstName, lastName, isActive } = createUserDto;
        try {
          await this.usersRepository
            .createQueryBuilder('user')
            .insert()
            .into(User)
            .values([{ firstName, lastName, isActive: !!Number(isActive) }])
            .execute();
          return {
            code: '200',
            data: '',
            msg: 'success',
          };
        } catch (error) {
          return {
            code: 'E500',
            data: JSON.stringify(error),
            msg: 'error',
          };
        }
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    实现一个查询列表接口
    
    import { Injectable } from '@nestjs/common';
    import { CreateUserDto } from './dto/create-user.dto';
    import { InjectRepository } from '@nestjs/typeorm';
    import { User } from './entities/user.entity';
    import { DataSource, Repository } from 'typeorm';
    
    @Injectable()
    export class UserService {
      constructor(
        @InjectRepository(User)
        private usersRepository: Repository<User>,
        private dataSource: DataSource,
      ) {}
        async findAll(): Promise<UserList> {
    		const data = await this.usersRepository
    		  .createQueryBuilder('user')
    		  .getMany();
    		return {
    		  data,
    		  code: '200',
    		  msg: 'success',
    		};
    	  }
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    使用数据源查阅TypeORM

  • 相关阅读:
    Elasticsearch倒排索引(二)深入Term Index(待补图)
    【编程题】【Scratch四级】2019.12 打棒球
    北京迪文DWIN 4.3吋 DMT48270C043_06WT 触控屏(DGUS II屏) Bring-up
    一文带你了解”数据分箱“技术
    jmeter 压测数据库
    求因子数量
    element-plus 循环生成的多个input输入框如何校验
    app运行踩过的坑大赏
    web前端期末大作业 html+css+javascript防天天生鲜官网网页设计实例 企业网站制作
    usb 命名乱的一批,怎么破
  • 原文地址:https://blog.csdn.net/qq_45272329/article/details/136546113