【问题标题】:How to unify nestjs decorators如何统一nestjs装饰器
【发布时间】:2021-10-25 11:00:11
【问题描述】:

我有两个装饰器:

export const PlainBodyDecode = createParamDecorator(
  async (_, context: ExecutionContext) => {
    const req = context.switchToHttp().getRequest();
    if (!req.readable) {
      throw new BadRequestException('Invalid body');
    }

    const body = (await rawBody(req)).toString('utf8').trim();
    return decode(body);
  },
);

export const PlainBody = createParamDecorator(
  async (_, context: ExecutionContext) => {
    const req = context.switchToHttp().getRequest();
    if (!req.readable) {
      throw new BadRequestException('Invalid body');
    }

    return (await rawBody(req)).toString('utf8').trim();
  },

);

如您所见,它们非常相似。

我真的很想能够做这样的事情:

export const PlainBodyDecode = createParamDecorator(
 decode(PlainBody());
);

如果你明白我的意思。

我是如何使用装饰器的:

  @Post('decode')
  decode(@PlainBodyDecode() data: any): string {
    //...
  }

你有什么想法吗?

更新:

我想我需要做一些类似的事情:

  export const PlainBodyDecode = (decodeBody = true): ParameterDecorator => {
  return createParamDecorator(async (_, context: ExecutionContext) => {
    //...
    if (decodeBody) {
      return decode(body);
    } else {
      return body;
    }
  });
};

不过好像不行

【问题讨论】:

  • 您为什么要这样做?如果两者相似,那么拥有它们有什么意义呢?您能否详细说明您的用例以及您打算如何通过控制器使用这些装饰器?
  • @Sohan 是的,这就是为什么我正在寻找统一它们的最佳方法的原因。刚刚添加了控制器代码。
  • @Sohan 我认为参数会有所帮助,但我不确定正确的语法
  • 我举了一个例子,看看有没有帮助

标签: nestjs


【解决方案1】:

这里是使用自定义参数装饰器的示例:

您可以在装饰器中添加自己的自定义逻辑

    export const RequestHeader = createParamDecorator(
    async (value: any, ctx: ExecutionContext) => {
        // extract headers
        const headers = ctx.switchToHttp().getRequest().headers;
        // Convert headers to DTO object
        const dto = plainToClass(value, headers, {excludeExtraneousValues: true});
        const errors: ValidationError[] = await validate(dto);

        if (errors.length > 0) {
            //Get the errors and push to custom array
            let validationErrors = errors.map(obj => Object.values(obj.constraints));
            throw new HttpException(`Request Header Validation failed with following Errors: ${validationErrors}`, HttpStatus.BAD_REQUEST);
        }
        // return header dto object
        return dto;
    }
);

//Using in controller:
 @Post('my-details')
    async myData(
      @Req() req,
      @Res() res,
      @Body() body: myBody,
      @RequestHeader(MyHeaderDto) myHeader: MyHeaderDto,
  ):Promise<MyCustomDataDto> {

注意:我在这里使用了 Typescript。

【讨论】:

  • 我想知道为什么带有显式 ParameterDecorator 的代码不起作用?否则使用 createParamDecorator 参数没有正确的类型。
  • 正如我提到的,我在这里使用了 TS,所以你不需要键入对象,有时自动键入对你有用。你试过了吗?
猜你喜欢
  • 2021-11-14
  • 1970-01-01
  • 2018-07-27
  • 2020-06-26
  • 2020-10-21
  • 1970-01-01
  • 2020-10-26
  • 2021-05-19
  • 2021-12-27
相关资源
最近更新 更多