快速注意:如果您查看了我之前关于 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