我有一个简单的自定义装饰器:
export const User: () => ParameterDecorator = createParamDecorator(
(data: any, req): UserIdentity => {
const user = getUser(req);
return user;
},
);
现在,我需要验证email
对象中是否有user
。
问题是我无法更新当前的装饰器。
我可以扩展当前的装饰器吗?
根据前一个装饰器创建一个新的装饰器,还是创建一个新的装饰器并将其组合?
答案 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。