Middleware ใน Go Fiber

Prarisa Surawang
I GEAR GEEK
Published in
4 min readApr 23, 2024

สวัสดีค่ะ วันนี้เราจะมาคุยกันในส่วนของการใช้งาน Middleware ใน Go Fiber ซึ่งการใช้ Middleware ใน Go Fiber เป็นเรื่องที่น่าสนใจอย่างมากค่ะ เพราะมันเป็นเครื่องมือที่มีประโยชน์ในการจัดการกับการเรียก API ของอย่างมีประสิทธิภาพ ในบทความนี้เราจะมาเรียนรู้เกี่ยวกับ Middleware ใน Go Fiber โดยมุ่งเน้นที่การสร้างและการใช้งาน

เริ่มต้นเรามารู้จักกับ Middleware ก่อนนะคะ

Middleware คืออะไร ?

Middleware คือ แนวคิดของการเพิ่ม function ที่ทำหน้าที่ปรับแต่งหรือจัดการกับข้อมูลก่อนที่จะถูกส่งไปยังส่วนอื่นของโปรแกรมหรือระบบ ซึ่งมักนำมาใช้ในการปรับปรุงความสามารถหรือการทำงานของโปรแกรมโดยไม่ต้องแก้ไขโค้ดหลักของโปรแกรมโดยตรง ในบางครั้ง Middleware ยังช่วยในการจัดการกับการสื่อสารระหว่างส่วนต่าง ๆ ของระบบเพื่อให้การทำงานเป็นไปอย่างเรียบร้อยและมีประสิทธิภาพมากขึ้นด้วยการส่งข้อมูลหรือตรวจสอบข้อมูลก่อนการประมวลผลถัดไปในระบบ ดังนั้น Middleware เป็นเครื่องมือสำคัญที่ช่วยให้การพัฒนาซอฟต์แวร์เป็นไปอย่างสะดวกและมีประสิทธิภาพมากยิ่งขึ้นได้

หลักการทำงานของ Middleware ใน Go Fiber

Middleware ใน Go Fiber เป็นชั้นสำคัญที่อยู่ระหว่างการรับ request และการประมวลผลใน handler หลักของแอปพลิเคชัน มันทำหน้าที่ตรวจสอบและปรับเปลี่ยน request หรือ response ก่อนที่จะถึง handler หลัก ซึ่งหลักการทำงานของ Middleware ใน Go Fiber สามารถสรุปได้ดังนี้ค่ะ

  1. การเรียก Middleware: Middleware ถูกเรียกตามลำดับที่กำหนด โดยเริ่มต้นจาก Middleware ที่ถูกเพิ่มก่อนทั้งหมด และสิ้นสุดที่ Middleware ที่ถูกเพิ่มล่าสุด
  2. การปรับแต่ง Request และ Response: Middleware สามารถปรับแต่ง request และ response ได้โดยตรง เช่น เพิ่ม header, ตรวจสอบการยืนยันตัวตน, หรือจัดการกับ errors
  3. การเรียก Handler หลัก: เมื่อการปรับแต่งดำเนินการเสร็จสิ้น Middleware สามารถเรียก handler หลักของแอปพลิเคชันเพื่อดำเนินการต่อไป

การใช้งาน Middleware ใน Go Fiber

ขั้นตอนการใช้งาน Middleware ใน Go Fiber มีขั้นตอนอย่างง่ายดังต่อไปนี้ค่ะ

1.ติดตั้ง Go Fiber: ก่อนที่จะเริ่มใช้งาน Middleware ใน Go Fiber เราจำเป็นต้องติดตั้ง Go Fiber ก่อน โดยใช้คำสั่งต่อไปนี้ใน terminal

go get github.com/gofiber/fiber/v2

2.นำเข้า Package ที่จำเป็น: ในไฟล์ของแอพพลิเคชันของเรา ให้นำเข้า Package ของ Go Fiber และ Middleware ที่เราต้องการใช้งาน เช่น ตัวอย่างการใช้ Middleware กับการสร้าง logger

import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/logger"
)

3.สร้าง Instance ของ Fiber: ในฟังก์ชัน main() หรือฟังก์ชันหลักของแอพพลิเคชัน สร้าง Instance ของ Fiber ด้วยคำสั่ง

app := fiber.New()

4.เพิ่ม Middleware ในแอพพลิเคชัน: เพิ่ม Middleware ใน Go Fiber ที่ต้องการใช้งานในแอพพลิเคชัน โดยใช้ app.Use()ซึ่งรับฟังก์ชันเป็นอาร์กิวเมนต์

  // เพิ่ม Middleware สำหรับการทำงานกับ logger
