Request
Request:访问客户端的请求细节。
在处理函数的签名中使用 @Req() 装饰器,指示 Nest 将请求对象注入处理程序。
/**
* @description: 接收客户端请求参数的控制器示例
* @update: 2021-09-09 16:39:38
* @author: Ada.H
*/
// cats.controller.ts
import { Controller, Get, Req } from '@nest/common';
// 设置路由路径前缀 cats
@Controller('cats')
export class CatsController {
// 接口方法 get 及接口路径独立部分 query
@Get('query')
findAll(@Req() request: Request): string {
return '查询所有猫咪';
}
}
// 接口路由:http://localhost:3000/cats/query
Request 对象代表 HTTP 请求,并具有查询字符串,请求参数,HTTP 标头(HTTP hearder)和正文(HTTP body)的属性。在多数情况下,使用专用的装饰器即可。
Nest 提供的装饰器及其代表的底层平台特定对象的对照列表,如下:
| 装饰器 | 底层平台特定对象 |
|---|---|
@Req(),@Request() | req |
@Res(),@Response() | res |
@Next() | next |
@Session() | req.session |
@Param(key?: string) | req.params / req.params[key] |
@Boby(key?: string) | req.body / req.body[key] |
@Query(key?: string) | req.query / req.query[key] |
@Headers(name?: string) | req.headers / req.headers[name] |
@Ip() | req.ip |
@HostParam() | req.hosts |
番外
使用类库特有的响应对象(
Response)。
在请求处理函数中注入 @Res() 或 @Response() 时,会将 Nest 置于该处理函数的特定于库模式下,并负责管理响应。此时,必须通过调用 response 对象发出某种响应(如:res.send(...)),否则 HTTP 服务器挂起。
// cats.controller.ts
import { Controller, Get, Post, Res, HttpStatus } from '@nestjs/common';
import { Response } from 'express';
@Controller('cats')
export class CatsController {
@Post()
create(@Res() res: Response) {
res.status(HttpStatus.CREATED).send();
}
@Get()
findAll(@Res() res: Response) {
res.status(HttpStatus.OK).json([]);
}
}
请谨慎使用此种方法:
- 代码变得依赖于平台:不同的底层库在响应对象(
Response)上可能具有不同的API。 - 难以测试:须模拟响应对象等。
- 将失去依赖于
Nest标准响应处理的Nest功能的兼容性(如:拦截器Interceptors,@HttpCode()/@Header()装饰器)。虽然可以通过将passthrough选项设置为true来解决此问题,但相对多了些不必要的工作量。@Get() findAll(@Res({ passthrough: true }) res: Response) { res.status(HttpStatus.OK); return []; }