常用装饰器
@Request(), @Req() | req |
---|---|
@Response(), @Res() ***** | res |
@Next() | next |
@Session() | req.session |
@Param(key?: string) | req.params``req.params[key] |
@Body(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 |
为了与底层 HTTP 平台(例如 Express 和 Fastify)之间的类型兼容,Nest 提供了 @Res()
和 @Response()
装饰器。@Res()
只是 @Response()
的别名。两者都直接暴露底层原生平台 response
对象接口。使用它们时,你还应该导入底层库(例如 @types/express
)的类型以充分利用它们。请注意,当你在方法处理程序中注入 @Res()
或 @Response()
时,你会将 Nest 置于该处理程序的库特定模式,并且你将负责管理响应。这样做时,你必须通过调用 response
对象(例如,res.json(...)
或 res.send(...)
)来触发某种响应,否则 HTTP 服务器将挂起。
请求 methods
Nest 为所有标准的 HTTP 方法提供装饰器:@Get()
、@Post()
、@Put()
、@Delete()
、@Patch()
、@Options()
和 @Head()
。此外,@All()
定义了一个端点来处理所有这些。
@ApiTags('users')
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
@HttpCode(204)
@Header('Cache-Control', 'none')
getHello(): string {
return this.appService.getHello();
}
@Get('docs')
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version: string) {
if (version && version === '5') {
return { url: 'https://docs.nestjs.com/v5/' };
}
}
@Post()
createUser(@Body() user: User): User {
return this.appService.createUser(user);
}
@Put()
updateUser(@Body() user: User): User {
return this.appService.updateUser(user);
}
@Delete(':id')
deleteUser(@Param('id') id: string): string {
return this.appService.deleteUser(id);
}
}
@Get
get 请求,参数是 string,可以使用 @Param
路由参数,@query
查询参数
@Get(':id')
findOne(@Param() params: any, @Query() name: string): string {
console.log(params.id);
return `This action returns a #${params.id} cat`;
}
@Param
路由参数
@Param(key?: string) | req.params / req.params[key] |
---|
@Get('params/:id')
@ApiOperation({ summary: 'Get params' })
getParams(@Param('id') id: string): string {
return id;
}
@Query
查询参数
@Query(key?: string) | req.query / req.query[key] |
---|
@Get('query')
@ApiOperation({ summary: 'Get query', description: 'Get query' })
getQuery(@Query('name') name: string): any {
return name;
}
@Headers
请求头 header
@Headers(name?: string) | req.headers / req.headers[name] |
---|
@Get('headers')
@ApiOperation({ summary: 'Get headers' })
getHeaders(@Headers() headers: Headers, @Headers('accept') accept: string) {
return { headers, accept };
}
@Header
响应头(设置) header
@Get()
@ApiOperation({ summary: 'Get hello' })
@Header('Cache-Control', 'none')
getHello(): string {
return '123';
}
@Post
@Body
@Body(key?: string) | req.body / req.body[key] |
---|
使用 body
参数记得定义 dto
有利于生成 swagger
和类型校验
export class CreateCatDto {
name: string;
age: number;
breed: string;
}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
return 'This action adds a new cat';
}
@Put
和 post 相同
@Delete
和 post 相同
@HttpCode
响应状态码
默认情况下响应状态代码始终为 200,POST 请求除外,该代码为 201。我们可以通过在处理程序级别添加
@Get()
@HttpCode(204)
@ApiOperation({ summary: 'Get hello' })
@Header('Cache-Control', 'none')
getHello(): string {
return this.appService.getHello();
}
@Redirect
重定向
@Redirect()
有两个参数,url
和 statusCode
,两者都是可选的。如果省略,statusCode
的默认值为 302
(Found
)。
可以配置 301 永久重定向,302 临时重定向
@Get('docs')
@ApiOperation({ summary: 'Redirect to docs' })
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version: string) {
if (version && version === '5') {
return { url: 'https://docs.nestjs.com/v5/' };
}
}
@Res
@Response
@Response(), @Res() ***** | res |
---|
Response
他和 http
的类型 Response
名称一样,导入不方便,全使用 @Res
@Delete(':id')
deleteUser(@Param('id') id: string, @Res() res: Response): string {
res.status(200).send('123');
return this.appService.deleteUser(id);
}
@Req
@Request
@Request(), @Req() | req |
---|
Request
他和 http
的类型 Request
名称一样,导入不方便,全使用 @Req
@Get('request')
getRequest(@Req() req: ExpressRequest): string {
console.log('🚀 liu123 ~ req:', req);
return '1';
}
@Res({ passthrough: true })
是一个重要的配置,用于控制响应对象的行为。它的作用是告诉 NestJS 不要自动发送响应,而是允许你手动控制响应流程,同时仍然可以使用 NestJS 的标准返回值机制。
@Get()
findAll(@Res() res: Response) {
res.status(HttpStatus.OK).json([]); // 必须手动发送响应
}
@Get()
findAll(@Res({ passthrough: true }) res: Response) {
res.status(HttpStatus.OK); // 只设置状态码
return []; // 返回值由 NestJS 自动处理
}
注意事项
- 不要混用:如果启用了
passthrough: true
,不要在代码中手动调用res.send()
或res.json()
否则会导致重复发送响应。 - 推荐使用:在大多数情况下,建议使用
passthrough: true
因为它结合了手动控制响应对象和 NestJS 自动处理返回值的优点。 - 避免滥用:如果你不需要操作响应对象,直接使用 NestJS 的标准返回值机制即可,无需注入
@Res
。
@Next
@Next() | next |
---|
需要结合中间件使用
@Controller('auth')
export class AuthController {
@Post('login')
login(@Next() next: NextFunction) {
if (!isAuthenticated) {
return next(); // 交给下一个中间件或处理程序
}
return 'Login successful';
}
}
@Session
@Session() | req.session |
---|
@Get('session')
getSession(@Session() session: Record<string, any>): string {
console.log('🚀 liu123 ~ session:', session);
return '1';
}
@Ip
@Ip() | req.ip |
---|
@Get('ip')
getIp(@Ip() ip: string): string {
console.log('🚀 liu123 ~ ip:', ip);
return '1';
}
@HostParam
@HostParam() | req.hosts |
---|
@Get('HostParam')
getHostParam(@HostParam() host: string): string {
console.log('🚀 liu123 ~ host:', host);
return '1';
}