Episode ini membahas middleware di Fiber v3: menulis middleware sendiri dengan app.Use, memahami eksekusi berurutan dan c.Next(), middleware bawaan seperti Logger dan Recover, serta lifecycle hooks OnListen, OnShutdown, OnPreShutdown, dan OnPostShutdown.

Middleware adalah lapisan yang menyambut setiap request sebelum sampai ke handler. Episode 6 membedah cara kerja middleware di Fiber v3: menulisnya sendiri dengan app.Use, memanfaatkan middleware bawaan, dan menjalankan kode pada titik tertentu dalam lifecycle aplikasi lewat hooks.
Konsep kuncinya sederhana: satu request melewati sebuah pipeline. Setiap middleware bisa memproses, memodifikasi, atau menghentikan request, lalu memanggil c.Next() untuk meneruskannya. Memahami pipeline ini akan memudahkan kalian menguasai semua fitur Fiber.
Middleware hanyalah func(c fiber.Ctx) error. Posisi yang didaftarkan pertama dieksekusi pertama. Saat sebuah middleware memanggil c.Next(), eksekusi berpindah ke handler berikutnya dalam pipeline. Kode setelah c.Next() dieksekusi saat request kembali dari handler berikutnya:
app.Use(func(c fiber.Ctx) error {
start := time.Now()
err := c.Next()
elapsed := time.Since(start)
log.Printf("path=%s duration=%s", c.Path(), elapsed)
return err
})Middleware ini menghitung durasi dengan membungkus c.Next(). Jika middleware tidak memanggil c.Next() dan langsung mengembalikan respons, pipeline berhenti di sana — request tidak pernah mencapai handler.
Fiber menyediakan banyak middleware siap pakai. Dua yang paling sering dipakai: Logger untuk mencatat setiap request, dan Recover untuk menangkap panic agar server tidak mati:
import (
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/middleware/logger"
"github.com/gofiber/fiber/v3/middleware/recover"
)
app.Use(logger.New())
app.Use(recover.New())
app.Get("/panic", func(c fiber.Ctx) error {
panic("ups!")
})logger.New() mencetak baris log untuk setiap request lengkap dengan status dan durasi. recover.New() menangkap panic di handler — seperti panic("ups!") — mengembalikan status 500, dan memanggil hook OnRecover untuk mengirim notifikasi error.
Middleware yang baik meniru pola Fiber: menerima fungsi konfigurasi dan mengembalikan fiber.Handler. Ini memungkinkan pengaturan opsional dan nilai default:
type CacheConfig struct {
Duration time.Duration
Key func(c fiber.Ctx) string
}
func Cache(config ...CacheConfig) fiber.Handler {
cfg := CacheConfig{Duration: time.Minute}
if len(config) > 0 {
cfg = config[0]
}
return func(c fiber.Ctx) error {
key := cfg.Key(c)
if cached, ok := getFromCache(key); ok {
return c.SendString(cached)
}
if err := c.Next(); err != nil {
return err
}
setCache(key, c.Response().Body(), cfg.Duration)
return nil
}
}Fungsi Cache menerima config opsional dan mengembalikan handler. Variadic parameter config ...CacheConfig menjaga kompatibilitas — Cache() tanpa argumen tetap bekerja dengan nilai default.
Jika middleware perlu diakses di banyak tempat, simpan nilai di c.Locals() dari middleware, lalu baca di handler:
app.Use(func(c fiber.Ctx) error {
c.Locals("request_id", uuid.NewString())
return c.Next()
})
app.Get("/users/:id", func(c fiber.Ctx) error {
rid := c.Locals("request_id").(string)
return c.JSON(fiber.Map{"request_id": rid})
})c.Locals("request_id", ...) menyimpan nilai di context request, dan c.Locals("request_id") membaca kembali di handler. Pola ini banyak dipakai untuk request ID, user autentikasi, dan data sementara lainnya.
Fiber v3 menawarkan hooks untuk momen-momen penting aplikasi: saat server mulai listen, saat shutdown dimulai, dan setelah shutdown selesai:
app.OnListen(func(addr fiber.ListenOnListenData) error {
log.Printf("server listen di %s", addr.Addr)
return nil
})
app.OnShutdown(func() {
log.Println("shutdown dimulai, menutup koneksi")
})
app.OnPreShutdown(func() {
log.Println("sebelum shutdown, migrasi dibatalkan")
})
app.OnPostShutdown(func() {
log.Println("semua selesai, bersih-bersih")
})OnListen dipanggil saat server mulai menerima koneksi. OnShutdown dan OnPreShutdown dijalankan saat graceful shutdown, dan OnPostShutdown setelah semua listener berhenti. Hooks ini berguna untuk menutup koneksi database dan membatalkan job latar belakang.
bun run devSaat bun run dev berjalan, akses beberapa endpoint lalu lihat output terminal. logger.New() mencetak baris log per request, dan server menampilkan pesan server listen di ... dari hook OnListen. Tekan Ctrl+C untuk memicu shutdown dan perhatikan urutan pesan dari hooks shutdown.
Inti yang harus dibawa pulang:
func(c fiber.Ctx) error yang dieksekusi berurutan dalam pipeline.c.Next() meneruskan request ke handler berikutnya; kode setelahnya berjalan saat request kembali.logger.New() dan recover.New() adalah middleware bawaan yang paling sering dipakai.c.Locals() menjadi jembatan berbagi data antara middleware dan handler.OnListen, OnShutdown, OnPreShutdown, dan OnPostShutdown mengatur lifecycle server.Di episode 7 selanjutnya kita membahas routing lanjutan dan parameter handler — metode HTTP, multiple handler per route, variadic handler, serta jumlah handler yang boleh didaftarkan.