雀巢扩展/组合装饰物? [英] Nestjs extend/combine decorators?

查看:35
本文介绍了雀巢扩展/组合装饰物?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

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

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

在上一个装饰器的基础上创建新装饰器,还是创建新装饰器并将其合并?

推荐答案

可以,您可以使用"decorator composition"执行"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())相同。这意味着也要为自定义的带注释的参数执行管道(在我们的示例中是用户参数)。此外,您还可以将管道直接应用于自定义装饰器:

@Get()
async findOne(@User(new ValidationPipe()) user: UserEntity) {
  console.log(user);
}
在本例中,User是一个自定义参数修饰符。和ValidationPipe传递,但您可以想象传递任何pipe

这篇关于雀巢扩展/组合装饰物?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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