Nestjs扩展/合并装饰器?

时间:2020-03-15 11:24:18

标签: node.js typescript decorator nestjs

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

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

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

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

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

根据前一个装饰器创建一个新的装饰器,还是创建一个新的装饰器并将其组合?

1 个答案:

答案 0 :(得分:2)

是的,您可以对Nest进行"decorator composition"的操作,但这对于您的情况可能不是一个完美的解决方案,这取决于user不具有email属性时您打算做什么。

根据文档中的示例:

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

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

在此示例中,Auth是一个修饰符,可用于合并applyDecorators中传递的所有修饰符。


因此,我建议使用a pipe 扩展装饰器。

如文档所述:

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

@Get()
async findOne(@User(new ValidationPipe()) user: UserEntity) {
  console.log(user);
}

在此示例中,User是自定义参数修饰符。并且ValidationPipe通过了,但是您可以想象通过任何pipe