- vừa được xem lúc

Golang - Dealing with the panic in your rest api.

0 0 32

Người đăng: Phượng Sồ

Theo Viblo Asia

Lời tựa

Xin chào, đến hẹn lại lên. Hôm nay, Thống xin được chia sẽ về cách xử lí panic trong rest api nhé. 😁😁

Bài toán

rest api -

Về kiến trúc mình sẽ dùng gin framework để support define rest api. Khi có 1 request được gửi đến, nó sẽ đi qua 3 tầng - transport -> service -> repo -> db library. (Và như mọi lần, mình sẽ để source ở đây và chỉ điểm mặt những ý chính để các bạn tiện theo dõi nhé).
Khi code golang, chắc hẳn bạn đã biết panic có thể stop "program" nếu nó ko được "recovered". Và để rest server không bị crashed thì bất cứ khi có 1 "panic" nào xãy ra ở trong quá trình call request, chúng ta phải sẽ catch được error và tiến hành recover lại.
Okee, trước khi fix được bug thì ít nhất ta phải thấy được bug cái đã.

Tiến hành trigger panic

Mình sẽ set up file ".env" và kích hoạt panic dưa theo file này:
image.png
Trigger panic ở db library:
image.png
image.png
Run server and see a run time error:
Server
image.png
Client response
image.png
Run time error đã xuất hiện , client thì nhận được "response" và server lại ko bị stop.
Dường như Thống đã chém gió hơi lố đà rầu các bác ạ. Server phải stop sau khi panicking đúng ko nào ?
image.png

What's wrong in here ? 😁😁Lol thật ra thì cái server của Thống đã có sẵn cơ chế recover từ GIN framework với câu lệnh gin.Default và "net/http" library rồi(recovery of gin and recover of http).
Chúng ta không cần handle panic nữa và hẹn gặp lại các bạn lần sau (ah mình lại đùa đấy 😅😅). Để ko mất thời gian, ta sẽ back lai cái client response ở trên. Về cơ bản, thằng GIN nó chỉ support chúng ta cái mã lỗi 5 xị thôi và một good server thì không thễ nào trả về mỗi cái mã lỗi như vậy được. Chúng ta phải giành lại cái quyền trả về lỗi đó.
Vậy công việc bây giờ là bằng cách nào đó, phải catch "error" và format error và trả về client trước 2 thằng "recover" ở trên nó đụng tới.

Add middleware for recover a panic


image.png
image.png
Tác giả của GIN dường như cũng đã thấy ra vấn đề này và set up cho chúng ta sẵn cơ chế middleware. Chúng ta chỉ việc recover a panic tại middleware và include nó vào server qua hàm "router.Use()". Tất nhiên, GIN sẽ set up request cho gặp middleware trước khi gặp 2 thằng recover kia.

Call server again with recover middleware:
image.png

Vài lời sau cuối

  • Rất cám ơn bạn đã chịu khó khi vẫn còn ngồi ở đây 😁😁.
  • Về ví dụ và định nghĩa, defer, recover, panic có rất nhiều trên mạng (i.e https://go.dev/play/p/g0ZfIRqKnrn). Nhưng để đọc xong nó và áp dụng vào thực tế thì không hề đơn giản. Như ví dụ ở trên mình làm với GIN, nhưng nếu swap qua mux.Router thì chúng ta cũng phải xem xét làm sao để có thể xư lí request trước khi cơ chế recover của nó đụng tới.
  • Về format error, tùy theo dự án mà bạn có thể set up theo cách bạn muốn. Mình chỉ để tạm thời để ví dụ đơn giản ở đây thôi nhé.
  • Nếu thấy hay tặng Thống 1 like nhé
  • Tham khảo:

Bình luận

Bài viết tương tự

- vừa được xem lúc

gRPC - Nó là gì và có nên sử dụng hay không?

Nhân một ngày rảnh rỗi, mình ngồi đọc lại RPC cũng như gRPC viết lại để nhớ lâu hơn. Vấn đề là gì và tại sao cần nó .

0 0 131

- vừa được xem lúc

Embedded Template in Go

Getting Start. Part of developing a web application usually revolves around working with HTML as user interface.

0 0 56

- vừa được xem lúc

Tạo Resful API đơn giản với Echo framework và MySQL

1. Giới thiệu.

0 0 60

- vừa được xem lúc

Sử dụng goquery trong golang để crawler thông tin các website Việt Nam bị deface trên mirror-h.org

. Trong bài viết này, mình sẽ cùng mọi người khám phá một package thu thập dữ liệu có tên là goquery của golang. Mục tiêu chính của chương trình crawler này sẽ là lấy thông tin các website Việt Nam bị deface (là tấn công, phá hoại website, làm thay đổi giao diện hiển thị của một trang web, khi người

0 0 237

- vừa được xem lúc

Tạo ứng dụng craw dữ liệu bing với Golang, Mysql driver

Chào mọi người . Lâu lâu ta lại gặp nhau 1 lần, để tiếp tục series chia sẻ kiến thức về tech, hôm nay mình sẽ tìm hiểu và chia sẻ về 1 ngôn ngữ đang khá hot trong cộng đồng IT đó là Golang.

0 0 75

- vừa được xem lúc

Golang: Rest api and routing using MUX

Routing with MUX. Let's create a simple CRUD api for a blog site. # All . GET articles/ .

0 0 54