Nestjs 扩展/组合装饰器?

Dmy*_*sak 7 decorator node.js typescript nestjs

我有简单的自定义装饰器:

export const User: () => ParameterDecorator = createParamDecorator(
  (data: any, req): UserIdentity => {
    const user = getUser(req);
    return user;
  },
); 
Run Code Online (Sandbox Code Playgroud)

现在,我需要验证我们是否有email对象user

问题是我无法更新当前的装饰器。

我可以扩展我当前的装饰器吗?

基于前一个装饰器创建一个新的装饰器还是创建一个新的装饰器并将其组合?

Vin*_*OPS 14

是的,您可以使用 Nest 进行“装饰器组合”user ,但这可能不是适合您的情况的完美解决方案,具体取决于您在没有属性时打算做什么email

根据文档中的示例:

import { applyDecorators } from '@nestjs/common';

export function Auth(...roles: Role[]) {
  return applyDecorators(
    SetMetadata('roles', roles),
    UseGuards(AuthGuard, RolesGuard),
    ApiBearerAuth(),
    ApiUnauthorizedResponse({ description: 'Unauthorized"' }),
  );
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,Auth是一个装饰器,可用于组合传入的所有装饰器applyDecorators


因此,我建议使用pipeline来扩展你的装饰器。

正如文档所述:

Nest 以与内置参数装饰器相同的方式处理自定义参数装饰器(@Body()、@Param() 和 @Query())。这意味着管道也会针对自定义注释参数(在我们的示例中为用户参数)执行。此外,您可以将管道直接应用于自定义装饰器:

@Get()
async findOne(@User(new ValidationPipe()) user: UserEntity) {
  console.log(user);
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,User是一个自定义参数装饰器。并且ValidationPipe通过了,但是你可以想象通过任何管道