Nest.js 中如何在全局范围应用守卫?

推荐答案

在 Nest.js 中,可以通过以下方式在全局范围应用守卫:

  1. 使用 useGlobalGuards 方法:在 main.ts 文件中,通过 app.useGlobalGuards() 方法将守卫应用到全局。

    -- -------------------- ---- -------
    ------ - ----------- - ---- ---------------
    ------ - --------- - ---- ---------------
    ------ - --------- - ---- ---------------
    
    ----- -------- ----------- -
      ----- --- - ----- ------------------------------
      ----------------------- -------------
      ----- -----------------
    -
    ------------
  2. 使用依赖注入:在 AppModule 中通过 providers 数组注册守卫,并使用 APP_GUARD 令牌将其应用到全局。

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

本题详细解读

1. 使用 useGlobalGuards 方法

useGlobalGuards 是 Nest.js 提供的一个方法,允许你在应用程序的全局范围内应用守卫。这种方式简单直接,适合在应用程序启动时一次性应用守卫。

  • 优点:简单易用,适合快速应用全局守卫。
  • 缺点:无法利用 Nest.js 的依赖注入系统,守卫的依赖项需要手动管理。

2. 使用依赖注入

通过 APP_GUARD 令牌和 providers 数组,可以将守卫注册为全局守卫。这种方式利用了 Nest.js 的依赖注入系统,使得守卫的依赖项可以自动注入。

  • 优点:可以利用 Nest.js 的依赖注入系统,守卫的依赖项可以自动管理。
  • 缺点:需要在 AppModule 中进行配置,相对复杂一些。

3. 选择哪种方式?

  • 如果你需要快速应用全局守卫,并且守卫的依赖项较少,推荐使用 useGlobalGuards 方法。
  • 如果你希望利用 Nest.js 的依赖注入系统,并且守卫有较多的依赖项,推荐使用依赖注入的方式。

4. 注意事项

  • 全局守卫会应用到所有的路由,因此在实现守卫逻辑时,需要确保不会对不需要保护的路径造成影响。
  • 如果同时使用了 useGlobalGuardsAPP_GUARDuseGlobalGuards 的守卫会优先执行。
纠错
反馈