全书目录

第十三篇:Fastify 完全指南 —— 高速物流中枢宇宙

第八章:生命周期钩子 —— 包裹在中枢里会经过哪些关卡

1 分钟 300 字 第 263 / 962 个阅读单元

Fastify 的 Hook,就是物流中枢里的各类检查关卡。

官方生命周期可以翻译成这张流程图:

text
Incoming Request
  │
  ▼
Routing
  │
  ▼
onRequest
  │
  ▼
preParsing
  │
  ▼
Parsing
  │
  ▼
preValidation
  │
  ▼
Validation
  │
  ▼
preHandler
  │
  ▼
Handler
  │
  ▼
preSerialization
  │
  ▼
onSend
  │
  ▼
Outgoing Response
  │
  ▼
onResponse

把它换成物流语言就更好记:

text
车辆进站
  │
  ▼
onRequest        -> 门岗初检
preParsing       -> 拆原始包装、预处理载荷
preValidation    -> 验证前补齐上下文
preHandler       -> 正式进入工位前做安检/鉴权
handler          -> 核心处理工位
preSerialization -> 出站前重包一层
onSend           -> 最终发车前改发货单
onResponse       -> 发车后记账、统计、审计

一个典型例子:

js
fastify.addHook('onRequest', async function (request) {
  request.startAt = Date.now()
})

fastify.addHook('preHandler', async function (request, reply) {
  const token = request.headers['x-hub-token']
  if (token !== 'hub-secret') {
    reply.code(401)
    throw new Error('非法车辆,禁止入站')
  }
})

fastify.addHook('onResponse', async function (request, reply) {
  const cost = Date.now() - request.startAt
  request.log.info({ cost, statusCode: reply.statusCode }, 'shipment completed')
})
#Hook 的实战分工建议
  • onRequest:极早期拦截、请求标记
  • preValidation:补字段、注入校验前上下文
  • preHandler:认证、鉴权、限流判断
  • preSerialization:包装统一响应壳
  • onSend:改 header、改最终 payload
  • onResponse:打点、审计、异步统计
#一个常见坑

不要把 callback 风格和 async/await 混着用。
一个钩子要么走 done(),要么走 async,别两套都开。