Замечание: если вы прочитали мой предыдущий пост об аутентификации 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)) }) }
Для тех, кто хочет глубже погрузиться в промежуточное программное обеспечение для журналирования, я рекомендую ознакомиться с фантастическим руководством Мэтта Сильверлока по написанию промежуточного программного обеспечения для журналирования на 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 Internal Server Error». ?
Журналирование помогает отслеживать ошибки и отслеживать поведение вашего API. Если что-то пойдет не так, вы будете точно знать, какая конечная точка была затронута и сколько времени занял запрос.
Обработка ошибок предотвращает сбой вашего API, когда происходит что-то неожиданное. Вместо этого он корректно восстанавливается и отправляет клиенту чистое сообщение об ошибке.
В следующий раз мы выйдем на новый уровень и докеризуем наш Go API! Это сделает ваше приложение портативным и готовым к развертыванию на любом компьютере или в облачной службе. Приготовьтесь к контейнерному волшебству! ?
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3