推荐答案
@UseGuards 装饰器用于在 Nest.js 中应用守卫(Guards)。守卫的主要作用是决定是否允许请求继续执行。它们通常用于实现身份验证和授权逻辑。通过在控制器或路由处理程序上使用 @UseGuards,你可以将守卫应用到特定的路由或整个控制器。
本题详细解读
1. 守卫的作用
守卫是 Nest.js 中的一种特殊组件,用于在请求到达路由处理程序之前执行一些逻辑。守卫的主要职责是决定是否允许请求继续执行。常见的用例包括:
- 身份验证:验证用户是否已登录。
- 授权:检查用户是否有权限访问特定资源。
2. @UseGuards 的使用方式
@UseGuards 装饰器可以应用在控制器类或单个路由处理程序上。它可以接受一个或多个守卫类或实例。
在控制器上使用
@Controller('cats')
@UseGuards(AuthGuard)
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}在这个例子中,AuthGuard 会应用到 CatsController 中的所有路由。
在路由处理程序上使用
@Controller('cats')
export class CatsController {
@Get()
@UseGuards(AuthGuard)
findAll(): string {
return 'This action returns all cats';
}
}在这个例子中,AuthGuard 只会应用到 findAll 方法上。
3. 自定义守卫
你可以通过实现 CanActivate 接口来创建自定义守卫。例如:
// www.javascriptcn.com code example
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
// 在这里实现你的身份验证逻辑
return request.isAuthenticated();
}
}4. 多个守卫
你可以将多个守卫传递给 @UseGuards,它们会按顺序执行:
@Controller('cats')
@UseGuards(AuthGuard, RolesGuard)
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}在这个例子中,AuthGuard 和 RolesGuard 会依次执行,只有所有守卫都通过时,请求才会继续执行。
5. 全局守卫
你还可以通过 app.useGlobalGuards 方法将守卫应用到整个应用程序:
const app = await NestFactory.create(AppModule); app.useGlobalGuards(new AuthGuard());
这种方式会将守卫应用到所有的路由处理程序。