快速注意:如果您查看了我之前關於 JWT 身份驗證的帖子並註意到一些渲染問題,那麼這些問題現已修復!請務必再看一遍,因為這些範例建立在該教程的基礎上。 :)
好吧,夥計們,我們已經運行了 Go API,添加了 JWT 身份驗證,甚至將其連接到 PostgreSQL 資料庫。但我們還沒完成!本週,我們將透過添加用於日誌記錄和的自訂中間件,使我們的API 更聰明以及更多開發人員友好 ]錯誤處理。
中間件就像您最喜歡的俱樂部的保鑣——它會在請求到達您的 API 端點之前攔截它們。您可以使用中間件來檢查身份驗證(就像我們對 JWT 所做的那樣)、記錄資訊或在出現問題時處理錯誤。
今天,我們將建造中間件:
讓我們深入探討一下!
在偵錯並了解 API 中發生的情況時,日誌記錄是您最好的朋友。我們將建立一個中間件來記錄通過的每個請求—方法、URL 和所使用的時間。
func loggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() // Log the method and the requested URL log.Printf("Started %s %s", r.Method, r.URL.Path) // Call the next handler in the chain next.ServeHTTP(w, r) // Log how long it took log.Printf("Completed in %v", time.Since(start)) }) }
對於有興趣深入研究日誌中間件的人,我建議您查看 Matt Silverlock 關於用 Go 編寫日誌中間件的精彩指南。他詳細介紹瞭如何為各種用例建立可重複使用中間件,例如身份驗證、跟踪,當然還有日誌記錄!
我們來談錯誤。錯誤總是會發生,對嗎?但與其讓它們導致崩潰或發送模糊的錯誤訊息,不如讓我們優雅地處理它們。
func errorHandlingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer func() { if err := recover(); err != nil { // Log the error and send a user-friendly message log.Printf("Error occurred: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) } }() next.ServeHTTP(w, r) }) }
現在我們已經建立了日誌記錄和錯誤處理中間件,讓我們將它們連接到我們的 API。我們將在全球範圍內應用它們,以便記錄每個請求並捕獲錯誤。
func main() { db = connectDB() defer db.Close() r := mux.NewRouter() // Apply middleware globally r.Use(loggingMiddleware) r.Use(errorHandlingMiddleware) r.HandleFunc("/login", login).Methods("POST") r.Handle("/books", authenticate(http.HandlerFunc(getBooks))).Methods("GET") r.Handle("/books", authenticate(http.HandlerFunc(createBook))).Methods("POST") fmt.Println("Server started on port :8000") log.Fatal(http.ListenAndServe(":8000", r)) }
為了確保一切正常,請啟動您的 API:
go run main.go
現在,嘗試訪問任何端點(例如 /books)並檢查您的終端。您應該會看到以下日誌:
Started GET /books Completed in 1.2ms
如果有錯誤,您會看到:
Error occurred: some error details
但是您的用戶只會看到一條乾淨的「500 內部伺服器錯誤」訊息。 ?
日誌記錄 可協助您追蹤錯誤並監控 API 的行為。如果出現問題,您將確切地知道哪個端點被命中以及請求花費了多長時間。
錯誤處理可防止您的 API 在發生意外情況時崩潰。相反,它會正常恢復並向客戶端發送乾淨的錯誤訊息。
下次,我們將把事情提升到一個新的水平並dockerize我們的Go API!這將使您的應用程式可移植並準備好部署在任何電腦或雲端服務上。準備好施展容器魔法吧! ?
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3