Fastify 中如何使用 preHandler 钩子?

推荐答案

在 Fastify 中,preHandler 钩子用于在请求处理之前执行一些逻辑。你可以在路由级别或插件级别使用它。以下是一个简单的示例:

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

在这个示例中,preHandler 钩子会在请求处理之前执行,并且可以用于验证请求、修改请求对象或执行其他预处理操作。

本题详细解读

1. preHandler 钩子的作用

preHandler 钩子允许你在请求到达路由处理函数之前执行一些逻辑。这个钩子非常适合用于以下场景:

  • 请求验证:检查请求头、查询参数或请求体是否符合预期。
  • 权限验证:验证用户是否有权限访问特定资源。
  • 日志记录:记录请求的详细信息,以便后续分析。
  • 修改请求对象:在请求到达处理函数之前,修改请求对象的内容。

2. 使用 preHandler 钩子的方式

preHandler 钩子可以在以下两个级别使用:

2.1 路由级别

在路由级别使用 preHandler 钩子时,你可以为特定的路由定义预处理逻辑。例如:

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

2.2 插件级别

在插件级别使用 preHandler 钩子时,你可以为整个插件或应用程序定义全局的预处理逻辑。例如:

3. preHandler 钩子的执行顺序

preHandler 钩子按照以下顺序执行:

  1. 插件级别的 preHandler 钩子:如果定义了全局的 preHandler 钩子,它会首先执行。
  2. 路由级别的 preHandler 钩子:如果路由定义了 preHandler 钩子,它会在全局钩子之后执行。

4. 异步处理

preHandler 钩子支持异步操作。你可以使用 async/await 来处理异步逻辑。例如:

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

5. 错误处理

如果在 preHandler 钩子中抛出错误,Fastify 会跳过后续的钩子和路由处理函数,并直接返回错误响应。例如:

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

在这个示例中,请求将不会到达 handler 函数,而是直接返回一个错误响应。

纠错
反馈