大家好,我是 Yubin
這篇文章講 Fastify 的生命週期,搭配 Fastify Hook 可以在各個階段做不同的動作。
Request/Response 的生命週期如下圖 (圖片擷取自 Fastify 官網)。
一個 request 進來,右分支表示走入下一個階段,左分支表示 Fastify 會拋出相應的狀態碼做回應。
在 Hook 的處理函式中,呼叫 done()
代表當前 hook 已經完成,進入到下一個階段。
例如,onRequest
的 hook handler 中,呼叫 done()
,則會進入 preParsing
hook (如果有定義)。
圖中幾個動作要特別講一下。
解析 Request Payload,把結果放進 request.body
中。
所以在 Parsing 之前的 hook 中,拿到的 request.body
必定為 undefined
。
驗證,驗證 request.body
是否符合格式。
進入開發者定義的 route handler 的處理。
前面的 handler 呼叫 reply.send()
之後,進入 Reply 階段。
把 response 送出去。
大家可以把各個 hook handler 都寫出來,觀察一個 request 進來時候的觸發順序。
import fastify, { FastifyInstance, FastifyListenOptions } from 'fastify'
const server: FastifyInstance = fastify()
const fastifyConfig: FastifyListenOptions = {
port: 8888,
host: '::'
}
server.listen(fastifyConfig, (error, address) => {
if (error) {
console.error(error)
}
})
server.get('/', (request, reply) => {
console.log('Hello this is / endpoint')
return reply.status(200).send({ message: 'Hello World' })
})
server.addHook('onRequest', (request, reply, done) => {
console.log('onRequest hook')
done()
})
server.addHook('preParsing', (request, reply, payload, done) => {
console.log('preParsing hook')
done(null, payload)
})
server.addHook('preValidation', (request, reply, done) => {
console.log('preValidation hook')
done()
})
server.addHook('preHandler', (request, reply, done) => {
console.log('preHandler hook')
done()
})
server.addHook('preSerialization', (request, reply, payload, done) => {
console.log('preSerialization hook')
done(null, payload)
})
server.addHook('onSend', (request, reply, payload, done) => {
console.log('onSend hook')
done(null, payload)
})
server.addHook('onResponse', (request, reply, done) => {
console.log('onResponse hook')
done()
})
實際執行,把伺服器打起來,當有一個 request (GET /) 進來,console 會顯示。
onRequest hook
preParsing hook
preValidation hook
preHandler hook
Hello this is / endpoint
preSerialization hook
onSend hook
onResponse hook
Fastify 的 Lifecycle 是非常重要的概念,了解 Lifecycle 可以很大程度的在想要的階段對 request 或 response 動手腳。
Fastify Hook 的介紹可以參考這篇 Fastify101: Hook。