Asynchronous Function Timeout Hatası Nedir?
```
Error: Timeout of X ms exceeded
```
Bu hatayı aldığınızda, bir işlemin belirli bir süreyi aşarak zaman aşımına uğradığını anlarsınız. Aslında bu, sadece kodunuzun bir parçasının beklenen sürede tamamlanmaması durumu değil, aynı zamanda performans iyileştirmeleri yapmanız gereken bir alanın işaretidir.
Timeout Hatası Neden Oluşur?
- Uzun süren işlemler: Bazı işlemler, özellikle uzak sunuculara API çağrıları yapıyorsanız, zaman alabilir.
- Ağ bağlantısı sorunları: Yavaş internet bağlantısı veya sunucu tarafındaki aksaklıklar da zaman aşımına yol açabilir.
- Eksik ya da yanlış yapılandırılmış timeout süreleri: Bazı zaman, zaman aşımı süresi çok kısa olabilir, bu durumda işlem tamamlanmadan hata alırsınız.
Peki, bu hatayı nasıl çözebiliriz?
Asynchronous Function Timeout Hatasını Çözme Yolları
Bazı durumlarda, belirlediğiniz timeout süresi çok kısa olabilir. Özellikle uzak API'lere yapılan çağrılar uzun sürebileceği için, bu süreyi uzatmak gerekebilir. Node.js'teki asenkron işlevlerde, bu ayarı yapmanın en kolay yolu, kullanılan fonksiyona zaman aşımı süresi eklemektir.
Örneğin, `axios` gibi bir HTTP istemcisi kullanıyorsanız, bu istemciye timeout süresi tanımlayabilirsiniz:
const axios = require('axios');
axios.get('https://api.example.com/data', { timeout: 10000 }) // 10 saniye
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error('Hata oluştu:', error);
});
Yukarıdaki kodda, `timeout: 10000` ile timeout süresi 10 saniyeye çıkarılmıştır. Eğer bu süreyi artırarak işlemin bitmesini beklerseniz, hata almazsınız.
Bazı senaryolarda, belirli bir süre sonra işlemi manuel olarak sonlandırmak isteyebilirsiniz. Bunun için `setTimeout` fonksiyonunu kullanabilirsiniz. İşte bir örnek:
function uzunSüreliIslem() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("İşlem tamamlandı!");
}, 15000); // 15 saniye bekle
});
}
async function timeoutKontrolü() {
try {
const işlemSonucu = await Promise.race([
uzunSüreliIslem(),
new Promise((_, reject) => setTimeout(() => reject(new Error('Zaman aşımı!')), 10000)) // 10 saniye timeout
]);
console.log(işlemSonucu);
} catch (error) {
console.error(error.message);
}
}
timeoutKontrolü();
Bu örnekte, `Promise.race()` kullanılarak iki işlem birleştirilmiştir: Biri uzun süren işlem, diğeri ise 10 saniyelik bir timeout mekanizması. Eğer işlem 10 saniye içinde tamamlanmazsa, zaman aşımı hatası dönecektir.
Veritabanı bağlantılarında da timeout hataları sıkça karşılaşılan bir durumdur. Veritabanı bağlantısına yapılacak bir çağrının belirli bir süre içinde tamamlanmaması, genellikle veritabanı yapılandırmasıyla ilgilidir.
Örneğin, MongoDB kullanıyorsanız, `mongoose` kütüphanesinde timeout sürelerini şu şekilde ayarlayabilirsiniz:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/mydb', {
useNewUrlParser: true,
useUnifiedTopology: true,
serverSelectionTimeoutMS: 5000 // 5 saniye
})
.then(() => console.log('Bağlantı başarılı!'))
.catch((err) => console.error('Bağlantı hatası:', err));
Burada, `serverSelectionTimeoutMS` ile bağlantı kurulmaya çalışılan sunucunun 5 saniye içinde seçilememesi durumunda bir hata mesajı alırsınız.
Bir başka çözüm yolu ise asenkron işlemleri optimize etmektir. Eğer veritabanı ya da API çağrıları sürekli zaman aşımına uğruyorsa, bu durum sisteminizin genel performansını olumsuz etkileyebilir. Bu nedenle, aşağıdaki stratejileri uygulayarak süreci iyileştirebilirsiniz:
- Cache kullanımı: Sık erişilen verileri bellekte tutarak, API ya da veritabanı çağrılarını azaltabilirsiniz.
- Veritabanı indeksleme: Sorguları hızlandırarak işlem sürelerini kısaltabilirsiniz.
- Batched işlemler: Birden fazla küçük işlemi tek seferde yaparak verimliliği artırabilirsiniz.
Sonuç: Zaman Aşımını Yönetmenin Önemi
Zaman aşımını etkili bir şekilde yönetmek, kullanıcı deneyimini iyileştirir ve uygulamanızın performansını artırır. Şimdi, zaman aşımı hatası almadan sorunsuz çalışan bir Node.js uygulaması yapmaya hazırsınız!