2

我正在尝试验证请求的标头是否包含一些特定数据,并且我正在使用 NestJS。我找到了这个信息。虽然这是我想要做的,而且看起来很合适,但 ClassType 引用不存在,我不确定要改用什么。

从示例中,装饰器指的是。

请求标头.decorator.ts

import { createParamDecorator, ExecutionContext } from '@nestjs/commom'
import { plainToClass } from 'class-transformer';
// The import below fails
import { ClassType } from 'class-transformer/ClassTransformer';
import { validateOrReject } from 'class-validator';

export const RequestHeader = createParamDecorator(
  async (value:  ClassType<unknown>, ctx: ExecutionContext) => {

    // extract headers
    const headers = ctx.switchToHttp().getRequest().headers;

    // Convert headers to DTO object
    const dto = plainToClass(value, headers, { excludeExtraneousValues: true });
    
    // Validate 
    await validateOrReject(dto);

    // return header dto object 
    return dto;
  },
);
4

1 回答 1

2

我建议不要通过这样的装饰器传递类型,而是建议制作一个自定义装饰器并设置to的validateCustomDecorators选项。装饰器看起来像ValidationPipetrue

const Header = createParamDecorator((data: unknown, context: ExecutionContext) => {
  const req = context.switchToHttp().getRequest();
  if (data) {
    return req.headers[data];
  }
  return req.headers;
});

现在而不是@Header()@nestjs/common你那里你可以@Header()从这个文件中获取并ValidationPipe在应用适当的类型元数据后运行

于 2021-03-31T18:30:41.587 回答