控制器是由类和装饰器组成的,控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。
cli命令创建控制器
使用nest cli命令创建控制器
执行nest generate controller
或简写:nest g co
后会提示输入控制器名称,此命令会帮我们自动创建控制器和相应的测试文件,并自动配置AppModule,如果不想生成测试文件,可以向该命令传递--no-spec
。生成的控制器在src/abc
下,如果想在指定目录下生成,例如:nest g co module/abc
将被放置在/src/module/abc
中
定义路由
所有
HTTP
修饰器都可以指定一个string
类型的参数
所有参数修饰器都可以指定一个string
类型的参数用来解析请求路径/请求体中的指定参数
下面代码中在 @Controller() 装饰器中使用animal
路径前缀,这个控制器会处理所有路径以/animal
开头的请求
import { Controller } from '@nestjs/common';
@Controller('animals')
export class AnimalController {}
此时的控制器没有任何路由,接下来,需要在animal
控制器中定义一个捕获GET
请求的路由
import { Controller,Get } from '@nestjs/common';
@Controller('animals')
export class AnimalController {
@Get()
findAll(){
return 'animals';
}
}
上面的findAll
方法,被@Get
修饰器装饰。/animal
路径的GET
请求都会都会映射到findAll
方法中并返回结果animal
所有HTTP
修饰器都可以指定一个string
类型的参数,可以创建一个处理指定URL
的路由,例如:处理来自/animals/cats
路径的GET
请求
import { Controller,Get } from '@nestjs/common';
@Controller('animals')
export class AnimalController {
@Get("cats")
findAll(){
return 'all cats';
}
}
路由参数
假设向/animals/xxx
发出一个GET
请求,其中的xxx
是动态,定义这种具有动态属性的路径,可以给HTTP
修饰器传入参数标记,用来捕获请求路径中这个位置的动态参数,可以用@Param
装饰器获取请求路径的动态参数,也可以传入一个指定的参数给装饰器,然后在函数体内直接使用
import { Controller,Get,Param,Query } from '@nestjs/common';
@Controller('animals')
export class CoffeesController {
@Get(":id")
findOne(@Param() params){
return params.id;
}
@Get()
findSome(@Query() query,@Query('id') id,@Query('name') name){
return `query is ${query},id is ${id},name is ${name}`
}
}
如上面的例子,当请求路径为/coffees/XXX
时,会被映射到findOne
方法中,并且这个方法会读取到请求路径中的动态参数。当请求路径为/coffees
时,会被映射到findSome
方法中,并且这个方法会读取到请求的Query
参数,并且可以传递给参数装饰器一个string
参数,然后在方法体内直接使用该参数,而不是通过query.xxx
的方式,
@Query("id") id
将请求体的id参数赋值给id变量,便于函数中直接使用
@Query("name") name
将请求体的name参数赋值给name变量,便于函数中直接使用