雀巢扩展/组合装饰物? [英] Nestjs extend/combine decorators?
本文介绍了雀巢扩展/组合装饰物?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有简单的自定义装饰器:
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屋!
查看全文