NestJS入门guard、interceptor、customDecorator、循环引用、注入作用域、生命钩子等
1.guard-守卫(每个中间件之后执行,但在任何拦截器或管道之前执行。)
1.1简单例子,守卫需要实现CanActivate接口
@Injectable()
export class AuthGuard implements CanActivate {
public canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
const request: Request = context.switchToHttp().getRequest();
return true;
}
}
1.2守卫的使用,使用UseGuards装饰器,可以是控制器作用域,方法作用域或全局作用域。
控制器作用域
import {
Controller, UseGuards } from '@nestjs/common';
import {
AuthGuard } from './guard/auth.guard';
@Controller('/app')
@UseGuards(new AuthGuard())
export class AppController {
}
类的方法作用域
import {
Controller, UseGuards, Get } from '@nestjs/common';
import {
AuthGuard } from './guard/auth.guard';
@Controller('/app')
export class AppController {
@UseGuards(new AuthGuard())
@Get()
public getHello(): string {
return 'hello';
}
}
全局作用域
import {
NestFactory } from '@nestjs/core';
import {
AuthGuard } from './guard/auth.guard';
function async bootstrap(){
const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new AuthGuard());
await app.listen(3000);
}
bootstrap();
模块作用域
import {
Module } from '@nestjs/common';
import {
APP_GUARD } from '@nestjs/core';
import {
AuthGuard } from './guard/auth.guard';
@Module({
providers:[
{
provide: APP_GUARD,
useClass: AuthGuard,
},
]
})
export class ChildModule{
}
1.3(假设)权限管理,使用守卫
import {
Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import {
Reflector } from