// logger ใช้เพื่อบันทึกข้อมูล request และ response ของแอปพลิเคชันของเรา
app.Use(logger.New())

5.เพิ่ม Route และ Handler: เพิ่ม Route และ Handler สำหรับแอพพลิเคชันของเรา เช่น

// การสร้าง route สำหรับการใช้งาน
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World!")
})

6.เริ่มต้นเซิร์ฟเวอร์: เรียกใช้เมธอด Listen()เพื่อเริ่มต้นเซิร์ฟเวอร์

app.Listen(":3000")

ตัวอย่างการสร้าง Middleware เองใน Go fiber

  • สร้างฟังก์ชัน Middleware ที่รับพารามิเตอร์เป็น *fiber.Ctx และมีการคืนค่า error
  • ฟังก์ชัน Middleware สามารถทำการประมวลผล request และ response ก่อนที่จะส่งไปยัง handler หรือหลังจากการทำงานของ handler เสร็จสิ้น
package main

import (
"github.com/gofiber/fiber/v2"
"log"
)

// Middleware สำหรับการตรวจสอบ Authorization
func CheckAuth(c *fiber.Ctx) error {
// ตรวจสอบว่ามี header Authorization ใน request หรือไม่
auth := c.Get("Authorization")
if auth != "my_secret_token" {
// ถ้าไม่มีให้คืนค่า error และส่ง status code 401 Unauthorized
return c.Status(fiber.StatusUnauthorized).SendString("Unauthorized")
}
// ถ้าผ่านการตรวจสอบให้เรียก handler ถัดไป
return c.Next()
}

// Middleware สำหรับบันทึกข้อมูล Request และ Response
func PrintLogger(c *fiber.Ctx) error {
// บันทึกข้อมูลเกี่ยวกับ HTTP method และ URL path ของ request ที่เข้ามายังเซิร์ฟเวอร์ ในรูปแบบของ string "Request: [HTTP method] [URL path]" ลงใน log
log.Printf("Request: %s %s", c.Method(), c.Path())

// บันทึก log ข้อมูลเกี่ยวกับ HTTP status code ของ response ที่ถูกส่งกลับไปยัง client ในรูปแบบของ string "Response: [HTTP status code]" ลงใน log
log.Printf("Response: %d", c.Response().StatusCode())

// ให้ Middleware ต่อไปทำงาน
if err := c.Next(); err != nil {
return err
}

return nil
}

// Local Middleware สำหรับการบันทึกข้อมูล Request และ Response เฉพาะสำหรับเส้นทางนี้
func LocalLogger(c *fiber.Ctx) error {
// // บันทึกข้อมูลเกี่ยวกับ HTTP method และ URL path ของ request ที่เข้ามายังเซิร์ฟเวอร์ ในรูปแบบของ string "[Local Middleware] Request: [HTTP method] [URL path]" ลงใน log
log.Printf("[Local Middleware] Request: %s %s", c.Method(), c.Path())

// บันทึก log ข้อมูลเกี่ยวกับ HTTP status code ของ response ที่ถูกส่งกลับไปยัง client ในรูปแบบของ string "[Local Middleware] Response: [HTTP status code]" ลงใน log
log.Printf("[Local Middleware] Response: %d", c.Response().StatusCode())

// ให้ Middleware ต่อไปทำงาน
if err := c.Next(); err != nil {
return err
}

return nil
}

func main() {
// สร้าง instance ของ GoFiber
app := fiber.New()

// เพิ่ม Middleware เข้าไปในการใช้งาน
app.Use(PrintLogger)
app.Use(CheckAuth)

//ตั้งค่า Route ที่ใช้ Middleware
app.Get("/api/users", func(c *fiber.Ctx) error {
// สร้างข้อมูลผู้ใช้
users := []string{"user1", "user2", "user3"}
// ส่งข้อมูลผู้ใช้กลับไปให้ Client
return c.JSON(users)
})

// ตั้งค่า Route ที่ใช้ Local Middleware เฉพาะ LocalLogger Middleware
app.Get("/api/users/local", LocalLogger, func(c *fiber.Ctx) error {
// ส่งข้อความกลับไปยัง client
return c.SendString("This route use local middleware")
})

// เริ่มต้น server ที่ port 3000
app.Listen(":3000")
}

