Nestjs如何扩展/组合装饰器?

7

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

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

现在,我需要验证user对象中是否存在email
问题是我无法更新当前的装饰器。
我能够扩展我的当前装饰器吗?
创建一个基于先前装饰器的新装饰器还是创建一个新装饰器并将其组合?
1个回答

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"' }),
  );
}

在这个例子中,Auth是一个装饰器,可以用来结合所有传递给applyDecorators的装饰器。

因此,我建议使用管道扩展您的装饰器。

正如文档所述:

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

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

在这个例子中,User 是一个自定义的参数装饰器。并且传递了 ValidationPipe,但你可以想象传递任何 管道

谢谢回答。不幸的是,我现在无法扩展当前的装饰器(它在另一个项目中,我们将其作为npm包使用)。我使用了applyDecorators,它非常好用。 - Dmytro Mysak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接