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

  • 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": "[email protected]",
  "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 - 自定义路由参数装饰器)