โค้ดด้านบนเป็นตัวอย่างโปรแกรมใช้งาน Go fiber โดยมี Middleware สองฟังก์ชัน คือCheckAuth และ PrintLogger.

  1. CheckAuth: มีหน้าที่ตรวจสอบ Authorization ใน request โดยตรวจสอบว่ามี header “Authorization” ใน request และค่าของ header นั้นตรงกับ “my_secret_token” หรือไม่ ถ้าไม่ตรง จะส่งค่า HTTP status code 401 Unauthorized กลับไปยัง client และหยุดการทำงานของ Middleware นั้นๆ
  2. PrintLogger: ใช้สำหรับบันทึกข้อมูล Request และ Response โดยเมื่อมี request เข้ามา จะทำการบันทึก method และ path ของ request ลงใน log หลังจากนั้นจะเรียกฟังก์ชัน c.Next() เพื่อให้ Middleware ต่อไปทำงาน และเมื่อ response ถูกสร้างขึ้น จะทำการบันทึก HTTP status code ของ response ลงใน log
  3. LocalLogger: เป็น local middleware ที่ใช้สำหรับบันทึกข้อมูล Request และ Response เฉพาะเซิร์ฟเวอร์นี้ ในลักษณะเดียวกันกับ PrintLogger แต่จะแสดงข้อมูลในรูปแบบ “[Local Middleware] Request: [HTTP method] [URL path]” และ “[Local Middleware] Response: [HTTP status code]” ซึ่งเรียกใช้งานผ่านเส้นทาง “/api/users/local” และหยุดการทำงานของ middleware นั้นๆ หากมี error เกิดขึ้นระหว่างการทำงาน จะส่ง error กลับไป.
  4. Route “/api/users”: มีการตั้งค่าเพื่อใช้งาน Middleware ทั้ง CheckAuth และ PrintLogger และจะสร้างข้อมูลผู้ใช้และส่งกลับเป็น JSON ใน response.
  5. Route “/api/users/local”: มีการตั้งค่าเพื่อใช้งาน LocalLogger Middleware เท่านั้น และจะส่งข้อความกลับไปยัง client.

การใช้งาน Middleware เพิ่มเติม

Go Fiber มี Middleware ให้ใช้งานอื่นๆอีกมากมาย เช่น compress, recover, csrf เป็นต้น สามารถดูรายละเอียดและวิธีการใช้งานได้ในเอกสารอ้างอิงของ Go Fiber ลิ้งค์ต่อไปนี้ https://docs.gofiber.io/category/-middleware

ประโยชน์ของการใช้ Middleware ใน Gofiber

  1. การจัดการ Request-Response: Middleware ช่วยให้เราสามารถจัดการกับการร้องขอและการตอบกลับได้อย่างมีประสิทธิภาพ ซึ่งช่วยลดความซับซ้อนในการเขียนโค้ดและเพิ่มความสะดวกในการแก้ไขและบำรุงรักษาโปรเจกต์
  2. Authentication และ Authorization: Middleware สามารถใช้ในการตรวจสอบการตรวจสอบตัวตนและการอนุญาตก่อนที่จะทำการดำเนินการต่อในแอปพลิเคชันของเรา นั่นหมายความว่าเราสามารถกำหนดกฎการเข้าถึงและควบคุมการเข้าถึงทรัพยากรของได้อย่างมีประสิทธิภาพ
  3. การกำหนดค่า: Middleware สามารถใช้ในการกำหนดค่าต่างๆ ก่อนการดำเนินการต่อไป เช่น การตั้งค่าภาษาหรือการตั้งค่าการเชื่อมต่อฐานข้อมูล
  4. การบันทึกและการตรวจสอบข้อผิดพลาด: Middleware ช่วยในการบันทึกข้อมูลเกี่ยวกับ Request และ Response ในแอปพลิเคชัน เช่น การบันทึกเมื่อมีการร้องขอ API หรือ URL ถูกเรียกใช้ และเมื่อมีการส่งข้อมูลกลับไปยัง Client อีกทั้งยังช่วยในการตรวจสอบและจัดการกับข้อผิดพลาดที่เกิดขึ้น เช่น การจัดการข้อผิดพลาด และการส่งคืนรหัสสถานะและข้อความแจ้งเตือนให้กับผู้ใช้งาน เพื่อให้ง่ายต่อการตรวจสอบและวิเคราะห์ปัญหาที่เกิดขึ้น นอกจากนี้ Middleware ยังช่วยในการบันทึกข้อมูลเกี่ยวกับข้อผิดพลาดเพื่อให้ง่ายต่อการวิเคราะห์และแก้ไขปัญหาในอนาคต
  5. การจัดการการเรียงลำดับขั้นตอน: Middleware ช่วยให้เราสามารถจัดการลำดับขั้นตอนการประมวลผลของแอปพลิเคชันของเราได้อย่างอย่างมีประสิทธิภาพ เช่น การกำหนดลำดับของการส่งคำขอ HTTP หรือการประมวลผลก่อนและหลัง

--

--