基本
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;
}
}
这样我们就可以在装饰器上获取到相应的数据并返回了。可以根据我们是否选择获取相应所需的或者获取所有。