nestjs警卫之GuardsConsumer类

GuardsConsumer类用来创建一个指定控制器对象、路由方法对象、Guard数组的调用方法,用来加入路由方法中

@nestjs/core/guards/guards-consumer.ts

import iterate from 'iterare';
import { GUARDS_METADATA } from '@nestjs/common/constants';
import { isUndefined, isFunction, isNil, isEmpty } from '@nestjs/common/utils/shared.utils';
import { Controller } from '@nestjs/common/interfaces';
import { CanActivate, HttpStatus, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs/Observable';
import { FORBIDDEN_MESSAGE } from './constants';
import 'rxjs/add/operator/toPromise';

/*Guard消费者,用来为路由方法调用Guard数组 */
export class GuardsConsumer {
    /*为指定路由对象、指定方法调用Guard数组,传入data数据 */
    public async tryActivate(guards: CanActivate[], data, instance: Controller, callback: (...args) => any): Promise<boolean> {
        if (!guards || isEmpty(guards)) {
            return true;
        }
        /*创建上下文,包含了路由实例的构造函数、方法对象 */
        const context = this.createContext(instance, callback);
        for (const guard of guards) {
            /*遍历Guard,调用每个Guard的canActivate方法 */
            const result = guard.canActivate(data, context);
            /*拾取结果,如果是Promise,则获取返回值,如果是true继续遍历 */
            if (await this.pickResult(result)) {
                continue;
            }
            /*false返回 */
            return false;
        }
        /*遍历完所有都为true,返回true */
        return true;
    }
    /*创建上下文,上下文为Guard的第二个参数 */
    public createContext(instance: Controller, callback: (...args) => any): ExecutionContext {
        return {
            /*parent为路由实例的类对象 */
            parent: instance.constructor,
            /*handler为路由方法 */
            handler: callback,
        };
    }
    /*拾取结果 */
    public async pickResult(result: boolean | Promise<boolean> | Observable<boolean>): Promise<boolean> {
        /*Observable转换为Promise并await */
        if (result instanceof Observable) {
            return await result.toPromise();
        }
        if (result instanceof Promise) {
            return await result;
        }
        return result;
    }
}
1.canActivate方法第二个参数为上下文,parent为控制器类、handler为路由方法

2.canActivate可以返回Observable、Promise、boolean等

3.tryActivate方法在路由方法上下文中使用


发布了164 篇原创文章 · 获赞 15 · 访问量 11万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览