首页 > 解决方案 > NestJS 将 DTO 传递给扩展控制器并使用 ValidationPipe 进行验证

问题描述

在我的NestJS项目中,我有一个由我的应用程序的所有其他控制器扩展的泛型BaseController。现在我正在尝试验证 POST 方法的 DTO。我尝试过(1)将控制器的 dto 作为类型传递abstractController,(2)也作为options对象中的参数传递,但没有成功。在第一种情况下,验证被跳过,在第二种情况下,我收到了 TypeScript 错误。

将 DTO 传递给扩展控制器并使用 with 的正确方法是什么ValidationPipe?我希望我的所有控制器都能够将其特定的 DTO 传递给abstractController

// base.controller.ts
export function abstractController<T, createDto>(options): any {
  const resource = options.resource;
  const dto = options.dto;

  abstract class BaseController {
    protected readonly baseService: BaseService<T>;
    protected constructor(baseService: BaseService<T>) {
      this.baseService = baseService;
    }
    
    // 1st using createDto passed on abstractController type 
    @Post()
    public async create(
      @Body(ValidationPipe) createDto: createDto, // Validation is skipped
    ): Promise<T> {
      return this.baseService.create(createDto);
    }

    // 2nd using dto passed in options
    @Post()
    public async create(
      @Body(ValidationPipe) createDto: dto, // Error: 'dto' refers to a value, but is being used as a type here. Did you mean 'typeof dto'
    ): Promise<T> {
      return this.baseService.create(createDto);
    }
   
  }

  return BaseController
}


// cat.controller.ts
const BaseController = abstractController<Cat, CreateCatDto>({
  resource: 'cat',
  dto: CreateCatDto
});

@Controller('cat')
export class CatController extends BaseController {
  constructor(private readonly catService: CatService) {
    super(catService);
  }
}

提前致谢

标签: typescriptnestjs

解决方案


推荐阅读