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 sonu, siteye yeni bir teknik makale ekledikten sonra rastgele bir kontrol yaparken garip bir şey fark ettim: ana sayfadaki blog listesinde sadece 12 yazı görünüyordu. Oysa yerel geliştirme ortamımda 43 yazı vardı.
İlk başta cache sorunu olduğunu düşündüm. Tarayıcıyı hard-refresh yaptım, hatta incognito modda açtım. Sonuç değişmedi. Canlı sunucuya SSH ile bağlanıp posts.js dosyasını açtığımda şok oldum: dosya sadece 12 yazı içeriyordu. 31 yazımız kayıp.
Teşhis: Sessizce Veri Yutan Bir Parser
Hemen Git log'una baktım. Son commit'te otomatik yayın scriptimiz (publish.js) yeni bir yazı eklemişti. Ama değişiklik diff'i korkunçtu: dosyanın tamamı yeniden yazılmış, eski içerik kaybolmuştu.
Scripti incelediğimde sorunu buldum. Mevcut yazıları okumak için kullandığımız kod şöyleydi:
// YANLIŞ YAKLAŞIM
let existingPosts = [];
try {
const fileContent = fs.readFileSync('posts.js', 'utf8');
const jsonMatch = fileContent.match(/export const posts = (\[[\s\S]*\]);/);
if (jsonMatch) {
existingPosts = JSON.parse(jsonMatch[1]);
}
} catch (e) {
// Sessizce devam et
console.log('Mevcut yazılar okunamadı, yeni liste oluşturuluyor');
}
Sorun şuydu: bir önceki yayında, posts.js dosyasında küçük bir syntax hatası oluşmuştu (bir virgül fazlalığı). JSON.parse() bu hatayı yakalayınca exception fırlattı, ama biz catch bloğunda sadece log bastırıp boş liste ile devam ettik. Script, 31 yazının üzerine sadece yeni yazıyı içeren bir dosya yazdı.
Neden Fark Etmemiştik?
- Sessiz hata: Script başarıyla tamamlandı, exit code 0 döndü
- Yerel-canlı senkronizasyon: Yerel ortamımızda eski dosya duruyordu, sadece canlıda sorun vardı
- Kademeli kayıp: Tek seferde olmadı; birkaç yayın döngüsünde kademeli olarak azaldı
Kurtarma Operasyonu
Neyse ki düzenli yedek alıyorduk. İşte izlediğimiz adımlar:
1. Yedekten Geri Yükleme
# Son sağlıklı yedeği bul
ls -lt backups/posts.js.* | head -5
# 3 gün önceki yedek tam görünüyordu
cp backups/posts.js.2024-01-15 posts.js.recovered
# Kayıp yazıları çıkar
node extract-missing.js
2. Yeni, Güvenli Parser Yazma
Sorunu tekrar yaşamamak için parser'ı tamamen yeniden yazdık:
// DOĞRU YAKLAŞIM
function loadExistingPosts(filePath) {
if (!fs.existsSync(filePath)) {
throw new Error(`FATAL: ${filePath} bulunamadı. Yayın durduruluyor.`);
}
const fileContent = fs.readFileSync(filePath, 'utf8');
const jsonMatch = fileContent.match(/export const posts = (\[[\s\S]*\]);/);
if (!jsonMatch) {
throw new Error('FATAL: posts.js formatı geçersiz. Manuel müdahale gerekli.');
}
let posts;
try {
posts = JSON.parse(jsonMatch[1]);
} catch (e) {
// Ayrıntılı hata mesajı + dosya yedeği
const backupPath = `${filePath}.error-${Date.now()}`;
fs.copyFileSync(filePath, backupPath);
throw new Error(
`FATAL: JSON parse hatası. Dosya yedeklendi: ${backupPath}\n` +
`Hata: ${e.message}\n` +
`İçerik önizleme: ${jsonMatch[1].substring(0, 200)}...`
);
}
if (!Array.isArray(posts) || posts.length === 0) {
throw new Error(`FATAL: Beklenmeyen veri yapısı. ${posts.length} yazı bulundu.`);
}
console.log(`✓ ${posts.length} mevcut yazı başarıyla yüklendi`);
return posts;
}
3. Ek Güvenlik Katmanları
- Pre-commit hook: Her yayın öncesi yazı sayısını kontrol eder, %20'den fazla azalma varsa durdurur
- Otomatik yedekleme: Her değişiklik öncesi timestamped yedek alınır
- Dry-run modu:
--dry-runile değişiklikleri önizleme - Slack bildirimi: Her başarılı yayında yazı sayısı rapor edilir
Genel Ders: "Fail Fast" Prensibi
Bu olay bize önemli bir yazılım prensibini hatırlattı: sessizce hata yutmak, hatayı düzeltmekten çok daha tehlikelidir.
İçerik yönetim sistemlerinde özellikle kritik çünkü:
- Veri kaybı genellikle geri döndürülemez
- Sorun fark edilene kadar birçok işlem üst üste yığılabilir
- SEO etkisi anında olmaz, kademeli olarak fark edilir
Kendi Sitenizde Kontrol Edin
Eğer siz de otomatik içerik yayın sistemleri kullanıyorsanız, şu kontrolleri yapmanızı öneririz:
- Tüm
try-catchbloklarını gözden geçirin - gerçekten hatayı yutmanız mı gerekiyor? - Kritik veri işlemlerinde assertion'lar ekleyin (yazı sayısı, dosya boyutu vb.)
- Değişiklik öncesi/sonrası karşılaştırma logları tutun
- Düzenli yedekleme stratejiniz olduğundan emin olun
AICompatible.com'un site tarayıcısı, bu tür yapısal sorunları da tespit eder: sitemap tutarsızlıkları, eksik sayfalar, bozuk JSON-LD yapıları gibi. Bizim yaşadığımız gibi bir veri kaybını, fark edilmeden önce yakalayabilir. Ama en önemlisi: kodunuzda "sessiz hata yutma" varsa, bunu en kısa sürede düzeltin. Bir gün sizi kurtaracak şey, hatayı gizlemek değil, yüksek sesle bağırmak olacak.