推荐答案
Nest.js 的守卫(Guard)是一种用于在请求处理之前进行条件判断的机制。守卫的主要作用是决定是否允许某个请求继续执行。它通常用于实现权限验证、角色检查等场景。守卫可以应用于控制器级别、路由级别或全局级别。
守卫通过实现 CanActivate 接口来定义,该接口包含一个 canActivate 方法。该方法接收 ExecutionContext 对象作为参数,返回一个布尔值或一个 Promise<boolean>。如果返回 true,请求将继续执行;如果返回 false,请求将被拒绝。
本题详细解读
守卫的作用
守卫的主要作用是在请求到达控制器之前进行条件判断。它可以用于多种场景,例如:
- 验证用户是否已登录
- 检查用户是否具有访问某个资源的权限
- 根据请求的某些属性(如 IP 地址)决定是否允许请求继续
守卫的实现
要实现一个守卫,首先需要创建一个类并实现 CanActivate 接口。CanActivate 接口要求实现 canActivate 方法,该方法接收 ExecutionContext 对象作为参数,并返回一个布尔值或一个 Promise<boolean>。
// www.javascriptcn.com code example
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean | Promise<boolean> {
const request = context.switchToHttp().getRequest();
// 在这里进行权限验证
return this.validateRequest(request);
}
private validateRequest(request: any): boolean {
// 实现具体的验证逻辑
return true; // 或 false
}
}守卫的应用
守卫可以通过装饰器 @UseGuards 应用到控制器或路由上。例如:
// www.javascriptcn.com code example
import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';
@Controller('cats')
@UseGuards(AuthGuard)
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}全局守卫
守卫还可以通过 app.useGlobalGuards 方法应用到整个应用程序中:
// www.javascriptcn.com code example
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { AuthGuard } from './auth.guard';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new AuthGuard());
await app.listen(3000);
}
bootstrap();总结
守卫是 Nest.js 中用于在请求处理之前进行条件判断的机制。通过实现 CanActivate 接口,开发者可以自定义守卫的逻辑,并将其应用到控制器、路由或全局范围。守卫在权限验证、角色检查等场景中非常有用。