nest开发:九 自定义装饰器

268 阅读1分钟

基本

ES2016 装饰器是一个表达式,它返回一个可以将目标、名称和属性描述符作为参数的函数。通过在装饰器前面添加一个 @ 字符并将其放置在你要装饰的内容的最顶部来应用它。可以为类、方法或属性定义装饰器。

参数装饰器

Nest 提供了一组非常实用的参数装饰器,可以结合 HTTP 路由处理器(route handlers)一起使用。下面的列表展示了Nest 装饰器和原生 Express(或 Fastify)中相应对象的映射。

@Request(),@Req()req
@Response(),@Res()res
@Next()next
@Session()req.session
@Param(param?: string)req.params / req.params[param]
@Body(param?: string)req.body / req.body[param]
@Query(param?: string)req.query / req.query[param]
@Headers(param?: string)req.headers / req.headers[param]
@Ip()req.ip
@HostParam()req.hosts

自定义装饰器

我们对装饰器做一个请求数据的获取,并对其内部数据获取。

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const YuicDecorator = createParamDecorator(
  (param: string, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    console.log('yuicDe', request);
    return request.yuicInfo[param] ?? request.yuicInfo;
  },
);

在上一节的守卫中我们添加一个yuicInfo对象,做一个VIP和普通用户判断

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class YuicGuard implements CanActivate {
  constructor(private levael: number = 0) {}
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const request = context.switchToHttp().getRequest();
    const mylevel = request.query?.level;
    request.yuicInfo = {
      levelClass: mylevel > 99 ? 'Vip' : 'Normal',
      level: mylevel,
    };
    console.log('守卫了', request.query?.level);
    if (mylevel > this.levael) {
      return true;
    } else {
      return false;
    }
    // return this.levael;
  }
}

这样我们就可以在装饰器上获取到相应的数据并返回了。可以根据我们是否选择获取相应所需的或者获取所有。

image.png