美文网首页
Nest.js - 自定义路由参数装饰器

Nest.js - 自定义路由参数装饰器

作者: stevekeol | 来源:发表于2020-07-13 21:09 被阅读0次
    • 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() {}
    

    相关文章

      网友评论

          本文标题:Nest.js - 自定义路由参数装饰器

          本文链接:https://www.haomeiwen.com/subject/ockzcktx.html