Promise ve Unhandled Promise Rejection Nedir?
Öncelikle, *Promise* yapısını anlamamız gerekir. JavaScript'te asenkron kod yazarken, *Promise* çok yaygın bir kullanıma sahiptir. Temelde, gelecekte bir değeri temsil eden bir nesne olarak çalışır. Bir *Promise* çözülürse (resolve) başarılı bir sonuç alırsınız, reddedilirse (reject) bir hata meydana gelir. Ancak işte bu noktada devreye giren bir problem var: Eğer bir *Promise* reddedildiğinde bunu düzgün bir şekilde yakalamazsanız, yani *catch* blokları kullanmazsanız, karşınıza *Unhandled Promise Rejection* hatası çıkar.
Örneğin:
const fetchData = new Promise((resolve, reject) => {
let success = false;
if(success) {
resolve("Veri başarıyla alındı!");
} else {
reject("Veri alınamadı!");
}
});
// Unhandled Promise Rejection hatasına sebep olacak bir durum
fetchData;
Yukarıdaki örnekte, *fetchData* adlı *Promise* reddediliyor ama bu hata yakalanmıyor. Böyle bir durumda, Node.js size *Unhandled Promise Rejection* hatası verecektir.
Bu Hatayı Neden Alıyorsunuz?
Peki, *Unhandled Promise Rejection* hatasını almamanız için ne yapmalısınız? Aslında, hatayı aldığınızda çok basit bir sebep var: *Promise*’ınız reddedildiği halde, bu durumu düzgün bir şekilde yakalamadınız. Yani, kodunuzda her *Promise* için bir *catch* bloğu veya *try-catch* yapısı bulunmuyor.
Basit bir çözüm örneği:
fetchData
.catch(error => {
console.log("Hata yakalandı:", error);
});
Burada, *fetchData* reddedildiğinde *catch* bloğu devreye girer ve hata yakalanır. Bu sayede, uygulamanızın aniden durmasının önüne geçmiş olursunuz.
Node.js'teki Unhandled Promise Rejection ile İlgili Yapılandırma Ayarları
Node.js, *Unhandled Promise Rejection* hatasını gördüğünde, varsayılan olarak programı sonlandırmaya karar verir. Fakat bu davranışı değiştirmek ve hatanın görsel olarak size bildirilmesini sağlamak için Node.js yapılandırmalarında değişiklik yapabilirsiniz.
Node.js 15 ve sonrasında, bu tür hataların programı durdurmasını istemiyorsanız, komut satırında aşağıdaki gibi bir flag kullanabilirsiniz:
node --unhandled-rejections=strict app.js
Alternatif olarak, uygulamanızda daha esnek bir çözüm elde etmek için aşağıdaki kodu kullanarak *process.on* olayıyla hataları ele alabilirsiniz.
process.on('unhandledRejection', (reason, promise) => {
console.log('Unhandled Rejection:', reason);
});
Bu kod, *Unhandled Promise Rejection* hatası meydana geldiğinde, hatayı konsola yazdıracaktır. Böylece hatayı daha kolay bir şekilde tespit edebilirsiniz.
Unhandled Promise Rejection Hatasını Engellemek İçin İpuçları
1. Her zaman *catch* veya *try-catch* kullanın: Asenkron işlemler sırasında *Promise*’larınızı her zaman düzgün bir şekilde yakalayın. Bu, sadece hataları engellemekle kalmaz, aynı zamanda hataların size düzgün bir şekilde bildirilmesini de sağlar.
2. Global hata yakalama mekanizması ekleyin: Eğer büyük bir projede çalışıyorsanız ve birçok farklı yerden asenkron işlemler yapıyorsanız, global bir hata yakalama mekanizması kurmanız faydalı olacaktır. Bu sayede, hatalarınızı merkezi bir noktada toplayabilir ve işlemeyi daha kolay hale getirebilirsiniz.
3. Node.js yapılandırmalarına dikkat edin: Node.js'in hata yönetim özelliklerini doğru yapılandırarak, *Unhandled Promise Rejection* hatasının sadece konsola yazdırılmasını ya da programın sonlandırılmasını kontrol edebilirsiniz.
Sonuç
Node.js'te karşılaşılan *Unhandled Promise Rejection* hatası, genellikle basit bir unuttuğumuz hata yakalama eksikliğinden kaynaklanır. Ancak doğru yöntemlerle bu hatayı önlemek ve düzgün bir şekilde yakalamak oldukça kolaydır. Unutmayın, her zaman asenkron işlemlerinizi düzgün bir şekilde yönetmeli ve hataları en başından yakalamalısınız. Ayrıca, global hata yakalama mekanizmaları ve Node.js yapılandırmaları ile uygulamanızı daha sağlam hale getirebilirsiniz. Böylece, kullanıcılarınız da herhangi bir hata yüzünden beklenmedik bir şekilde uygulamanızdan atılmaz!