簡単なメモ: 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 でのロギング ミドルウェアの作成に関する Matt Silverlock の素晴らしいガイドを参照することをお勧めします。彼は、認証、トレース、そしてもちろんログ記録など、さまざまなユースケースに合わせて再利用可能なミドルウェアを構築する方法を詳しく解説しています。
エラーについて話しましょう。エラーは起こりますよね?ただし、クラッシュを引き起こしたり、曖昧なエラー メッセージを送信したりするのではなく、適切に処理しましょう。
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 を Docker 化します!これにより、アプリが移植可能になり、あらゆるマシンまたはクラウド サービスに展開できるようになります。コンテナマジックの準備をしましょう! ?
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3