31 Blog Yazımız Sessizce Silinmişti: Bir Parser Hatasının Hikayesi
Sorunun Fark Edilişi: "Neden Bu Kadar Az Yazı Var?"
Geçen hafta rutin bir içerik güncellemesi sırasında, canlı sitemizdeki blog sayfasını açtığımda garip bir şey fark ettim: sadece 12 yazı görünüyordu. Oysa birkaç gün önce 40'ın üzerinde yazı olduğunu hatırlıyordum.
İlk başta tarayıcı cache'i veya sayfalama sorunu olduğunu düşündüm. Ama sayfayı yenilediğimde, farklı tarayıcılarda açtığımda hep aynı sonuç: 12 yazı. Yerel geliştirme ortamımdaki yedek posts.js dosyasını kontrol ettiğimde ise 43 yazı vardı.
31 yazı kaybolmuştu. Ve en kötüsü: hiçbir hata mesajı almamıştık.
Teşhis: Sessiz Hata Yutan Parser
Sorunu bulmak için otomatik yayın sistemimizin kodunu incelemeye başladım. Sistemimiz şöyle çalışıyordu:
- Yeni bir blog yazısı oluşturulduğunda, script mevcut
posts.jsdosyasını okuyor - İçeriği JSON olarak parse ediyor
- Yeni yazıyı listeye ekliyor
- Güncellenmiş listeyi dosyaya geri yazıyor
Sorun, ikinci adımdaki parser kodundaydı:
// YANLIŞ KOD - Asla böyle yazmayın!
function loadPosts() {
try {
const content = fs.readFileSync('posts.js', 'utf8');
const posts = JSON.parse(content);
return posts;
} catch (error) {
console.log('Parse hatası, boş liste döndürülüyor');
return []; // 🚨 Sessizce boş liste döndürüyor!
}
}
Bir gün önce, manuel bir düzenleme sırasında posts.js dosyasına yanlışlıkla geçersiz bir karakter girmiştik (muhtemelen bir virgül veya tırnak işareti eksikti). Dosya artık geçerli bir JSON değildi.
Script çalıştığında JSON.parse() hata fırlattı, ama catch bloğu bu hatayı yakaladı ve sessizce boş bir dizi döndürdü. Sistem "mevcut yazı yok, sadece yeni yazıyı kaydet" diye düşündü ve dosyanın üzerine yazdı.
31 yazı bir anda yok oldu. Hiçbir uyarı, hiçbir log, hiçbir şey.
Kurtarma Operasyonu
1. Yedekten Geri Yükleme
Şanslıydık: yerel geliştirme ortamımda bir gün öncesine ait yedek vardı. Ama bu, son 24 saatte eklenen 2 yeni yazıyı kaybetmemiz anlamına geliyordu.
Git geçmişini kontrol ettim:
git log --all --full-history -- posts.js
git show abc123:posts.js > posts_recovered.js
Neyse ki, kaybolan 2 yazıdan biri hâlâ canlı sitedeydi (cache'de kalmıştı). Diğerini ise taslak klasöründen buldum. Manuel olarak birleştirdim ve 43 yazının tamamını geri getirdim.
2. Asla Sessizce Başarısız Olmayan Yeni Parser
Aynı hatayı tekrar yaşamamak için parser'ı baştan yazdım:
// DOĞRU KOD
function loadPosts() {
const backupPath = `posts_backup_${Date.now()}.js`;
try {
const content = fs.readFileSync('posts.js', 'utf8');
// Önce yedek al
fs.copyFileSync('posts.js', backupPath);
const posts = JSON.parse(content);
// Temel doğrulama
if (!Array.isArray(posts)) {
throw new Error('posts.js bir dizi değil!');
}
if (posts.length === 0) {
throw new Error('posts.js boş - bu muhtemelen bir hata!');
}
return posts;
} catch (error) {
console.error('❌ KRİTİK HATA: posts.js okunamadı!');
console.error('Hata detayı:', error.message);
console.error('Yedek dosya:', backupPath);
// İşlemi DURDUR - veri kaybını önle
process.exit(1);
}
}
Yeni yaklaşımın özellikleri:
- Otomatik yedekleme: Her okuma öncesi timestamp'li yedek
- Doğrulama: Boş liste bile şüpheli sayılıyor
- Açık hata mesajları: Neyin yanlış gittiği net bir şekilde loglanıyor
- İşlemi durdurma: Hatalı veriyle devam etmek yerine sistem duruyor
Genel Ders: "Fail Fast" Prensibi
Bu olay bize önemli bir yazılım geliştirme prensibini hatırlattı: sessiz hata yutma, gizli veri kaybından çok daha tehlikelidir.
İçerik yönetim sistemlerinde özellikle dikkat edilmesi gerekenler:
- Asla varsayılan değer döndürmeyin: Bir dosya okunamıyorsa, boş liste döndürmek yerine hata fırlatın
- Beklenmedik durumları loglamak yetmez: Kritik hatalarda işlemi durdurun
- Otomatik yedekleme zorunludur: Özellikle üzerine yazma işlemlerinden önce
- Doğrulama katmanları ekleyin: "Dosya okundu" yeterli değil, "içerik mantıklı mı?" sorusunu sorun
Kendi Sitenizi Kontrol Edin
Benzer bir sorunu yaşamamak için şunları kontrol edin:
- İçerik yönetim scriptlerinizde
catchbloklarını inceleyin - Varsayılan değer döndüren (
return [],return {}) kodları arayın - Kritik dosyaların yedekleme stratejisini gözden geçirin
- Otomatik işlemlerin log çıktılarını düzenli kontrol edin
AICompatible.com'un site tarayıcısı, bu tür yapısal sorunları otomatik tespit ediyor. Özellikle içerik tutarlılığı kontrolü, beklenmedik içerik kayıplarını erken fark etmenize yardımcı olabilir. Ama en önemli savunma hattınız, kodunuzun hata durumlarında sessiz kalmak yerine yüksek sesle bağırmasını sağlamak.
Sonuç olarak: 31 yazıyı geri getirdik, sistemi daha sağlam hale getirdik ve değerli bir ders öğrendik. Bazen en iyi öğretmen, neredeyse kaybettiğiniz veridir.