Unhandled Promise Rejection Hatası Nedir?
Node.js sürüm 15 ve sonrası, bu tür hataları artık bir exception olarak ele alır. Bu, kodunuzda bir yere kadar nazikçe kaybolan hataların gün yüzüne çıkmasını sağlar. Ancak işin içine büyük projeler girdiğinde, "Unhandled Promise Rejection" hatası bazen ne yazık ki görmezden gelinmeye başlanır. Bu da ileride daha karmaşık sorunlara yol açar.
Neden "Unhandled Promise Rejection" Hatası Alırım?
1. Promise’ın reddedilmesi (rejected) ve bu hatanın yakalanmaması:
Bir Promise, bir şekilde başarısız olduğunda, bu hatanın `catch()` bloğu veya `try/catch` ile yakalanması gerekir. Eğer yakalanmazsa, işte bu hata ortaya çıkar.
2. Senkron ve Asenkron Kodların Çakışması:
Eğer senkron kod ile asenkron kodları doğru şekilde birleştirmezseniz, beklenmedik hatalar alabilirsiniz. Örneğin, asenkron bir işlem ile ilgili bir hata, yanlış yerde ve zaman diliminde yakalanabilir.
Çözüm Yöntemleri
Birçok durumda, asenkron işlemin sonucunu elde etmek için `.then()` ve `.catch()` kullanılır. Eğer bir hata oluşursa, bu hatayı düzgün şekilde `catch()` içinde yakalayabilirsiniz.
Ö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ı.");
}
});
fetchData
.then(result => {
console.log(result);
})
.catch(error => {
console.error("Hata:", error);
});
Burada, `.catch()` bloğu sayesinde, Promise hata alırsa, bu hata düzgün şekilde yakalanacaktır.
Daha modern bir çözüm, `async/await` yapısı ile birlikte gelen `try/catch` bloklarını kullanmaktır. Bu yöntem, asenkron kodları daha senkron hale getirir ve hata yönetimini oldukça kolaylaştırır.
Örnek:
async function fetchData() {
try {
const result = await new Promise((resolve, reject) => {
let success = false;
if (success) {
resolve("Veri başarıyla alındı.");
} else {
reject("Veri alınamadı.");
}
});
console.log(result);
} catch (error) {
console.error("Hata:", error);
}
}
fetchData();
Burada, `try/catch` bloğu, asenkron hataların yakalanmasını sağlar ve hata oluştuğunda kodumuz düzgün şekilde hata mesajını verir.
Node.js, eğer herhangi bir yerde yakalanmamış bir Promise hatası alırsa, bunu *process* üzerinden global olarak dinlemenize olanak sağlar. Bu yöntem, genel hata yönetimini iyileştirmek için idealdir.
Örnek:
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
// Uygulamanızı düzgün şekilde sonlandırabilirsiniz
});
Bu şekilde, her hangi bir Promise hatası, yakalanmadan önce `unhandledRejection` event'ine düşer ve buradan hatayı görebiliriz.
Node.js sürümünüz çok eskiyse, "Unhandled Promise Rejection" hatası farklı şekillerde davranabilir. En güncel sürümü kullanmak, bu hataların daha düzgün bir şekilde ele alınmasını sağlar.
Güncellemeyi şu komut ile yapabilirsiniz:
nvm install node
Bu, Node.js'in en son sürümünü yükleyecektir.
Sonuç
Ayrıca, kodunuzun her zaman asenkron işleyişini iyi bir şekilde anlamanız, ileride karşılaşabileceğiniz daha karmaşık hataları önlemenizi sağlar.