nest 中常用的基础装饰器

86 阅读4分钟

常用装饰器

@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() 有两个参数,urlstatusCode,两者都是可选的。如果省略,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';
  }