Merhaba Sevgili Okurlar,
Bu yazımda sizlere geliştirdiğimiz uygulamaların yaşam döngüsünde önemli bir yere sahip olan Cross-cutting Concerns konusundan bahsedeceğim. Bu kavram uygulamaların temel ihtiyaçlar gibi düşünülebilir. Cross-cutting concern'leri aşağıdaki başlıklarda toplayabiliriz.
- Authentication & Authorization
- Logging and tracing
- Exception handling
- Validation
- Caching
- Configuration
- Transaction Management
- Security
- Performance
Cross-cutting concern genelde her uygulama için ayrı ayrı yazmak yerine bir merkezde toplanır, ve yeniden kullanılır. Örneğin bir mono reponuz olduğunu ve bir çok API'nızın olduğunu düşünün hepsi için aynı metodu uygulamak yerine merkezden yönetmek mantıklı olacaktır. Genellikle cross-cutting concern'ler Single Responsibility Principle'e göre sorumlulukları ayrı tutulur ve Middleware/Interceptor ile uygulamalara inject edilir. Middleware nedir merak ediyorsanız detaylı bilgi için bu yazıma göz atabilirsiniz.
İlk olarak Exception/Error Handling ile başlayalım. daha önce bu yazımızda geliştirdiğimiz API'ye Error handling ekleyelim ve adım adım bahsedelim.
İlk olarak application katmanına middleware klasörünü ekleyelim buraya Error Handling ile ilgili sınıflarımızı oluşturacağız.
İlk olarak HttpStatusCode ve mesajları ile ilgili sınıfları oluşturalım. API hangi durumlarda hangi status kodları fırlatmalıdır göz atmak için bu yazıyı inceleyebilirsiniz.
Aşağıda ise hatalara ait mesajların bulunduğu sınıfı görüyoruz. Hata mesajlarını nerede tuttuğunuz proje ihtiyacına göre değişir. Bazı kurumsal projelerde hata mesajlarını veri tabanında tutma ihtiyacı olabilir. Hatta bir dashboard yapıp product ekibi bu mesajların metnini güncelleme ya da mesaj metinlerini değiştirme ihtiyacı duyabilir. Biz şimdilik statik olarak bir sınıfta tutuyoruz.
Gelelim oluşturacağımız hata sınıfına; bir BaseError oluşturup ondan türeyen bir APIError oluşturacağız.
Gördüğünüz gibi klasik bir hatada olduğu gibi hata adı, mesajı, http kodu ve loglamada developer'lar için oldukça faydalı olan StackTrace yapmamızı sağlana error stack mevcut.
İstediğiniz custom property'leri de buraya ekleyebilirsiniz. isOperational gibi.
Şimdi middleware'ı yazalım ve artık errorHandling katmanımızı API'da kullanmaya hazırız.
server.ts'de bu middleware'yi API'ya inject edelim.
app.use(exceptionHandler);
Şimdi Customer API endpoint'inde error handling yapalım. İlk olarak yapmamız gereken bir çok yere yazdığımız try catch bloklarını kaldırmak, uygulamamanın sadece controller katmanında try catch olması yeterli.
Controller'da da bazı değişikliklerimiz olacak eskiden aşağıdaki gibi olan bir CustomerController'ımız vardı:
Şimdi catch kısmında hata kodlarına göre ayrışma işlemini kaldırarak daha da sadeleştirip middleware'e yönlendiriyoruz.
Peki ya Controller dışında herhangi bir yerden hata fırlatmak istersek ne yapmalıyız aşağıda Customer Repository katmanında customer bulunamadığında not found 404 fırlatalım ve nasıl uyguladığımızı görelim:
Gördüğünüz gibi mesajını status kodunu belirleyerek custom hata fırlatma işlemimizi gerçekleştiriyoruz.
Eğer her seferinde aynı hatalar için örneğin not found hatasını fırlatmak için hata konu ve mesajını tekrar tekrar yazmak istemiyorum derseniz aşağıdaki şekilde bir hata fırlatmak daha doğru olacaktır.
Şimdi uygulamayı çalıştırıp getAllCustomers enpoint'ini çağıralım ve henüz müşteri eklemediğimiz için 404 not found hatasının middleware tarafından yönetildiğiniz görelim.
Uygulama kodunu GitHub hesabımda bulabilirsiniz.
Bir sonraki yazımızda görüşmek üzere, hoşça kalın.
Kaynaklar:
https://www.toptal.com/nodejs/node-js-error-handling
https://medium.com/backenders-club/error-handling-in-node-js-ef5cbfa59992
https://dev.to/qbentil/how-to-write-custom-error-handler-middleware-in-expressjs-using-javascript-29j1
https://mirzaleka.medium.com/build-a-global-exception-handler-using-express-js-typescript-b9bb2f521e5e
https://medium.com/backenders-club/error-handling-in-node-js-ef5cbfa59992
https://dev.to/qbentil/how-to-write-custom-error-handler-middleware-in-expressjs-using-javascript-29j1
https://mirzaleka.medium.com/build-a-global-exception-handler-using-express-js-typescript-b9bb2f521e5e
Hiç yorum yok:
Yorum Gönder