在前幾篇我們學了怎麼建環境、寫路由、處理參數。今天要聊的主角是 Middleware(中介層)。
聽起來有點抽象?別擔心,想像我們又回到速食店點餐的場景。
想像一下你去速食店:
這些「檢查」或「加值動作」就是 Middleware。
它可以在請求進來之前幫忙,也能在回應送出之後再加工。
如果沒有 Middleware,你就得在每個 Handler 裡都自己加上「檢查訂單、加套餐、印發票」的程式碼,最後整個專案變得超亂。
Middleware 的目標就是:把共用的規則抽出來,讓主程式碼乾淨俐落。
Echo 幫我們準備了一堆常見 Middleware,舉幾個例子:
e := echo.New()
e.Use(middleware.Logger())
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
請求一進來,終端機就會印出一行 log:
2023-10-27 10:30:00 GET / 200 13 0.000012s
e := echo.New()
e.Use(middleware.Recover())
e.GET("/", func(c echo.Context) error {
panic("Oops!") // 故意出錯
return nil
})
有了 Recover → 伺服器安然無恙,只回給你一個「500 內部錯誤」。
e := echo.New()
e.Use(middleware.RequestID())
每個請求都會有自己的 ID,就像每張發票都有號碼。
e := echo.New()
e.Use(middleware.CORS())
這就像餐廳開放「外送平台」接單。
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.Use(middleware.RequestID())
這就像一條流水線:
假設你想讓 API 只在上班時間能用(09:00–18:00)。
func CustomTimeCheckMiddleware(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
hour := time.Now().Hour()
if hour < 9 || hour >= 18 {
return c.JSON(http.StatusServiceUnavailable, map[string]string{
"message": "抱歉,目前不在服務時間內,請明天再來!",
})
}
return next(c)
}
}
Middleware 就像速食店的「隱形規矩」:
透過 Middleware,你的程式會變得乾淨、可維護,而且更有彈性。