Nestjs管道、守卫

543 阅读2分钟

一、Nestjs管道

1、关于Nestjs中的管道

Nestjs 中的管道可以将输入数据转换为所需的输出。此外,它也可以处理证,当数据不正确时可能会抛出异常。

2、Nestjs中创建和使用管道

1、创建管道

nest g pipe user

管道创建完成后生成如下代码:

import { ArgumentMetadata, Injectable, PipeTransform} from '@nestjs/common';
@Injectable()
export class UserPipe implements PipeTransform {
    transform(value: any, metadata: ArgumentMetadata) {
        //这个里面可以修改传入的值以及验证转入值的合法性
        return value;
    }
}

2、使用管道

import { Controller,Get,UsePipes,Query} from '@nestjs/common';
import { UserPipe } from '../../user.pipe';
@Controller('user')
export class UserController {
    @Get()
    index(){
        return '用户页面';
    }
    @Get('pipe')
    @UsePipes(new UserPipe())
    pipe(@Query() info){
        console.log(info);
        return `this is Pipe`;
    }
}

二、Nestjs守卫

1、 关于Nestjs中的守卫

守卫是一个使用@Injectable()装饰器的类。 守卫应该实现CanActivate接口。

守卫有一个单独的责任。它们确定请求是否应该由路由处理程序处理。到目前为止,访问限制逻辑大多在中间件内。这样很好,因为诸如token验证或将request对象附加属性与特定路由没有强关联。但中间件是非常笨的。它不知道调用next()函数后会执行哪个处理程序。另一方面,守卫可以访问ExecutionContext对象,所以我们确切知道将要执行什么。

说白了 :在Nextjs中如果我们想做权限判断的话可以在守卫中完成,也可以在中间件中完成。

2、Nestjs中创建守卫、以及控制器中单独配置守卫

1、创建守卫

nest g guard auth

守卫创建完成后生成如下代码:

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
    canActivate(
        context: ExecutionContext,
        ): boolean | Promise<boolean> | Observable<boolean> {
        return true;
    }
}

2、使用守卫

@Get('guard')
@UseGuards(AuthGuard)
guard(@Query() info){
    console.log(info);
    return`thisis guard`;
}

也可以直接加在控制器上面

@Controller('cats')
@UseGuards(RolesGuard)
export class CatsController {}

3、Nestjs中使用守卫、以及全局配置守卫

1、创建守卫

nest g guard auth

守卫创建完成后生成如下代码:

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
    canActivate(
        context: ExecutionContext,
        ): boolean | Promise<boolean> | Observable<boolean> {
        return true;
    }
}

2 、全局使用守卫

//全局守卫
app.useGlobalGuards(new AuthGuard());

3、在Nestj的守卫中获取 Cookie 和 和 Session

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
    canActivate(
        context: ExecutionContext,
        ): boolean | Promise<boolean> | Observable<boolean> {
        console.log(context.switchToHttp().getRequest().cookies);
        console.log(context.switchToHttp().getRequest().session);
        return true;
    }
}