รูปแบบมิดเดิลแวร์
เชื่อมตัวจัดการเป็นสายโซ่สำหรับการบันทึกและการยืนยันตัวตน
รูปแบบมิดเดิลแวร์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