Öncelikle, Express.js ile çalışırken, bu hata genellikle iki şeyin yanlış bir şekilde yapılmasından kaynaklanır. Bu iki şey de HTTP başlıklarının (headers) iki kez gönderilmesi ya da yanlış sırayla gönderilmesidir. Ama bu hatanın arkasında ne yatıyor? Gelin, biraz daha derine inelim.
Hata Mesajının Ne Anlama Geldiğini Anlamak
Şimdi, hatayı çözmeden önce sorunun ne olduğunu daha iyi anlayalım:
1. Yanıt Başlıkları Bir Kez Gönderildikten Sonra Değiştirilemez.
Bir HTTP isteği alındığında, Express.js sunucusu, başlıkları ve yanıt gövdesini hazırlar. Ancak bir kez yanıt gönderildikten sonra başlıkları değiştiremezsiniz. Bu, HTTP protokolünün bir kuralıdır.
2. İki Kez Yanıt Göndermek.
Genellikle, `res.send()`, `res.json()`, `res.redirect()` gibi metodlar bir yanıt gönderir. Eğer bunlardan birini iki kez kullanmaya çalışırsanız, başlıklar tekrar gönderilmeye çalışıldığı için bu hatayı alırsınız.
Hata Çözümü İçin Adımlar
# 1. Yanıtı Yalnızca Bir Kez Gönderin
Örnek Hatalı Kod:
app.get('/user', (req, res) => {
if (someCondition) {
res.send('User found');
}
res.send('This will cause an error'); // Hata: ikinci yanıt gönderimi
});
Bu kodda, bir kullanıcıya aynı istekle iki yanıt gönderilmeye çalışılıyor. İlk `res.send()` çalıştığında, yanıt gönderildiği için ikinci `res.send()` hata verecektir.
Düzgün Kod:
app.get('/user', (req, res) => {
if (someCondition) {
res.send('User found');
return; // Burada return ile fonksiyonu sonlandırıyoruz.
}
res.send('User not found');
});
Bu şekilde, her durumda sadece bir kez yanıt gönderilir.
# 2. Asenkron Operasyonları Yönetirken Dikkatli Olun
Örnek Hatalı Kod (Asenkron Hata):
app.get('/user', (req, res) => {
db.getUserById(req.params.id, (err, user) => {
if (err) {
res.send('Error occurred');
}
res.send('User: ' + user.name); // Asenkron işlemlerden sonra yanıt gönderilmeye çalışılıyor
});
});
Yukarıdaki örnekte, veritabanı sorgusu tamamlanmadan önce ikinci `res.send()` çağrılırsa, bu hata meydana gelir.
Düzgün Kod (Asenkron İşlemler):
app.get('/user', (req, res) => {
db.getUserById(req.params.id, (err, user) => {
if (err) {
return res.send('Error occurred');
}
res.send('User: ' + user.name); // Yalnızca bir yanıt gönderiliyor
});
});
Burada `return` kullanarak, bir yanıt gönderildikten sonra fonksiyonu erken sonlandırıyoruz.
# 3. Middleware Kullanımında Dikkat Edin
Örnek Hatalı Middleware Kullanımı:
app.use((req, res, next) => {
res.send('This will be sent');
next(); // next() çağrıldığında başka bir yanıt gönderilebilir
});
Bu durumda, `next()` çağrıldığı için başka bir yanıt gönderilecektir.
Düzgün Middleware Kullanımı:
app.use((req, res, next) => {
res.send('This will be sent');
// next() çağrılmıyor çünkü yanıt zaten gönderildi
});
Sonuç
Başlangıçta kafa karıştırıcı olabilir, ancak bu hatayı çözdüğünüzde, Express.js ile daha sağlıklı ve stabil bir uygulama geliştirebilirsiniz. Umarım yazdığım bu yazı size yardımcı olur ve Express.js ile geliştirme süreciniz daha keyifli hale gelir!