推荐答案
@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
接口来创建自定义守卫。例如:
-- -------------------- ---- ------- ------ - ----------- ------------ ---------------- - ---- ----------------- ------ - ---------- - ---- ------- ------------- ------ ----- --------- ---------- ----------- - ------------ -------- ----------------- -- ------- - ---------------- - ------------------- - ----- ------- - ------------------------------------ -- ------------- ------ -------------------------- - -
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());
这种方式会将守卫应用到所有的路由处理程序。