0Pricing
Go Academy · บทเรียน

รูปแบบมิดเดิลแวร์

เชื่อมตัวจัดการเป็นสายโซ่สำหรับการบันทึกและการยืนยันตัวตน

รูปแบบมิดเดิลแวร์ เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

มิดเดิลแวร์คืออะไร

มิดเดิลแวร์คือฟังก์ชันที่ห่อตัวจัดการ http.Handler เพื่อเพิ่มพฤติกรรมร่วม เช่น การบันทึกเหตุการณ์, Auth และ Recovery โดยไม่แก้ไขตรรกะทางธุรกิจของตัวจัดการ

ลายเซ็นของมิดเดิลแวร์

มิดเดิลแวร์คือฟังก์ชันที่รับ http.Handler และส่งคืน http.Handler:

type Middleware func(http.Handler) http.Handler

มิดเดิลแวร์บันทึกเหตุการณ์อย่างง่าย

บันทึกแต่ละคำขอก่อนและหลังจากตัวจัดการทำงาน:

func Logger(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("%s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
        log.Printf("done %s", r.URL.Path)
    })
}

การเชื่อมมิดเดิลแวร์

ใช้มิดเดิลแวร์หลายชั้นโดยซ้อนฟังก์ชันเหล่านั้นเข้าด้วยกัน:

handler := Logger(Auth(RateLimit(myHandler)))
http.ListenAndServe(":8080", handler)

ตัวช่วยสร้างโซ่มิดเดิลแวร์

สร้างฟังก์ชันโซ่เพื่อใช้มิดเดิลแวร์ตามลำดับโดยไม่ต้องซ้อนกันลึก:

func Chain(h http.Handler, m ...Middleware) http.Handler {
    for i := len(m)-1; i >= 0; i-- {
        h = m[i](h)
    }
    return h
}
// Usage: Chain(myHandler, Logger, Auth, RateLimit)

มิดเดิลแวร์ Auth

ตรวจสอบการยืนยันตัวตนก่อนเรียกตัวจัดการถัดไป ให้ส่งการตอบกลับ 401 ทันทีหากโทเค็นไม่มีอยู่หรือไม่ถูกต้อง

func Auth(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        token := r.Header.Get("Authorization")
        if !isValid(token) {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }
        next.ServeHTTP(w, r)
    })
}

มิดเดิลแวร์กู้คืนจากแพนิก

ดักจับแพนิกจากตัวจัดการเพื่อไม่ให้เซิร์ฟเวอร์หยุดทำงาน:

func Recovery(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if err := recover(); err != nil {
                log.Printf("panic: %v", err)
                http.Error(w, "Internal Server Error", 500)
            }
        }()
        next.ServeHTTP(w, r)
    })
}

การส่งข้อมูลผ่าน Context

มิดเดิลแวร์สามารถแนบข้อมูลไว้ใน Context ของคำขอ เพื่อให้ตัวจัดการถัดไปใช้งานได้:

ctx := context.WithValue(r.Context(), userKey, user)
next.ServeHTTP(w, r.WithContext(ctx))

ตัวห่อการตอบกลับ

จับรหัสสถานะที่ตัวจัดการเขียน โดยการห่อ ResponseWriter:

type statusRecorder struct {
    http.ResponseWriter
    status int
}
func (r *statusRecorder) WriteHeader(code int) {
    r.status = code
    r.ResponseWriter.WriteHeader(code)
}

ลำดับมีความสำคัญ

มิดเดิลแวร์จะทำงานตามลำดับที่ใช้ห่อตัวจัดการ ควรให้ Auth ทำงานก่อนการจำกัดอัตรา และควรวาง Recovery ไว้ชั้นนอกสุดเพื่อให้ดักจับแพนิกจากมิดเดิลแวร์อื่นได้

มิดเดิลแวร์เฉพาะเส้นทางเทียบกับมิดเดิลแวร์ส่วนกลาง

ใช้มิดเดิลแวร์ส่วนกลาง เช่น การบันทึกเหตุการณ์และ Recovery กับ mux ทั้งหมด ใช้มิดเดิลแวร์เฉพาะเส้นทาง เช่น Auth และการจำกัดอัตรา กับกลุ่มเส้นทางที่กำหนด โดยใช้เราเตอร์ย่อยหรือตัวห่อตัวจัดการ

ตรวจสอบความเข้าใจ

ลายเซ็นที่ถูกต้องของมิดเดิลแวร์ HTTP ใน Go คืออะไร

ทบทวน: รูปแบบมิดเดิลแวร์

ประเด็นสำคัญ:

  • มิดเดิลแวร์: func(http.Handler) http.Handler
  • เชื่อมต่อโดยการซ้อนกัน และใช้ตัวช่วย Chain เพื่อให้อ่านง่าย
  • วาง Recovery ไว้ชั้นนอกสุด และให้ Auth ทำงานก่อนตรรกะทางธุรกิจ
  • ส่งข้อมูลไปยังตัวจัดการถัดไปผ่าน Context

คำถามที่พบบ่อย

บทเรียน “รูปแบบมิดเดิลแวร์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบมิดเดิลแวร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบมิดเดิลแวร์”

เชื่อมตัวจัดการเป็นสายโซ่สำหรับการบันทึกและการยืนยันตัวตน คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “รูปแบบมิดเดิลแวร์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้างเซิร์ฟเวอร์ HTTP
  2. การกำหนดเส้นทางและพารามิเตอร์เส้นทาง
  3. รูปแบบมิดเดิลแวร์
  4. การปิดระบบอย่างนุ่มนวล
← กลับไปที่ Go Academy