一、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;
}
}