iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
Modern Web

Fastify 101系列 第 10

[Fastify] Day10 - Lifecycle

  • 分享至 

  • xImage
  •  

大家好,我是 Yubin

這篇文章講 Fastify 的生命週期,搭配 Fastify Hook 可以在各個階段做不同的動作。

Lifecycle

Request/Response 的生命週期如下圖 (圖片擷取自 Fastify 官網)。

一個 request 進來,右分支表示走入下一個階段,左分支表示 Fastify 會拋出相應的狀態碼做回應。

在 Hook 的處理函式中,呼叫 done() 代表當前 hook 已經完成,進入到下一個階段。

例如,onRequest 的 hook handler 中,呼叫 done(),則會進入 preParsing hook (如果有定義)。

https://ithelp.ithome.com.tw/upload/images/20220925/201511487EvVgZ0xX4.jpg

圖中幾個動作要特別講一下。

Parsing

解析 Request Payload,把結果放進 request.body 中。
所以在 Parsing 之前的 hook 中,拿到的 request.body 必定為 undefined

Validation

驗證,驗證 request.body 是否符合格式。

User Handler

進入開發者定義的 route handler 的處理。

Reply

前面的 handler 呼叫 reply.send() 之後,進入 Reply 階段。

Outgoing Response

把 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


上一篇
[Fastify] Day09 - Hook
下一篇
[Fastify] Day11 - FastifyRequest
系列文
Fastify 10130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言