控制器
控制器:负责处理传入的请求和向客户端返回响应。
快捷初始化
可以使用 CLI 快捷创建控制器,只需执行如下命令:
nest g controller cats
图一:在项目 src 目录下执行命令。
图二:在项目根目录下执行命令。
如图一、图二所示,只要是在项目里执行命令,控制器默认归属在 src 目录下。生成的控制器代码如图三所示。
图三:CLI 命令生成控制器代码。
路由
路由:控制哪个控制器接收哪些请求。由控制器中可选的路径前缀和请求方法装饰器中声明的任何路径字符串组合而成。
通常,一个控制器有多个路由,不同的路由可以执行不同的操作。
路由与处理函数命名无关。
装饰器
装饰器:将类与所需的元数据相关联,并使 Nest 能够创建路由映射(将请求绑定到相应的控制器)。
示例
使用类和 @Controller() 装饰器创建一个基本的控制器。
/**
* @description: 基本的控制器示例
* @update: 2021-09-08 18:10:08
* @author: Ada.H
*/
// cats.controller.ts
import { Controller, Get } from '@nest/common';
// 设置路由路径前缀 cats
@Controller('cats')
export class CatsController {
// 接口方法 get 及接口路径独立部分 query
@Get('query')
findAll(): string {
return '查询所有猫咪';
}
}
// 接口路由:http://localhost:3000/cats/query
在 @Controller() 装饰器中使用路径前缀,可以轻松地对一组相关的路由进行分组,并最大程度减少代码冗余(不必为每个文件中的每个路由重复路径前缀那部分)。
@Get() HTTP 请求方法装饰器,告诉 Nest 为 HTTP 请求的特定端点创建处理程序。
端点:对应于
HTTP请求方法和路由路径。
GET /cats/query,请求路由映射(由可选的控制器路径前缀和请求方法装饰器中声明的任何路径字符串组合而成)。
findAll() 处理函数。Nest 使用两种不同的操作响应:
| 类型 | 特点 |
|---|---|
| 标准(推荐) | 内置方法。 只需要返回值,其余的由 Nest 负责:当返回一个 JavaScript 对象或数组时,将自动序列化为 JSON;当返回一个 JavaScript 基本类型(如:string,number, boolean)时,将发送原值。 |
| 类库特有的 | 可以在函数签名处通过 @Res() 注入类库特定的响应对象(如:Express),就能使用由该响应对象暴露的原生响应处理函数(如:使用 Express 时,使用 response.status(200).send() 构建响应)。 |
注意:如果在一个处理函数上同时使用 @Res() 和 @Next() 方法(选择特定于库的选项),须在装饰器中 @Res({ passthrough: true }) 将 passthrough 设置为 true 才能屏蔽标准方式的自动禁用此路由规则,满足特殊业务需求场景。如:通过注入响应对象,单独设置 cookie / header,但把其余部分留给框架处理的效果。