-
ES2016
的装饰器是一个可以将目标对象,名称和属性描述符作为参数的返回函数的表达式。 - 可通过装饰器前缀
@
使用,放在被装饰对象的顶端即可。 - 装饰器可以被定义为一个类或是属性。
将属性值附加到request对象上,以便在路由处理程序中可提取。
自定义装饰器
// user.decorator.ts
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const User = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request.user;
},
);
使用装饰器
@Get()
async findOne(@User() user: UserEntity) {
console.log(user);
}
传递数据
假如在身份验证层已经验证请求并将用户实体附加到请求对象。
如用户实体:
{
"id": 101,
"firstName": "Alan",
"lastName": "Turing",
"email": "alan@email.com",
"roles": ["admin"]
}
定义一个将属性名作为键的装饰器。
// user.decorator.ts
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const User = createParamDecorator(
(data: string, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
const user = request.user;
return data ? user && user[data] : user;
},
);
通过控制器中的@User()
装饰器访问特定属性:
@Get()
async findOne(@User('firstName') firstName: string) {
console.log(`Hello ${firstName}`);
}
使用管道 ---- ?
- 可以直接将管道应用到自定义装饰器上
@Get()
async findOne(@User(new ValidationPipe()) user: UserEntity) {
console.log(user);
}
将多个装饰器组合到一个装饰器中:
// 定义‘组合装饰器’
import { applyDecorators } from '@nestjs/common';
export function Auth(...roles: Role[]) {
return applyDecorators(
SetMetadata('roles', roles),
UseGuards(AuthGuard, RolesGuard),
ApiBearerAuth(),
ApiUnauthorizedResponse({ description: 'Unauthorized"' }),
);
}
// 通过一个声明应用所有四个装饰器的效果
@Get('users')
@Auth('admin')
findAllUsers() {}
网友评论