请解释 NestJS 的守卫 (Guards) 的概念和用法。如何创建和使用守卫?

推荐答案

守卫 (Guards) 的概念

NestJS 中的守卫 (Guards) 是一种用于控制请求是否应该被路由处理程序处理的机制。守卫的主要职责是决定一个请求是否应该被允许继续执行。它们通常用于实现权限控制、身份验证等场景。

守卫的用法

守卫可以通过实现 CanActivate 接口来创建。CanActivate 接口要求实现一个 canActivate 方法,该方法返回一个布尔值或一个 Promise<boolean>,表示请求是否应该被允许继续执行。

创建守卫

要创建一个守卫,可以使用 @Injectable() 装饰器来定义一个类,并实现 CanActivate 接口。例如:

-- -------------------- ---- -------
------ - ----------- ------------ ---------------- - ---- -----------------
------ - ---------- - ---- -------

-------------
------ ----- --------- ---------- ----------- -
  ------------
    -------- -----------------
  -- ------- - ---------------- - ------------------- -
    ----- ------- - ------------------------------------
    ------ ------------------------------
  -

  ------- ------------------------ ----- ------- -
    -- -----------
    ------ ----- -- - -----
  -
-

使用守卫

守卫可以通过 @UseGuards() 装饰器应用到控制器或路由处理程序上。例如:

-- -------------------- ---- -------
------ - ----------- ---- --------- - ---- -----------------
------ - --------- - ---- ---------------

-------------------
---------------------
------ ----- -------------- -
  ------
  ---------- ------ -
    ------ ----- ------ ------- --- ------
  -
-

本题详细解读

守卫的作用

守卫在 NestJS 中主要用于控制请求的访问权限。它们可以在请求到达路由处理程序之前进行拦截,并根据自定义的逻辑决定是否允许请求继续执行。常见的应用场景包括身份验证、角色验证等。

守卫的实现

守卫的实现需要遵循 CanActivate 接口,该接口要求实现一个 canActivate 方法。这个方法接收一个 ExecutionContext 对象,该对象提供了当前请求的上下文信息。通过这个上下文,守卫可以访问请求对象、响应对象等,从而进行必要的验证。

守卫的应用

守卫可以通过 @UseGuards() 装饰器应用到控制器或路由处理程序上。当守卫被应用时,NestJS 会在请求到达路由处理程序之前调用守卫的 canActivate 方法。如果该方法返回 true,请求将继续执行;如果返回 false,请求将被拒绝。

守卫的灵活性

守卫可以灵活地应用在不同的层次上。它们可以应用到整个控制器上,也可以应用到单个路由处理程序上。此外,守卫还可以与其他 NestJS 特性(如拦截器、管道等)结合使用,以实现更复杂的业务逻辑。

守卫的扩展性

由于守卫是通过实现 CanActivate 接口来创建的,因此它们可以很容易地进行扩展和定制。开发者可以根据具体的业务需求,实现自定义的验证逻辑,并将其封装在守卫中,以便在多个地方复用。

纠错
反馈