如何统一nestjs装饰师 [英] How to unify nestjs decorators

查看:16
本文介绍了如何统一nestjs装饰师的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个装饰器:

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;
    }
  });
};

但似乎不起作用

推荐答案

以下是使用自定义参数解析器的示例:

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

    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> {

注意:我在这里使用的是打字脚本。

这篇关于如何统一nestjs装饰师的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