Hata Nedir ve Neden Ortaya Çıkar?
Bu hatanın en yaygın sebeplerinden biri, asenkron kod yazarken bir yanıtı birden fazla defa göndermeye çalışmanızdır. Örneğin, bir route handler’ında hem `res.send()` hem de `res.json()` gibi yöntemleri kullanmaya çalışırsanız, Express.js bir kere yanıtı gönderdikten sonra bir başlık değişikliği yapmak isterken bu hatayı fırlatır.
Hata Örneği: Yanıtı Birden Fazla Kez Göndermek
app.get('/test', (req, res) => {
res.send('İlk Yanıt'); // İlk yanıt gönderildi
res.send('İkinci Yanıt'); // Bu satır hata verecek
});
Bu örnekte, ilk `res.send()` çağrısı yanıtı gönderecektir. Fakat ikinci `res.send()` çağrısı yapılmaya çalışıldığında, Express.js bu hatayı verecektir: "Cannot set headers after they are sent to the client."
Hata Çözümü: Yanıtı Sadece Bir Kez Gönderin
İşte doğru çözüm:
app.get('/test', (req, res) => {
if (someCondition) {
res.send('İlk Yanıt');
} else {
res.send('İkinci Yanıt');
}
});
Burada, `someCondition` koşuluna göre sadece bir yanıt gönderildiği için hata oluşmaz.
Asenkron Kodlarda Dikkat Edilmesi Gerekenler
app.get('/async-test', async (req, res) => {
await someAsyncOperation();
res.send('Veri alındı');
await someOtherAsyncOperation(); // Hata verecek
res.send('İkinci Yanıt'); // Bu satır da hata verecek
});
Asenkron işlemde bir şeyler ters giderse veya birden fazla `res.send()` çağrısı yapılırsa, aynı hatayı alırsınız. Bunu önlemek için, tüm asenkron işlemleri düzgün şekilde sıralamanız gerekecek. Şu şekilde düzeltebilirsiniz:
app.get('/async-test', async (req, res) => {
await someAsyncOperation();
res.send('Veri alındı'); // Yanıt burada gönderiliyor
});
Burada, yanıtı yalnızca asenkron işlem tamamlandıktan sonra bir kere gönderdik.
Hata Çözümünde İpuçları
2. Asenkron İşlemleri Düzgün Yönetmek: `await` veya `.then()` kullanarak asenkron işlemleri sıraladığınızdan emin olun. Bu, yanıtın zamanında ve yalnızca bir kez gönderilmesini sağlar.
3. Hata Durumlarını Ele Alın: Eğer bir hata durumunda yanıt göndermeniz gerekiyorsa, hata mesajı ve yanıtı düzgün bir şekilde yapılandırmak için `res.status(500).send()` gibi yöntemleri kullanabilirsiniz.