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');23const db = admin.firestore();45// Koleksiyonun tüm dokümanlarını dinle6const 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 kod15console.error('Listener hatası:', error.code, error.message);1617// 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);2627// Uygulamayı kapatırken listener'ı temizle28process.on('SIGINT', () => {29console.log('Listener kapatılıyor...');30unsubscribe();31process.exit(0);32});Beklenen çıktı:
1Listener hazır2Veri 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.
0 yorum