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?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (3)
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ı.
Bu tür bir sorunla karşılaştığınızda birkaç farklı nedene bakmanız gerekebilir. İşte sorununuzu çözmek için kontrol etmeniz gereken bazı olası nedenler:
CORS (Cross-Origin Resource Sharing) Ayarları:
- POST isteği yaparken tarayıcılar genellikle aynı kök etki alanına (origin) sahip olmalıdır. Farklı alt alanlara (subdomain) yapılan POST istekleri için CORS ayarlarını kontrol edin.
server.mydomain.com
'daki ExpressJS sunucusunda CORS başlıklarını düzenleyin. ExpressJS uygulamanızdacors
middleware kullanarak bu başlıkları ayarlayabilirsiniz.
Firewall veya Güvenlik Duvarı Ayarları:
- Sunucunuzdaki güvenlik duvarı, POST isteklerini engelliyor olabilir. Hosting sağlayıcınızın cPanel arayüzünden güvenlik duvarı ayarlarını kontrol edin.
Network Sorunları:
- Sunucunuzun network ayarlarını kontrol edin. Özellikle router ayarları ve DNS konfigürasyonlarını gözden geçirin.
HTTP ve HTTPS Sorunları:
- Farklı protokollerle (HTTP ve HTTPS) çalışan sunucular arasında da CORS sorunları yaşanabilir. İsteklerinizi aynı protokolle yapmaya çalışın. Örneğin, her iki sunucunuzu da HTTPS üzerinden çalıştırmayı deneyin.
Timeout Ayarları:
- İstek zaman aşımına (timeout) neden olabilecek sunucu veya istemci tarafındaki timeout ayarlarını kontrol edin.
Header Problemleri:
- POST isteği sırasında gönderilen başlıkları ve veriyi kontrol edin. Yanlış başlık ayarları veya eksik bilgiler, sunucunuzun isteği doğru bir şekilde işleyememesine neden olabilir.
Günlükleri Kontrol Etme:
- Sunucunuzdaki günlükleri (logları) kontrol ederek, isteğin neden zaman aşımına uğradığını veya başarısız olduğunu anlamaya çalışın.
Yukarıdaki kontrollerden sonra sorun hala çözülmezse, daha fazla bilgi edinmek ve sorunu daha iyi tanımlamak için günlükleri (logları) incelemek yararlı olabilir.
Tabii ki, işte CORS sorununu çözmek için ExpressJS uygulamanızda kullanabileceğiniz basit bir CORS yapılandırması:
- Önce, Express uygulamanızın başında
cors
middleware'ini kullanarak CORS ayarlarınızı yapılandırın.npm install cors
komutu ile önce cors middleware'ini yüklemeniz gerekebilir.
const express = require('express');
const cors = require('cors');
const app = express();
// CORS middleware'i ekleyerek tüm kaynaklara erişime izin ver
app.use(cors());
// Diğer middleware ve route tanımlamaları buraya gelecek
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
Yukarıdaki kod, tüm kaynaklardan gelen isteklere izin vererek en geniş CORS konfigürasyonunu sağlar. Daha fazla kontrol istiyorsanız, CORS middleware'inin seçeneklerini belirleyebilirsiniz.
- CORS middleware'inin özelleştirilmiş seçeneklerini kullanarak sadece belirli kaynaklardan gelen isteklere izin verme örneği:
const express = require('express');
const cors = require('cors');
const app = express();
// Sadece belirli kaynaklardan gelen isteklere izin ver
const corsOptions = {
origin: ['http://mydomain.com', 'https://mydomain.com'],
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
credentials: true,
optionsSuccessStatus: 204,
};
app.use(cors(corsOptions));
// Diğer middleware ve route tanımlamaları buraya gelecek
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
Bu örnekte, sadece belirli kökenlere (origin) izin veriliyor ve belirli HTTP metotları destekleniyor. credentials
seçeneği, isteğin kimlik doğrulama bilgilerini içerip içermediğini belirler.
Bu örneklerden birini ExpressJS uygulamanıza uyguladıktan sonra, CORS sorununun çözülüp çözülmediğini kontrol edebilirsiniz.