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 []; } 复制代码