GCP Firestore'da Gerçek Zamanlı Listener Kurma ve Hata Yönetimi

Firestore'dan veri değişikliklerini anlık olarak almak için listener kurman gerekir. onSnapshot fonksiyonu bu işi yapar; veritabanındaki bir koleksiyon ya da dokümanda değişiklik olur olmaz seni haberdar eder.

Temel sorun, listener'ı doğru yönetmezsen bellek sızıntısı yaşarsın ve bağlantı koptuğunda uygulama donup kalabilir. Hata yönetimi bu sebeple çok önemli.

Aşağıda Node.js ortamında çalışan, hata işleyen bir örnek var:

1const admin = require('firebase-admin');
2
3const db = admin.firestore();
4
5// Koleksiyonun tüm dokümanlarını dinle
6const unsubscribe = db.collection('users').onSnapshot(
7(snapshot) => {
8console.log('Veri değişti:');
9snapshot.forEach((doc) => {
10console.log(doc.id, '=>', doc.data());
11});
12},
13(error) => {
14// Hata durumunda çalışacak kod
15console.error('Listener hatası:', error.code, error.message);
16
17// Bağlantı kapalı mı?
18if (error.code === 'permission-denied') {
19console.log('Firestore kuralları izin vermiyor');
20}
21},
22() => {
23console.log('Listener hazır');
24}
25);
26
27// Uygulamayı kapatırken listener'ı temizle
28process.on('SIGINT', () => {
29console.log('Listener kapatılıyor...');
30unsubscribe();
31process.exit(0);
32});

Beklenen çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1Listener hazır
2Veri değişti:
3user1 => { name: 'Ali', age: 28 }
4user2 => { name: 'Ayşe', age: 25 }

Bir dokümana özel dinlemek istersen:

1db.collection('users').doc('user1').onSnapshot(
2(doc) => {
3if (doc.exists) {
4console.log('Kullanıcı verisi:', doc.data());
5} else {
6console.log('Dokuman silindi');
7}
8},
9(error) => {
10console.error('Hata:', error);
11}
12);

Sık yapılan hata: listener'ı kapatmak (unsubscribe) unutmak. Özellikle React'ta component unmount olurken temizlemeyi unutursan her render'da yeni listener açılır ve veritabanı bağlantıları tıkanır. useEffect cleanup'ında mutlaka kapat.

Bağlantı kesintisine karşı, Firestore otomatik olarak yeniden bağlanır; sen sadece hata callback'inde log tutup gerekirse kullanıcıyı bilgilendir. Offline modunu açarsan (enablePersistence), uygulama çevrimdışı da çalışabilir.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz

1 yorum

  • dusuncelihal

    listener kapatmayı unutmak gerçekten sıkıntı özellikle sayfa değiştiğinde ya da component yok olurken bir kaç kez bunu yüzünden bellek sızıntısı yaşadım