如何在一个 DTO 中编写 @Param 和 @Body

Hak*_*kan 2 dto nestjs

我正在使用 nestjs 并且我努力使用 DTO 并生成这样的 update-todo.dto.ts。

如何在一个 DTO 中同时使用 @Param 和 @Body?

@Param('id') id: string,
@Body('status') status: TodoStatus
Run Code Online (Sandbox Code Playgroud)

那么如何转换我的代码?

import { TodoStatus } from '../todo.model';
export class UpdateTodoDto {
  id: string;
  status: TodoStatus;
}
Run Code Online (Sandbox Code Playgroud)
  @Patch('/:id/status')
  updateTodoStatus(
    @Param('id') id: string,
    @Body('status') status: TodoStatus
    // convert this line
  ): Todo {
    return this.todosService.updateTodoStatus(id, status);
  }
Run Code Online (Sandbox Code Playgroud)

Jay*_*iel 5

您需要四个组件才能协同工作。

  1. 一个自定义装饰器来组合@Param()@Body()装饰器
  2. DTO的保持形状@Param()DTO
  3. DTO的保持形状@Body()DTO
  4. 一个 DTO 来组合 body 和 param DTO

这个存储库通过一个基于查询参数的可选主体的示例。

1

export const BodyAndParam = createParamDecorator((data: unknwon, ctx: ExecutionContext) => {
  const req = ctx.switchToHttp().getRequest();
  return { body: req.body, params: req.params };
});
Run Code Online (Sandbox Code Playgroud)

2

export class ParamsDTO {

  @IsString()
  id: string;
}
Run Code Online (Sandbox Code Playgroud)

3

export class BodyDTO {
  @IsString()
  hello: string;
}
Run Code Online (Sandbox Code Playgroud)

4

export class MixedDTO {
  @Type(() => ParamsDTO)
  params: ParamsDTO;
  
  @Type(() => BodyDTO);
  body: BodyDTO;
}
Run Code Online (Sandbox Code Playgroud)

@Controller()
export class FooController {
  @Post()
  bar(@BodyAndParam() bodyAndParam: MixedDTO) {
    // do stuff here
  }
}
Run Code Online (Sandbox Code Playgroud)