Merhaba dostum! Express.js ile kod yazarken başına gelen o meşhur hata: “Cannot set headers after they are sent to the client”. Peki, neden oluyor ve nasıl çözebilirsin? Gel, birlikte bu hatanın hikayesini keşfedelim.
İlk başta, HTTP’de header’lar çok önemli çünkü onlar istemciye (yani tarayıcıya) cevap hakkında bilgi verir. Mesela, içerik tipi ne, durum kodu ne gibi. Ancak, HTTP protokolü gereği, header’lar yanıt gönderilmeden önce ayarlanmalı. Yani, cevap bir kere gönderildikten sonra, header’ları değiştirmeye çalışırsan Express sana “Cannot set headers after they are sent to the client” diye bağırır.
Peki, neden bu hata çıkar?
Genelde bu hata, aynı response (res) nesnesine birden fazla yanıt gönderilmeye çalışıldığında olur. Örneğin, bir route içinde hem res.send hem de res.json veya başka bir res.send çağırırsan, Express ikinci çağrıda bu hatayı verir. Çünkü header’lar ilk yanıtla birlikte gönderildi, artık değiştirilemez.
İşte yaygın nedenler:
- Birden fazla yanıt göndermek: Kodda mantık hatası varsa, aynı fonksiyon içinde birden çok kez res.send veya res.end çağrılıyor olabilir.
- Asenkron işlemler: Promise veya callback içinde, kontrolü kaybetmek sonucu birden fazla yanıt gönderilmeye çalışabilir.
- Hata yönetimi eksikliği: Hata olduğunda hem hata hem de başarılı yanıt gönderilmeye çalışılabilir.
Nasıl önleyebilirsin?
// En basit haliyle, her response için sadece bir kez yanıt gönder
app.get('/example', (req, res) => {
if (someCondition) {
return res.send('İlk yanıt'); // return ile fonksiyonu sonlandır
}
res.send('İkinci yanıt'); // bu kod ancak ilk if çalışmazsa gider
});
return kullanmak, fonksiyonun devam etmesini engeller ve ikinci bir yanıt gönderilmesinin önüne geçer. Bu ufak ama kritik detay çok işini görecek.
Bir diğer örnek: Asenkron çağrılarla hata
app.get('/async', async (req, res) => {
try {
const data = await someAsyncFunction();
if (!data) {
return res.status(404).send('Veri bulunamadı');
}
res.send(data);
} catch (error) {
res.status(500).send('Sunucu hatası');
}
});
Burada return anahtar kelimesi ile, hata veya veri yoksa yanıt gönderip fonksiyonu hemen bitiriyoruz. Böylece üst üste yanıt gönderimi olmaz.
Özetle;
“Cannot set headers after they are sent to the client” hatası, aynı HTTP yanıtına birden fazla kez header veya içerik göndermeye çalıştığında ortaya çıkar. Bunun önüne geçmek için kod akışını iyi kontrol etmek, özellikle asenkron işlemler ve hata yönetiminde return kullanmak şart.
Umarım bu yazı, bu can sıkıcı hatayı çözmen için sana rehber olur. Unutma, Express dünyasında header’lar bir kere gider, sonrası yok! Kolay gelsin, kodların hep sağlıklı olsun! 🚀