Hata Mesajı: Ne Demek İstiyor?
Bu hata mesajı, Express.js'in istemciye (client) yanıt (response) gönderdikten sonra başlıkları (headers) değiştirmeye çalıştığında ortaya çıkar. Yani, bir yanıt gönderildikten sonra, aynı yanıt üzerinde yapılan başka bir işlem (başlık eklemek, yönlendirmek, vb.) mümkün değildir. Düşün ki, bir postayı gönderdiğin zaman, o postayı geri alıp içeriğini değiştiremezsin.
Bunun nedeni, HTTP protokolünün, bir yanıtın sadece bir kez gönderilebilmesine izin vermesidir. Eğer başlıkları bir kez gönderdiysen, tekrar değiştiremezsin.
Bu Hata Nasıl Ortaya Çıkar?
Çoğu zaman, bu hatayı yanlışlıkla yaptığın bir işlem tetikler. Mesela, bir yanıt gönderdikten sonra `res.send()` veya `res.json()` gibi fonksiyonları ikinci kez çağırman, başlıkları değiştirmeye çalışmak gibi durumlar bu hatayı doğurur.
Örneğin, aşağıdaki kodda "Cannot set headers after they are sent to the client" hatasını görebiliriz:
app.get('/example', (req, res) => {
res.send('İlk yanıt gönderildi');
// Bu satır hata oluşturur
res.send('İkinci yanıt gönderilemiyor!');
});
İlk `res.send()` fonksiyonu istemciye bir yanıt gönderdiği için, ikinci `res.send()` çağrısı hataya yol açar. Çünkü HTTP yanıtı bir kez gönderildikten sonra, başlıklar ve içerik üzerinde değişiklik yapamazsınız.
Hatanın Çözümü: Ne Yapmalı?
Bu hatayı çözmek için birkaç temel kuralı izlemen gerekecek.
1. Yanıtı Sadece Bir Kez Gönder!
İlk olarak, bir yanıtı bir kez gönderdiğinden emin ol. Birden fazla `res.send()`, `res.json()` ya da `res.redirect()` çağrısı yapmamaya dikkat et. Her birinin yalnızca bir kez çalıştırıldığından emin ol.
app.get('/example', (req, res) => {
res.send('Yanıt gönderildi');
// Başka bir şey yapma
});
2. Asenkron Fonksiyonları Yönet!
Birçok geliştirici asenkron işlemlerle çalışırken bu hatayı alır. Eğer bir işlem tamamlanmadan yanıt göndermeye başlarsan, başlıklar zaten gönderildiği için hata alırsın. Bu tür durumlarda `return` kullanarak yanıtın sadece bir kez gönderilmesini sağlamalısın.
app.get('/example', async (req, res) => {
const data = await fetchData(); // Asenkron işlem
if (!data) {
return res.status(404).send('Veri bulunamadı!');
}
res.send('Veri başarıyla yüklendi');
});
3. Yönlendirme ve Hata Durumlarını Dikkatle Yönet!
Yönlendirme işlemlerinde de başlıklar gönderildikten sonra başka bir işlem yapmamaya dikkat et. Aynı şekilde, hata durumları da dikkatlice ele alınmalı.
app.get('/example', (req, res) => {
if (someCondition) {
return res.redirect('/new-location'); // Yönlendirme
}
res.send('Başka bir yanıt');
});
Sonuç: Bu Hata Nasıl Önlenir?
Eğer bu hatayı alıyorsan, ilk yapman gereken şey, yanıtları sadece bir kez göndermeye özen göstermektir. Asenkron işlemleri düzgün bir şekilde yönettiğinden ve yönlendirme ya da hata durumlarıyla ilgili mantığını doğru kurduğundan emin ol.
Unutma, Express.js ve diğer Node.js uygulamalarında hata yapmamak için her zaman yanıtların mantıklı bir sıralamada gerçekleştiğinden emin olmalısın. İstemciye bir kez yanıt gönderdikten sonra, yanıtı tekrar değiştirmeye çalışman sana sadece hata mesajı kazandırır.
Umarım bu yazı, "Cannot set headers after they are sent to the client" hatasıyla başa çıkmanı kolaylaştırır. Şimdi, bir sonraki projenle ilgili rahatça kod yazmaya odaklanabilirsin!