Hadi, birlikte bu hatayı daha yakından inceleyelim. Belki de bir noktada bu hatayla karşılaştınız ya da karşılaşmak üzeresiniz. Ne yazık ki, Express.js'in başınıza açtığı bu dertten kurtulmak kolay değil. Ama merak etmeyin, bu yazı sonunda “Cannot set headers after they are sent to the client” hatasını çözmek için tüm ipuçlarını öğrenmiş olacaksınız.
Hata Nedir?
Bu hatayı aldığınızda, Express.js aslında şunu söylüyor: "Yahu, ben bu veriyi zaten gönderdim! Şimdi bana ne diye yeni başlıklar ekliyorsun?" Düşünsenize, bir restoranda garsona “Hesap lütfen!” dediniz ve garson size faturayı getirdi. Sonra birden kalkıp, “Aaa, bir şey unuttum!” deyip hesabı tekrar değiştirmeye çalıştınız. Ne olur? Garson size şaşkın şaşkın bakar, öyle değil mi?
Hatanın Sebebi Nedir?
Şimdi, örnek bir kod üzerinden durumu daha iyi anlayalım.
Hata Örneği
app.get('/test', (req, res) => {
res.send('İlk Yanıt'); // İlk yanıtı gönderiyoruz
res.setHeader('X-Custom-Header', 'Header Value'); // Hata! Bu başlık artık ayarlanamaz
});
Bu kodda, `res.send()` ile yanıtı gönderiyoruz ve hemen ardından `res.setHeader()` kullanarak başlık eklemeye çalışıyoruz. Ancak, `res.send()` bir yanıt gönderdikten sonra, başlıkları değiştirmeye çalışmak mümkün değildir. Sonuçta, Express.js bu hatayı verecektir.
Hata Nasıl Çözülür?
Yapmanız gereken ilk şey, başlıkları yanıtı göndermeden önce ayarlamaktır. Başlıkları, `res.send()` ya da `res.json()` gibi fonksiyonları çağırmadan önce ayarlamalısınız.
Düzgün bir çözüm için kodu şu şekilde güncelleyebiliriz:
app.get('/test', (req, res) => {
res.setHeader('X-Custom-Header', 'Header Value'); // Başlıkları gönderimden önce ayarla
res.send('İlk Yanıt'); // Ardından yanıtı gönder
});
Bu şekilde başlıkları önceden ayarlayarak, hatadan kaçınmış oluruz.
2. Yanıtları Bir Defa Gönderin
Bir başka yaygın hata, birden fazla kez yanıt göndermeye çalışmaktır. Örneğin:
app.get('/test', (req, res) => {
res.send('İlk Yanıt'); // İlk yanıtı gönder
res.send('İkinci Yanıt'); // Bu satır hata verir
});
İkinci `res.send()` çağrısı hata verecektir çünkü HTTP yanıtı yalnızca bir kez gönderilebilir. Eğer aynı yanıtı birden fazla göndermeye çalışırsanız, Express.js bu durumu kabul etmez. Yalnızca bir kez yanıt gönderin ve başka bir işlem yapmadan önce yanıtın tamamlandığından emin olun.
3. Asenkron Operasyonları Kontrol Edin
Asenkron işlemler de bu hataya neden olabilir. Eğer bir asenkron işlem başlatıyorsanız ve işlem tamamlanmadan önce bir yanıt gönderirseniz, Express.js başlıkları birden fazla kez ayarlamaya çalışacaktır.
Örnek bir asenkron hata:
app.get('/test', (req, res) => {
setTimeout(() => {
res.send('Asenkron Yanıt');
}, 1000);
res.send('Hızlı Yanıt'); // İlk yanıtı hemen gönderdiğimiz için hata alırız
});
Bu kodda, hızlı bir şekilde ikinci `res.send()` çağrısı yapılıyor, ancak asenkron işlem tamamlanmadığı için Express.js hata verecektir. Çözüm, yanıtları doğru sırayla göndermek ve asenkron işlemi doğru bir şekilde yönetmektir.
Sonuç
Umarım bu yazı, karşılaştığınız bu sinir bozucu hatayı çözmede size yardımcı olmuştur. Bir dahaki sefere bu hatayla karşılaştığınızda, bu yazıyı hatırlayın ve çözümü hızla uygulayın!