返回文章列表 →

Note

控制器

nestjs的控制器介绍

发布于 更新于

controller

控制器,控制器的职责是接收请求、委托给服务层处理业务逻辑,并返回结果,细化为:处理请求(参数)、调用service处理业务、返回响应结果。通过路由机制决定了哪个控制器将处理每个请求。通常,一个控制器具有多个路由,每个路由可以执行不同的操作,一个路由可以看做是一个接口。

@Controller

控制器的装饰器,为修饰对象添加元数据,让NestJS知道它是控制器。如:

定义控制器(生成路由)

import { Controller, Get } from '@nestjs/common';

/**
 * @Controller装饰器告诉NestJS,UserController 是个控制器类,控制器公共路径是 /users
 */
@Controller('users')
export class UserController  {
    // @Get装饰器告诉NestJs,findAll 是一个路由处理方法,请求方式是 GET,路由是/userList
    @Get('userList')
    findAll(): string {
    return 'This action returns all user';
    }
    // 上述最终组合出来的接口就是:GET /users/userList
}

装饰器会给类添加类似下面的信息:

UserController:
  类型:Controller
  路径:users

findOne:
  请求方式:GET
  路径:/userList

获取请求参数

import { Controller, Get, Param } from '@nestjs/common';

@Controller('users')
export class UserController  {
    // 请求方式是 GET,路由是/:id。"id"是一个“路径参数占位符”,可以匹配 /users/ 后面的一整段字符。如 /users/123、/user/sdfjl
    @Get(':id')
    /**
     * @Param() 装饰器用于修饰方法参数,以此获取到参数的属性
     */
    findOne(@Param() params: any): string {
    console.log(params.id);
    return `This action returns a #${params.id} cat`;
    }
    // 上述接口为:users/:id
}

也可以向装饰器传递特定的参数标记,直接在方法体中按名称引用路由参数

import { Controller, Get, Param, Query } from '@nestjs/common';

@Controller('cats')
export class CatsController  {
    @Get(':id')
    findOne(@Param('id') id: string): string {
    return `This action returns a #${id} cat`;
    }

    @Get()
    async findAll(@Query('age') age: number, @Query('breed') breed: string): string {
    return `This action returns all cats filtered by age: ${age} and breed: ${breed}`;
    }
}

请求负载

定义 DTO

create-cat.dto.ts

export class CreateCatDto {
  name: string;
  age: number;
  breed: string;
}
使用 DTO

cats.controller.ts

@Post()
async create(@Body() createCatDto: CreateCatDto) {
 return 'This action adds a new cat';
}