快速注意:如果您查看了我之前關於 JWT 身份驗證的帖子並註意到一些渲染問題,那麼這些問題現已修復!請務必再看一遍,因為這些範例是建立在該教程之上的。 :)
好了,夥計們,我們已經運行了 Go API,添加了 JWT 身份驗證,甚至將其連接到 PostgreSQL 資料庫。但我們還沒完成!本週,我們將更上一層樓,透過添加用於日誌記錄和更聰明以及更多開發人員友善 >錯誤處理。
中間件又是什麼? ?今天,我們將建構以下中間件:
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)) }) }
第 2 步:錯誤處理中間件?
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) }) }
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)) }
go run main.go
Started GET /books Completed in 1.2ms
Error occurred: some error details
日誌記錄可協助您追蹤錯誤並監控 API 的行為。如果出現問題,您將確切地知道哪個端點被命中以及請求花費了多長時間。
錯誤處理 可防止您的 API 在發生意外情況時崩潰。相反,它會正常恢復並向客戶端發送乾淨的錯誤訊息。
對我們的 Go API 進行 docker 化!這將使您的應用程式可移植並準備好部署在任何電腦或雲端服務上。準備好施展容器魔法吧! ?
以上是將日誌記錄和錯誤處理中間件新增至您的 Go API的詳細內容。更多資訊請關注PHP中文網其他相關文章!