Fastify 的 Hook,就是物流中枢里的各类检查关卡。
官方生命周期可以翻译成这张流程图:
Incoming Request
│
▼
Routing
│
▼
onRequest
│
▼
preParsing
│
▼
Parsing
│
▼
preValidation
│
▼
Validation
│
▼
preHandler
│
▼
Handler
│
▼
preSerialization
│
▼
onSend
│
▼
Outgoing Response
│
▼
onResponse把它换成物流语言就更好记:
车辆进站
│
▼
onRequest -> 门岗初检
preParsing -> 拆原始包装、预处理载荷
preValidation -> 验证前补齐上下文
preHandler -> 正式进入工位前做安检/鉴权
handler -> 核心处理工位
preSerialization -> 出站前重包一层
onSend -> 最终发车前改发货单
onResponse -> 发车后记账、统计、审计一个典型例子:
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、改最终 payloadonResponse:打点、审计、异步统计
#一个常见坑
不要把 callback 风格和 async/await 混着用。
一个钩子要么走 done(),要么走 async,别两套都开。