ReactJS & NodeJS hakkında
React projemin build edilmiş hali mydomain.com adresine yani public_html klasörüne kurulu.
NodeJS ve ExpressJS ile oluşturduğum sunucu ise server.mydomain.com subdomainine kurulu.
Bu mydomain.com alan adı ve server.mydomain.com aynı Web Hosting'te barınıyor. Bu Web Hosting'i ise cPanel ile yönetiyorum.
mydomain.com/login adresinden server.mydomain.com/auth/login adresine POST isteği gönderemiyorum. 408 request timeout dönüyor. Fakat aynı adrese GET isteği gönderebiliyorum ve Postman'dan da POST isteği gönderebiliyorum.
Sorun ne olabilir?
1) Sunucuya Sahte GET İsteği Atmak
Stackoverflow'da 2012 yılından şöyle bir bilgiye rastladım:
Android uygulamam sunucuya POST istekleri gönderdi ve beklendiği gibi çalışıyordu ancak yaklaşık 30 dakika sonra 408 İstek zaman aşımı hataları yaşamaya başladım.
Ayrıca bir PC'den veya Android cihazdan bir tarayıcı açıp ana sayfamı (PHP Wordpress sitesi) açtığımda sorunun ortadan kalktığını fark ettim.
Web sitesi testte olduğundan web trafiği minimum düzeydeydi ve bu davranışı sunucu günlüklerinde oldukça kolay bir şekilde doğrulayabildim.
POST isteğimden önce sahte bir GET isteği yürüterek bu soruna geçici bir çözüm bulmayı başardım ve bu, web sunucusunu 'uyandırdı' ve sonraki tüm POST isteklerine yanıt verdi.
Buna 2015'te gelen bir yanıtta da şu bilgi veriliyor:
Bağlantıları sıfırlayarak müdahale eden bazı trafik izleme aracıları için tüm POST'lar ve otuz dakika boyunca hiçbir GET'in olmaması şüpheli görünüyor.
Trafiğin kötü niyetli olduğunu düşündükleri takdirde her iki uca da sahte sıfırlamalar gönderen ürünler var.
Bu daha sonra bağlantıyı keserek zaman aşımına neden olur.
2016'da da aynı yanıta söyle bir yorum eklenmiş:
Bana öyle geliyor ki, en azından bazı durumlarda bu sorunlar oturum zaman aşımlarından da kaynaklanıyor olabilir.
Oturum yenilemeleri GET istekleri için gerçekleştiriliyor ancak POST istekleri için gerçekleştirilmiyor olabilir; bu da 'uyanma' davranışını açıklayabilir.
Buna göre, siz de arada bir sunucuya sahte GET istekleri atarak sunucuyu 'uyandırmayı' deneyebilirsiniz.
Kaynak: https://stackoverflow.com/questions/1667720/http-408-request-timeout
2) response.end()
Kullanılmamış Olabilir
Postman'dan yanıt alabiliyorsanız sorun bu değildir muhtemelen.
Ama endpoint'inizde veya bir middleware'ınızda response.end()
(veya .send()
gibi bir istek sonlandırıcı sonlandırıcı fonksiyon) komutuna ulaşılmasını önleyen bir koşul oluşuyor olabilir.
Mesela header'ları kontrol ettiğiniz bir aşamada bir return
ifadesi kullanmışsınızdır ve response.end()
komutuna ulaşılmasını önlemişsinizdir veya bir if-else
yapınız response.end()
komutunu atlamanıza neden oluyor olabilir.
Sunucunuza bir console.log()
ekleyip gelen header'ı terminale basın.
Sonra siteden ve Postman'dan ayrı ayrı istek atın ve header'lar arasındaki farklara bakın.
Fark yoksa, bir isteğin geçtiği tüm aşamaları takip edip response.end()
komutunun çalışmadan işlemlerin bittiği bir durum var mı diye inceleyin.
Kaynak: https://stackoverflow.com/questions/22773927/408-timeout-in-nodejs-app-requesting-github-api
3) İstemci, İsteği Yarıda Kesmiş Olabilir
İsteği gönderiyorsunuzdur ama hemen sonra (belki bir state değişimi yüzünden) isteği iptal ediyorsunuzdur.
Aslında yukarıdaki gibi bir sorun ama bu sefer istemci tarafında...
Çözüm olarak yine sunucuya console.log()
atıp gelen isteğin body ve header'larını terminale basın. Sonra postman ve site isteklerinin arasındaki farkları bulmaya çalışın.
Kaynak: https://docs.aws.amazon.com/en_en/elasticloadbalancing/latest/classic/ts-elb-error-message.html#ts-elb-errorcodes-http408
Daha farklı nedenler de olabilir tabi sunucunun zaman aşımı süresini uzatmak gerekiyor olabilir vs. ama sorun orada olsa Postman da yanıt alamazdı.