typescript 创建继承@Body()或@Param()装饰器的自定义NestJs装饰器?

j1dl9f46  于 2023-06-24  发布在  TypeScript
关注(0)|答案(2)|浏览(169)

我使用NestJs,在我的许多控制器中,我使用:

@Post(":id")
public create(
    @Param('id', new ParseIntPipe()) id: number, 
    @Body(new ValidationPipe({transform: true})) myData: MyClass) {
        // ... 
    }

我想通过创建一个自定义装饰器来清理我的代码,例如:

@Bind() => @Body(new ValidationPipe({transform: true}))

@Id() => @Param('id', new ParseIntPipe())

那么代码会比以前更简洁:

@Post(":id")
public create(@Id() id: number, @Bind() myData: MyClass) {
    // ... 
}

像这样继承那些装饰器的正确方法是什么?
谢谢

wfveoks0

wfveoks01#

由于装饰器只是普通的函数,你可以简单地创建一个返回被调用的装饰器的函数:

  • decorators.ts*
import { Body, Param, ParseIntPipe, ValidationPipe } from '@nestjs/common';

export const Bind = () => Body(
  new ValidationPipe({transform: true}),
);

export const Id = () => Param('id', new ParseIntPipe());

然后将它们用作装饰器:

import { Id, Bind } from './decorators';

// ... 

@Post(":id")
public create(@Id() id: number, @Bind() myData: MyClass) {
    // ... 
}
n3ipq98p

n3ipq98p2#

请将此代码用于带有验证请求的自定义nestjs主体装饰器

export const RBody = createParamDecorator(
  async (value: any, ctx: ExecutionContext) => {
    // extract headers
    const reqBody = ctx.switchToHttp().getRequest().body;
    // Convert headers to DTO object
    const dto = plainToInstance(value, reqBody);
    return await validateOrReject(dto).then(
      (res) => {
        console.log(`Header validated successfully..${res}`);
        return dto;
      },
      (err) => {
        if (err.length > 0) {
          //Get the errors and push to custom array
          const validationErrors = err.map((obj, key) =>
            Object.values(obj.constraints)
          );
          throwException(validationErrors);
        }
      },
    );
    return dto;
  },
);

相关问题