快速注意:如果您查看了我之前关于 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)) }) }对于那些有兴趣深入研究日志中间件的人,我建议您查看 Matt Silverlock 关于用 Go 编写日志中间件的精彩指南。他详细介绍了如何为各种用例构建可重用中间件,例如身份验证、跟踪,当然还有日志记录!
第 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现在,尝试点击任何端点(例如 /books)并检查您的终端。您应该看到如下日志:
Started GET /books Completed in 1.2ms如果出现错误,您会看到:
Error occurred: some error details但是您的用户只会看到一条干净的“500 内部服务器错误”消息。 ?
日志记录可帮助您追踪错误并监控 API 的行为。如果出现问题,您将确切地知道哪个端点被命中以及请求花费了多长时间。
错误处理 可防止您的 API 在发生意外情况时崩溃。相反,它会正常恢复并向客户端发送一条干净的错误消息。
对我们的 Go API 进行 docker 化!这将使您的应用程序可移植并准备好部署在任何计算机或云服务上。准备好施展容器魔法吧! ?
以上是将日志记录和错误处理中间件添加到您的 Go API的详细内容。更多信息请关注PHP中文网其他相关文章!