{"id":30888,"date":"2025-10-03T04:01:44","date_gmt":"2025-10-03T01:01:44","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/"},"modified":"2025-10-03T04:01:44","modified_gmt":"2025-10-03T01:01:44","slug":"express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/","title":{"rendered":"Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>Modern web uygulamalar\u0131 geli\u015ftirmek isteyenler i\u00e7in Express ve TypeScript ikilisi, g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir backend \u00e7\u00f6z\u00fcmleri sunar. Bu ad\u0131m ad\u0131m rehber, tip g\u00fcvenli bir Express sunucusunu s\u0131f\u0131rdan nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye kadar t\u00fcm detaylar\u0131yla \u00f6\u011fretecek. Hatalar\u0131 minimuma indirirken geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffedin.<\/p>\n<h2>Giri\u015f: Neden Express ve TypeScript \u0130kilisini Tercih Etmelisiniz?<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i yaz\u0131l\u0131m d\u00fcnyas\u0131nda, h\u0131zl\u0131, g\u00fcvenilir ve s\u00fcrd\u00fcr\u00fclebilir uygulamalar geli\u015ftirmek, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. JavaScript, web geli\u015ftirmede tart\u0131\u015fmas\u0131z bir hakimiyete sahip olsa da, b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde veya kalabal\u0131k ekiplerle \u00e7al\u0131\u015f\u0131rken baz\u0131 zorluklar ortaya \u00e7\u0131karabilir. Dinamik tip yap\u0131s\u0131, beklenmedik hatalara ve kodun okunabilirli\u011finin azalmas\u0131na neden olabilir. \u0130\u015fte tam bu noktada TypeScript ve Express kombinasyonu devreye girer ve geli\u015ftiricilere adeta bir nefes ald\u0131r\u0131r.<\/p>\n<p>Express.js, Node.js ekosisteminin en pop\u00fcler ve minimalist web \u00e7at\u0131lar\u0131ndan biridir. H\u0131zla API&#8217;ler ve web uygulamalar\u0131 olu\u015fturmak i\u00e7in esnek bir temel sunar. Geni\u015f middleware deste\u011fi ve basit y\u00f6nlendirme mekanizmalar\u0131 sayesinde geli\u015ftiricilerin karma\u015f\u0131k sorunlara odaklanmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Ancak Express, varsay\u0131lan olarak JavaScript ile \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in yukar\u0131da bahsedilen tip g\u00fcvenli\u011fi eksikli\u011fini ta\u015f\u0131r. Bu da \u00f6zellikle b\u00fcy\u00fcyen projelerde, fonksiyonlar\u0131n bekledi\u011fi parametre tipleri, d\u00f6nen de\u011ferler veya nesne yap\u0131lar\u0131 konusunda belirsizliklere yol a\u00e7abilir, bu da hatalar\u0131n fark edilmesini zorla\u015ft\u0131r\u0131r ve hata ay\u0131klama s\u00fcrecini uzat\u0131r.<\/p>\n<p>TypeScript ise, Microsoft taraf\u0131ndan geli\u015ftirilen ve JavaScript&#8217;in t\u00fcm \u00f6zelliklerini bar\u0131nd\u0131ran, \u00fczerine statik tip denetimi ekleyen bir s\u00fcper k\u00fcmesidir. Yani, yazd\u0131\u011f\u0131n\u0131z TypeScript kodu en nihayetinde taray\u0131c\u0131lar\u0131n veya Node.js&#8217;in anlayaca\u011f\u0131 d\u00fcz JavaScript koduna derlenir. Ancak bu derleme \u00f6ncesinde, TypeScript derleyicisi kodunuzdaki potansiyel tip hatalar\u0131n\u0131 yakalar. Bu sayede, uygulaman\u0131z\u0131 daha \u00e7al\u0131\u015ft\u0131rmadan bir\u00e7ok hatay\u0131 tespit edebilir ve giderebilirsiniz. Tip g\u00fcvenli\u011fi, \u00f6zellikle b\u00fcy\u00fck projelerde ekip \u00fcyelerinin birbirlerinin kodunu daha kolay anlamas\u0131na, entegrasyon hatalar\u0131n\u0131n azalmas\u0131na ve refaktoring i\u015flemlerinin daha g\u00fcvenli yap\u0131lmas\u0131na olanak tan\u0131r. Bir metodun hangi tipte arg\u00fcmanlar ald\u0131\u011f\u0131n\u0131 veya hangi tipte bir de\u011fer d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc a\u00e7\u0131k\u00e7a belirtmek, kodun adeta kendi kendini dok\u00fcmante etmesini sa\u011flar.<\/p>\n<p>Express ve TypeScript&#8217;i bir araya getirmek, her iki d\u00fcnyan\u0131n en iyi \u00f6zelliklerini kullanmak anlam\u0131na gelir: Express&#8217;in hafifli\u011fi ve esnekli\u011fi ile TypeScript&#8217;in tip g\u00fcvenli\u011fi ve geli\u015ftirici ara\u00e7lar\u0131 deste\u011fi. Bu kombinasyon, \u00f6zellikle kurumsal d\u00fczeydeki projelerde, API geli\u015ftirme s\u00fcre\u00e7lerinde ve mikroservis mimarilerinde s\u0131k\u00e7a tercih edilir. Geli\u015ftirici verimlili\u011fini art\u0131r\u0131r, kod kalitesini y\u00fckseltir ve uygulamalar\u0131n\u0131z\u0131n daha \u00f6l\u00e7eklenebilir olmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, VS Code gibi modern IDE&#8217;ler, TypeScript ile m\u00fckemmel bir entegrasyon sunarak ak\u0131ll\u0131 kod tamamlama, an\u0131nda hata tespiti ve kolay navigasyon gibi \u00f6zelliklerle geli\u015ftirme deneyimini \u00fcst seviyeye ta\u015f\u0131r.<\/p>\n<div class=\"case-study\">\n<h3>Vaka Analizi: B\u00fcy\u00fck Bir E-ticaret Platformunun TypeScript&#8217;e Ge\u00e7i\u015fi<\/h3>\n<p>Yak\u0131n zamanda X e-ticaret platformu, b\u00fcy\u00fcyen kod taban\u0131 ve geni\u015fleyen geli\u015ftirici ekibiyle birlikte, JavaScript tabanl\u0131 backend&#8217;inde artan hata oranlar\u0131 ve yava\u015flayan geli\u015ftirme s\u00fcre\u00e7leriyle m\u00fccadele ediyordu. \u00d6zellikle farkl\u0131 mod\u00fcller aras\u0131ndaki entegrasyonlarda ve yeni \u00f6zellik geli\u015ftirmelerinde, tip uyu\u015fmazl\u0131klar\u0131ndan kaynaklanan hatalar s\u0131k\u00e7a ya\u015fan\u0131yordu. Platformun m\u00fchendislik liderli\u011fi, bu sorunlar\u0131 a\u015fmak ve kod kalitesini art\u0131rmak amac\u0131yla backend&#8217;lerini a\u015famal\u0131 olarak TypeScript&#8217;e ta\u015f\u0131ma karar\u0131 ald\u0131. Ge\u00e7i\u015f s\u00fcrecinde, mevcut JavaScript kodlar\u0131 par\u00e7a par\u00e7a TypeScript&#8217;e d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc ve yeni geli\u015ftirilen t\u00fcm servisler do\u011frudan TypeScript ile yaz\u0131ld\u0131. Bu strateji sayesinde, ge\u00e7i\u015fin ilk aylar\u0131nda bile hata raporlar\u0131nda %30&#8217;luk bir d\u00fc\u015f\u00fc\u015f g\u00f6zlemlendi. Ayr\u0131ca, tip denetiminin sa\u011flad\u0131\u011f\u0131 otokomple ve IntelliSense \u00f6zellikleri sayesinde, geli\u015ftiricilerin yeni mod\u00fcllere adaptasyon s\u00fcresi k\u0131sald\u0131 ve kod yazma h\u0131z\u0131 %15 artt\u0131. Projenin genel s\u00fcrd\u00fcr\u00fclebilirli\u011fi ve \u00f6l\u00e7eklenebilirli\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015firken, ekip \u00fcyeleri aras\u0131ndaki i\u015f birli\u011fi de daha sorunsuz hale geldi. Bu vaka, TypeScript&#8217;in b\u00fcy\u00fck ve karma\u015f\u0131k sistemlerde nas\u0131l bir de\u011fer yaratt\u0131\u011f\u0131n\u0131n somut bir \u00f6rne\u011fidir.<\/p>\n<\/p><\/div>\n<h2>Temel Kavramlar: Express, TypeScript ve Node.js Nedir?<\/h2>\n<p>Bir Express TypeScript sunucusu kurmaya ba\u015flamadan \u00f6nce, bu ekosistemi olu\u015fturan temel ta\u015flar\u0131 anlamak \u00f6nemlidir. Bu \u00fc\u00e7 ana bile\u015fen, modern backend geli\u015ftirmenin yap\u0131 ta\u015flar\u0131n\u0131 olu\u015fturur ve her birinin kendine \u00f6zg\u00fc bir rol\u00fc vard\u0131r. Node.js, JavaScript&#8217;i sunucu taraf\u0131nda \u00e7al\u0131\u015ft\u0131rmam\u0131z\u0131 sa\u011flayan bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Google Chrome&#8217;un V8 JavaScript motoru \u00fczerine in\u015fa edilmi\u015ftir ve bu sayede JavaScript&#8217;in taray\u0131c\u0131 d\u0131\u015f\u0131ndaki ortamlarda da \u00e7al\u0131\u015fabilmesine imkan tan\u0131r. Node.js, \u00f6zellikle I\/O yo\u011fun uygulamalar i\u00e7in tasarlanm\u0131\u015ft\u0131r; yani dosya i\u015flemleri, veritaban\u0131 ba\u011flant\u0131lar\u0131 veya a\u011f istekleri gibi i\u015flemler s\u0131ras\u0131nda bloklama yapmadan \u00e7al\u0131\u015fabilir. Bu, onu ger\u00e7ek zamanl\u0131 uygulamalar, sohbet sunucular\u0131 veya API&#8217;ler i\u00e7in ideal bir se\u00e7im haline getirir. Node.js&#8217;in asenkron ve olay tabanl\u0131 mimarisi, y\u00fcksek performansl\u0131 ve \u00f6l\u00e7eklenebilir sunucular olu\u015fturman\u0131n anahtar\u0131d\u0131r.<\/p>\n<p>Express.js ise Node.js i\u00e7in yaz\u0131lm\u0131\u015f, hafif ve esnek bir web uygulama \u00e7at\u0131s\u0131d\u0131r. Node.js&#8217;in sundu\u011fu d\u00fc\u015f\u00fck seviyeli HTTP mod\u00fcl\u00fcn\u00fcn karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 soyutlayarak, web uygulamas\u0131 veya API geli\u015ftirmeyi \u00e7ok daha kolay hale getirir. Y\u00f6nlendirme (routing), middleware deste\u011fi, \u015fablon motoru entegrasyonu gibi temel \u00f6zellikleri sunar. &#8220;Minimalist&#8221; olarak tan\u0131mlanmas\u0131n\u0131n sebebi, sadece temel \u00f6zelliklere odaklanmas\u0131 ve geli\u015ftiricilere diledikleri ek mod\u00fclleri (veritaban\u0131 s\u00fcr\u00fcc\u00fcleri, kimlik do\u011frulama k\u00fct\u00fcphaneleri vb.) entegre etme \u00f6zg\u00fcrl\u00fc\u011f\u00fc sunmas\u0131d\u0131r. Bu esneklik, Express&#8217;i farkl\u0131 proje ihtiya\u00e7lar\u0131na g\u00f6re kolayca uyarlanabilir k\u0131lar. \u00c7o\u011fu RESTful API ve mikroservis mimarisi, temelini Express.js \u00fczerine kurar \u00e7\u00fcnk\u00fc h\u0131zl\u0131 prototipleme ve \u00fcretim ortam\u0131nda g\u00fcvenilir performans sunar.<\/p>\n<p>TypeScript ise, JavaScript&#8217;in tip eklenmi\u015f bir s\u00fcper k\u00fcmesidir. Bu ne anlama geliyor? Temelde, yazd\u0131\u011f\u0131n\u0131z t\u00fcm ge\u00e7erli JavaScript kodlar\u0131 ayn\u0131 zamanda ge\u00e7erli TypeScript kodlar\u0131d\u0131r. Ancak TypeScript, JavaScript&#8217;e iste\u011fe ba\u011fl\u0131 statik tipler (\u00f6rne\u011fin <code>string<\/code>, <code>number<\/code>, <code>boolean<\/code>, <code>interface<\/code>, <code>type<\/code>) eklemenize olanak tan\u0131r. Bu tipler, kodunuzu yazarken de\u011fi\u015fkenlerin, fonksiyon parametrelerinin ve d\u00f6n\u00fc\u015f de\u011ferlerinin t\u00fcr\u00fcn\u00fc belirtmenizi sa\u011flar. TypeScript derleyicisi (<code>tsc<\/code>), kodunuzu derlemeden \u00f6nce bu tipleri kontrol eder ve bir hata durumunda sizi uyar\u0131r. Bu kontrol, runtime (\u00e7al\u0131\u015fma zaman\u0131) hatalar\u0131n\u0131 compile-time (derleme zaman\u0131) hatalar\u0131na d\u00f6n\u00fc\u015ft\u00fcrerek, uygulamalar\u0131n daha kararl\u0131 olmas\u0131na yard\u0131mc\u0131 olur. Ayr\u0131ca, modern IDE&#8217;ler (\u00f6rne\u011fin VS Code) TypeScript ile derinlemesine entegre olarak, kod tamamlama, hata analizi, yeniden d\u00fczenleme (refactoring) ve kod \u00fczerinde gezinme gibi \u00f6zellikleri \u00f6nemli \u00f6l\u00e7\u00fcde geli\u015ftirir. Bu da \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k kod tabanlar\u0131nda geli\u015ftirici verimlili\u011fini art\u0131r\u0131r.<\/p>\n<p>Bu \u00fc\u00e7l\u00fcn\u00fcn uyumu ise \u015f\u00f6yledir: Node.js, JavaScript kodunuzu sunucuda \u00e7al\u0131\u015ft\u0131rmak i\u00e7in ortam\u0131 sa\u011flar. Express.js, bu ortam \u00fczerinde web uygulamalar\u0131 ve API&#8217;ler olu\u015fturmak i\u00e7in basit ve g\u00fc\u00e7l\u00fc bir \u00e7er\u00e7eve sunar. TypeScript ise, Express uygulamalar\u0131n\u0131z\u0131 geli\u015ftirirken tip g\u00fcvenli\u011fi ve geli\u015fmi\u015f geli\u015ftirici deneyimi ekleyerek, hem kod kalitesini hem de bak\u0131m kolayl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. Geli\u015ftirme s\u0131ras\u0131nda TypeScript&#8217;in statik tip denetimi sayesinde daha az hata yaparken, \u00fcretim ortam\u0131na derlenmi\u015f saf JavaScript kodunuz Node.js \u00fczerinde y\u00fcksek performansla \u00e7al\u0131\u015f\u0131r. Bu sinerji, modern, g\u00fcvenilir ve s\u00fcrd\u00fcr\u00fclebilir backend sistemleri olu\u015fturmak i\u00e7in ideal bir kombinasyon sunar.<\/p>\n<h2>Ad\u0131m Ad\u0131m Kurulum: Express TypeScript Projesi Nas\u0131l Ba\u015flat\u0131l\u0131r?<\/h2>\n<p>Art\u0131k temel kavramlara a\u015fina oldu\u011funuza g\u00f6re, kendi Express TypeScript sunucumuzu kurmaya ba\u015flayabiliriz. Bu b\u00f6l\u00fcmde, projenizi s\u0131f\u0131rdan ba\u015flatmak i\u00e7in gerekli t\u00fcm ad\u0131mlar\u0131 detayl\u0131 bir \u015fekilde ele alaca\u011f\u0131z. Ba\u015flamadan \u00f6nce bilgisayar\u0131n\u0131zda Node.js ve npm (Node Package Manager) veya Yarn kurulu oldu\u011fundan emin olun. Genellikle Node.js kurulumu ile npm de otomatik olarak gelir.<\/p>\n<ol>\n<li>\n      <strong>Yeni Bir Proje Dizini Olu\u015fturma:<\/strong><\/p>\n<p>\u00d6ncelikle projeniz i\u00e7in temiz bir klas\u00f6r olu\u015ftural\u0131m ve i\u00e7ine girelim. Bu klas\u00f6r, t\u00fcm kod dosyalar\u0131n\u0131z\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 bar\u0131nd\u0131racak.<\/p>\n<pre><code>\n        mkdir express-ts-server\n        cd express-ts-server\n      <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n      <strong><code>package.json<\/code> Dosyas\u0131n\u0131 Ba\u015flatma:<\/strong><\/p>\n<p>Projemizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ve betiklerini y\u00f6netmek i\u00e7in bir <code>package.json<\/code> dosyas\u0131na ihtiyac\u0131m\u0131z var. Bu komut, size birka\u00e7 soru soracak ve ard\u0131ndan dosyay\u0131 olu\u015fturacakt\u0131r. Varsay\u0131lan de\u011ferleri kabul edebilirsiniz.<\/p>\n<pre><code>\n        npm init -y\n        # veya yarn kullan\u0131yorsan\u0131z:\n        # yarn init -y\n      <\/pre>\n<p><\/code><\/p>\n<p> <code>-y<\/code> bayra\u011f\u0131, t\u00fcm sorulara varsay\u0131lan yan\u0131tlar vermenizi sa\u011flar.<\/p>\n<\/li>\n<li>\n      <strong>Express ve TypeScript Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 Ekleme:<\/strong><\/p>\n<p>\u015eimdi projemizin ana ba\u011f\u0131ml\u0131l\u0131klar\u0131 olan Express'i ve TypeScript'i kurmal\u0131y\u0131z. Ayr\u0131ca, Express i\u00e7in TypeScript tip tan\u0131mlar\u0131na da ihtiyac\u0131m\u0131z var. Tip tan\u0131mlar\u0131, TypeScript'in Express k\u00fct\u00fcphanesini do\u011fru \u015fekilde anlamas\u0131n\u0131 ve tip denetimi yapmas\u0131n\u0131 sa\u011flar. Bunlar genellikle <code>@types\/<\/code> \u00f6nekiyle gelir ve geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olarak kurulur.<\/p>\n<pre><code>\n        npm install express\n        npm install --save-dev typescript @types\/express @types\/node\n        # veya yarn kullan\u0131yorsan\u0131z:\n        # yarn add express\n        # yarn add -D typescript @types\/express @types\/node\n      <\/pre>\n<p><\/code><\/p>\n<p>Burada <code>express<\/code> \u00e7al\u0131\u015fma zaman\u0131 (runtime) ba\u011f\u0131ml\u0131l\u0131\u011f\u0131d\u0131r. <code>typescript<\/code>, <code>@types\/express<\/code> ve <code>@types\/node<\/code> ise sadece geli\u015ftirme s\u0131ras\u0131nda ihtiya\u00e7 duyulan <code>devDependencies<\/code>'tir.<\/p>\n<\/li>\n<li>\n      <strong>TypeScript Yap\u0131land\u0131rmas\u0131 (<code>tsconfig.json<\/code>):<\/strong><\/p>\n<p>TypeScript derleyicisinin projemizi nas\u0131l derleyece\u011fini belirtmek i\u00e7in bir <code>tsconfig.json<\/code> dosyas\u0131na ihtiyac\u0131m\u0131z var. Bu dosya, TypeScript'in derleme se\u00e7eneklerini i\u00e7erir (\u00f6rne\u011fin, hedef JavaScript s\u00fcr\u00fcm\u00fc, mod\u00fcl sistemi, \u00e7\u0131kt\u0131 dizini vb.).<\/p>\n<pre><code>\n        npx tsc --init\n      <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, ge\u00e7erli dizinde temel bir <code>tsconfig.json<\/code> dosyas\u0131 olu\u015fturacakt\u0131r. Olu\u015fturulan dosyay\u0131 a\u00e7\u0131p baz\u0131 \u00f6nemli ayarlar\u0131 d\u00fczenlememiz gerekiyor:<\/p>\n<pre><code class=\"language-json\">\n        {\n          \"compilerOptions\": {\n            \"target\": \"es6\",                          \/* Hedef JavaScript s\u00fcr\u00fcm\u00fc *\/\n            \"module\": \"commonjs\",                     \/* Mod\u00fcl sistemi *\/\n            \"outDir\": \".\/dist\",                       \/* Derlenmi\u015f JS dosyalar\u0131n\u0131n \u00e7\u0131kt\u0131 dizini *\/\n            \"rootDir\": \".\/src\",                       \/* TypeScript kaynak dosyalar\u0131n\u0131n k\u00f6k dizini *\/\n            \"strict\": true,                           \/* T\u00fcm kat\u0131 tip denetim se\u00e7eneklerini etkinle\u015ftir *\/\n            \"esModuleInterop\": true,                  \/* Varsay\u0131lan importlar\u0131 d\u00fczg\u00fcn \u00e7al\u0131\u015ft\u0131r *\/\n            \"skipLibCheck\": true,                     \/* K\u00fct\u00fcphanelerin tip kontrol\u00fcn\u00fc atla *\/\n            \"forceConsistentCasingInFileNames\": true  \/* Dosya adlar\u0131nda tutarl\u0131 b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf kullan\u0131m\u0131n\u0131 zorunlu k\u0131l *\/\n          },\n          \"include\": [\"src\/**\/*.ts\"],                  \/* Derlenecek TypeScript dosyalar\u0131n\u0131 belirtir *\/\n          \"exclude\": [\"node_modules\"]                  \/* Derleme d\u0131\u015f\u0131nda b\u0131rak\u0131lacak dosyalar\u0131 belirtir *\/\n        }\n      <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki ayarlar, modern bir Node.js uygulamas\u0131nda en iyi uygulamalar\u0131 yans\u0131t\u0131r. <code>target: \"es6\"<\/code> modern JavaScript \u00f6zelliklerini kullanmam\u0131z\u0131 sa\u011flarken, <code>outDir: \".\/dist\"<\/code> derlenmi\u015f kodumuzun <code>dist<\/code> klas\u00f6r\u00fcne gitmesini sa\u011flar. <code>rootDir: \".\/src\"<\/code> ise TypeScript kaynak kodumuzun <code>src<\/code> klas\u00f6r\u00fcnde oldu\u011funu belirtir.<\/p>\n<\/li>\n<li>\n      <strong>Geli\u015ftirme Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 Ekleme (<code>nodemon<\/code>, <code>ts-node<\/code>):<\/strong><\/p>\n<p>Geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131rmak i\u00e7in iki ek araca ihtiyac\u0131m\u0131z olacak:<\/p>\n<ul>\n<li><strong><code>nodemon<\/code>:<\/strong> Kaynak kodunuzda de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda Node.js uygulamas\u0131n\u0131 otomatik olarak yeniden ba\u015flat\u0131r. Bu, manuel yeniden ba\u015flatma zahmetini ortadan kald\u0131r\u0131r.<\/li>\n<li><strong><code>ts-node<\/code>:<\/strong> TypeScript dosyalar\u0131n\u0131 do\u011frudan Node.js ile \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flar, b\u00f6ylece her de\u011fi\u015fiklikte manuel derleme yapman\u0131za gerek kalmaz. Bu, geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/li>\n<\/ul>\n<pre><code>\n        npm install --save-dev nodemon ts-node\n        # veya yarn kullan\u0131yorsan\u0131z:\n        # yarn add -D nodemon ts-node\n      <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n      <strong><code>package.json<\/code> \u0130\u00e7indeki Betikleri G\u00fcncelleme:<\/strong><\/p>\n<p>\u015eimdi <code>package.json<\/code> dosyam\u0131za baz\u0131 betikler (scripts) ekleyerek, sunucumuzu kolayca ba\u015flatabilir ve derleyebiliriz. <code>start<\/code> beti\u011fi uygulaman\u0131n \u00fcretimde nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131n\u0131, <code>dev<\/code> beti\u011fi ise geli\u015ftirme s\u0131ras\u0131nda nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131n\u0131 tan\u0131mlar.<\/p>\n<pre><code class=\"language-json\">\n        {\n          \"name\": \"express-ts-server\",\n          \"version\": \"1.0.0\",\n          \"description\": \"\",\n          \"main\": \"dist\/index.js\",\n          \"scripts\": {\n            \"build\": \"npx tsc\",\n            \"dev\": \"nodemon --exec ts-node src\/index.ts\",\n            \"start\": \"node dist\/index.js\"\n          },\n          \"keywords\": [],\n          \"author\": \"\",\n          \"license\": \"ISC\",\n          \"dependencies\": {\n            \"express\": \"^4.18.2\"\n          },\n          \"devDependencies\": {\n            \"@types\/express\": \"^4.17.17\",\n            \"@types\/node\": \"^20.5.9\",\n            \"nodemon\": \"^3.0.1\",\n            \"ts-node\": \"^10.9.1\",\n            \"typescript\": \"^5.2.2\"\n          }\n        }\n      <\/pre>\n<p><\/code><\/p>\n<p>Art\u0131k temel kurulum tamamland\u0131! <code>src<\/code> dizinimizi olu\u015fturup ilk Express TypeScript uygulamas\u0131n\u0131 yazmaya ba\u015flayabiliriz.<\/p>\n<\/li>\n<\/ol>\n<div class=\"expert-tip\">\n<h3>Uzman \u0130pucu: Otomatik Yeniden Y\u00fckleme ile Geli\u015ftirme Ak\u0131\u015f\u0131n\u0131z\u0131 H\u0131zland\u0131r\u0131n<\/h3>\n<p>Geli\u015ftirme s\u00fcrecinde her kod de\u011fi\u015fikli\u011finden sonra sunucuyu manuel olarak durdurup ba\u015flatmak zaman kayb\u0131d\u0131r. <code>nodemon<\/code> ve <code>ts-node<\/code> ikilisi sayesinde, <code>package.json<\/code> dosyas\u0131ndaki <code>\"dev\": \"nodemon --exec ts-node src\/index.ts\"<\/code> beti\u011fi, <code>src<\/code> klas\u00f6r\u00fcndeki TypeScript dosyalar\u0131n\u0131zda bir de\u011fi\u015fiklik alg\u0131lad\u0131\u011f\u0131nda uygulaman\u0131z\u0131 otomatik olarak yeniden derleyip ba\u015flat\u0131r. Bu sayede taray\u0131c\u0131n\u0131zda an\u0131nda g\u00fcncellemeleri g\u00f6rebilir, geli\u015ftirme ak\u0131\u015f\u0131n\u0131z\u0131 kesintisiz s\u00fcrd\u00fcrebilirsiniz. B\u00fcy\u00fck projelerde bu k\u00fc\u00e7\u00fck otomasyon, geli\u015ftirici verimlili\u011fini %20-30 oran\u0131nda art\u0131rabilir.<\/p>\n<\/p><\/div>\n<div class=\"mobile-css-example\">\n<h3>Mobil Uyumlu HTML i\u00e7in Bir \u00d6rnek (\u0130lgili CSS ile):<\/h3>\n<p>Web siteleri ve uygulamalar g\u00fcn\u00fcm\u00fczde farkl\u0131 ekran boyutlar\u0131na uyum sa\u011flamal\u0131d\u0131r. \u0130\u015fte basit bir media query \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-css\">\n      \/* Genel stiller *\/\n      body {\n        font-family: Arial, sans-serif;\n        margin: 0;\n        padding: 20px;\n        background-color: #f4f4f4;\n      }\n\n      .container {\n        width: 90%;\n        max-width: 1200px;\n        margin: 0 auto;\n        padding: 20px;\n        background-color: #fff;\n        box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n      }\n\n      \/* K\u00fc\u00e7\u00fck ekranlar i\u00e7in (\u00f6rne\u011fin mobil cihazlar) *\/\n      @media (max-width: 768px) {\n        .container {\n          width: 95%;\n          padding: 15px;\n        }\n\n        h2 {\n          font-size: 1.5em;\n        }\n\n        p {\n          font-size: 0.9em;\n        }\n      }\n\n      \/* Daha k\u00fc\u00e7\u00fck ekranlar i\u00e7in *\/\n      @media (max-width: 480px) {\n        body {\n          padding: 10px;\n        }\n\n        .container {\n          width: 100%;\n          padding: 10px;\n          border-radius: 0;\n        }\n\n        h2 {\n          font-size: 1.2em;\n        }\n      }\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu CSS kodlar\u0131, farkl\u0131 ekran boyutlar\u0131na g\u00f6re <code>.container<\/code> elementinin geni\u015fli\u011fini ve i\u00e7 dolgusunu ayarlayarak mobil uyumluluk sa\u011flar. Bu, kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/p>\n<\/p><\/div>\n<h3>\u0130lk TypeScript Express Uygulaman\u0131z\u0131 Olu\u015fturma<\/h3>\n<p>\u015eimdi projemizi canl\u0131ya ge\u00e7irecek olan kod k\u0131sm\u0131na ge\u00e7elim. <code>src<\/code> dizinini olu\u015ftural\u0131m ve i\u00e7erisine <code>index.ts<\/code> dosyas\u0131n\u0131 ekleyelim.<\/p>\n<pre><code>\n    mkdir src\n    touch src\/index.ts\n  <\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan <code>src\/index.ts<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki temel Express sunucu kodunu yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-typescript\">\n    import express, { Request, Response } from 'express';\n\n    const app = express();\n    const port = process.env.PORT || 3000;\n\n    \/\/ JSON body parsing middleware\n    app.use(express.json());\n\n    \/\/ Ana sayfa rotas\u0131\n    app.get('\/', (req: Request, res: Response) => {\n      res.send('Merhaba D\u00fcnya! Express TypeScript Sunucusu \u00c7al\u0131\u015f\u0131yor!');\n    });\n\n    \/\/ \u00d6rnek bir API rotas\u0131\n    app.get('\/api\/users', (req: Request, res: Response) => {\n      const users = [\n        { id: 1, name: 'Alice' },\n        { id: 2, name: 'Bob' },\n      ];\n      res.json(users);\n    });\n\n    \/\/ Sunucuyu belirtilen portta ba\u015flat\n    app.listen(port, () => {\n      console.log(<code>Sunucu http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n    });\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, temel bir Express sunucusunun nas\u0131l yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6sterir:<\/p>\n<ul>\n<li><code>import express, { Request, Response } from &#039;express&#039;;<\/code> sat\u0131r\u0131, Express k\u00fct\u00fcphanesini ve tip tan\u0131mlar\u0131n\u0131 i\u00e7eri aktar\u0131r. <code>Request<\/code> ve <code>Response<\/code> tipleri, gelen istekleri ve g\u00f6nderilecek yan\u0131tlar\u0131 tip g\u00fcvenli bir \u015fekilde y\u00f6netmemizi sa\u011flar.<\/li>\n<li><code>const app = express();<\/code> ile bir Express uygulamas\u0131 \u00f6rne\u011fi olu\u015fturulur.<\/li>\n<li><code>const port = process.env.PORT || 3000;<\/code> sunucunun dinleyece\u011fi portu belirler. Ortam de\u011fi\u015fkenlerinden <code>PORT<\/code> de\u011ferini almazsa, varsay\u0131lan olarak 3000 portunu kullan\u0131r. Bu, \u00fcretim ortam\u0131nda farkl\u0131 bir port kullanmak istedi\u011finizde esneklik sa\u011flar.<\/li>\n<li><code>app.use(express.json());<\/code> bir middleware'dir. Gelen HTTP isteklerinin g\u00f6vdesindeki JSON verilerini ayr\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r. Bu sayede <code>req.body<\/code>'ye eri\u015febilirsiniz.<\/li>\n<li><code>app.get(&#039;\/&#039;, ...)<\/code> ve <code>app.get(&#039;\/api\/users&#039;, ...)<\/code> gibi sat\u0131rlar, farkl\u0131 URL yollar\u0131 i\u00e7in HTTP GET isteklerini nas\u0131l y\u00f6netece\u011fimizi tan\u0131mlayan rota i\u015fleyicileridir. Ana sayfaya yap\u0131lan istekler \"Merhaba D\u00fcnya!\" metniyle yan\u0131tlan\u0131rken, <code>\/api\/users<\/code> rotas\u0131na yap\u0131lan istekler bir kullan\u0131c\u0131 listesi d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>app.listen(port, () => {...});<\/code> sunucuyu ba\u015flat\u0131r ve belirtilen portu dinlemesini sa\u011flar. Sunucu ba\u015far\u0131yla ba\u015flad\u0131\u011f\u0131nda bir konsol mesaj\u0131 g\u00f6sterilir.<\/li>\n<\/ul>\n<p>\u015eimdi projenizi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalinizde a\u015fa\u011f\u0131daki komutu kullan\u0131n:<\/p>\n<pre><code>\n    npm run dev\n    # veya yarn kullan\u0131yorsan\u0131z:\n    # yarn dev\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>nodemon<\/code> ve <code>ts-node<\/code> kullanarak sunucunuzu ba\u015flatacakt\u0131r. Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:3000<\/code> adresine giderek \"Merhaba D\u00fcnya!\" mesaj\u0131n\u0131 g\u00f6rmelisiniz. <code>http:\/\/localhost:3000\/api\/users<\/code> adresine gitti\u011finizde ise JSON format\u0131nda kullan\u0131c\u0131 listesini almal\u0131s\u0131n\u0131z. \u015eimdi <code>src\/index.ts<\/code> dosyas\u0131nda k\u00fc\u00e7\u00fck bir de\u011fi\u015fiklik yap\u0131p kaydedin; <code>nodemon<\/code> sunucuyu otomatik olarak yeniden ba\u015flatacakt\u0131r. B\u00f6ylece h\u0131zl\u0131 ve verimli bir geli\u015ftirme d\u00f6ng\u00fcs\u00fc elde etmi\u015f olursunuz.<\/p>\n<h2>Proje Yap\u0131s\u0131 ve Geli\u015ftirme Best Practice'leri<\/h2>\n<p>B\u00fcy\u00fck ve karma\u015f\u0131k bir Express TypeScript projesinde d\u00fczenli bir yap\u0131ya sahip olmak, projenin okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve \u00f6l\u00e7eklenebilirli\u011fini do\u011frudan etkiler. Da\u011f\u0131n\u0131k bir kod taban\u0131, yeni geli\u015ftiricilerin projeye adapte olmas\u0131n\u0131 zorla\u015ft\u0131r\u0131r, hata ay\u0131klama s\u00fcre\u00e7lerini uzat\u0131r ve yeni \u00f6zellik ekleme maliyetini art\u0131r\u0131r. Bu b\u00f6l\u00fcmde, \u00f6nerilen bir proje yap\u0131s\u0131 ve TypeScript Express uygulamalar\u0131n\u0131z\u0131 geli\u015ftirirken uygulayabilece\u011finiz baz\u0131 en iyi uygulamalar\u0131 inceleyece\u011fiz.<\/p>\n<p><strong>\u00d6nerilen Dizin Yap\u0131s\u0131:<\/strong><\/p>\n<p>Tipik bir Express TypeScript projesi i\u00e7in a\u015fa\u011f\u0131daki dizin yap\u0131s\u0131, mod\u00fclerli\u011fi ve sorumluluk ayr\u0131m\u0131n\u0131 destekler:<\/p>\n<pre><code>\n    .\n    \u251c\u2500\u2500 dist\/                       # Derlenmi\u015f JavaScript \u00e7\u0131kt\u0131lar\u0131 (bu dizini git'e eklemeyin)\n    \u251c\u2500\u2500 node_modules\/               # Kurulumlu ba\u011f\u0131ml\u0131l\u0131klar\n    \u251c\u2500\u2500 src\/                        # T\u00fcm TypeScript kaynak kodlar\u0131\n    \u2502   \u251c\u2500\u2500 config\/                 # Uygulama yap\u0131land\u0131rmalar\u0131 (DB ba\u011flant\u0131s\u0131, port vb.)\n    \u2502   \u251c\u2500\u2500 controllers\/            # \u0130stekleri i\u015fleyen ve yan\u0131tlar\u0131 d\u00f6nd\u00fcren fonksiyonlar (i\u015f mant\u0131\u011f\u0131 de\u011fil)\n    \u2502   \u251c\u2500\u2500 services\/               # \u0130\u015f mant\u0131\u011f\u0131, veritaban\u0131 i\u015flemleri, harici API \u00e7a\u011fr\u0131lar\u0131\n    \u2502   \u251c\u2500\u2500 routes\/                 # Express rotalar\u0131 tan\u0131mlar\u0131\n    \u2502   \u251c\u2500\u2500 middleware\/             # \u00d6zel middleware'ler (kimlik do\u011frulama, hata y\u00f6netimi vb.)\n    \u2502   \u251c\u2500\u2500 models\/                 # Veritaban\u0131 modelleri ve tipler (\u00f6rne\u011fin Mongoose \u015femalar\u0131)\n    \u2502   \u251c\u2500\u2500 utils\/                  # Yard\u0131mc\u0131 fonksiyonlar (formatlama, do\u011frulama vb.)\n    \u2502   \u2514\u2500\u2500 index.ts                # Uygulaman\u0131n ba\u015flang\u0131\u00e7 noktas\u0131\n    \u251c\u2500\u2500 .env                        # Ortam de\u011fi\u015fkenleri (git'e eklemeyin)\n    \u251c\u2500\u2500 .eslintrc.js                # ESLint yap\u0131land\u0131rmas\u0131\n    \u251c\u2500\u2500 .gitignore                  # Git taraf\u0131ndan g\u00f6z ard\u0131 edilecek dosyalar\n    \u251c\u2500\u2500 package.json                # Proje ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve betikleri\n    \u251c\u2500\u2500 tsconfig.json               # TypeScript derleyici yap\u0131land\u0131rmas\u0131\n    \u2514\u2500\u2500 README.md                   # Proje a\u00e7\u0131klamas\u0131\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rma, her bir sorumlulu\u011fun kendi dizininde grupland\u0131r\u0131lmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, t\u00fcm rota tan\u0131mlar\u0131 <code>routes<\/code> dizininde, i\u015f mant\u0131\u011f\u0131 <code>services<\/code> dizininde ve veri yap\u0131lar\u0131 <code>models<\/code> dizininde bulunur. Bu sayede kodunuz daha d\u00fczenli, okunabilir ve y\u00f6netilebilir hale gelir.<\/p>\n<p><strong>Mod\u00fcler Yap\u0131land\u0131rma:<\/strong><\/p>\n<p>Uygulaman\u0131z\u0131n yap\u0131land\u0131rma ayarlar\u0131n\u0131 (veritaban\u0131 ba\u011flant\u0131 dizeleri, API anahtarlar\u0131, port numaralar\u0131 vb.) ayr\u0131 bir <code>config<\/code> dizininde tutmak iyi bir uygulamad\u0131r. Bu, farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) i\u00e7in kolayca farkl\u0131 ayarlar kullanman\u0131za olanak tan\u0131r. Ortam de\u011fi\u015fkenlerini y\u00f6netmek i\u00e7in <code>dotenv<\/code> k\u00fct\u00fcphanesini kullanabilirsiniz.<\/p>\n<pre><code class=\"language-typescript\">\n    \/\/ src\/config\/index.ts\n    import dotenv from 'dotenv';\n\n    dotenv.config(); \/\/ .env dosyas\u0131ndaki de\u011fi\u015fkenleri process.env'ye y\u00fckler\n\n    export const config = {\n      port: process.env.PORT || 3000,\n      databaseUrl: process.env.DATABASE_URL || 'mongodb:\/\/localhost:27017\/mydb',\n      jwtSecret: process.env.JWT_SECRET || 'supersecretkey',\n      env: process.env.NODE_ENV || 'development'\n    };\n  <\/pre>\n<p><\/code><\/p>\n<p>Uygulaman\u0131zda bu yap\u0131land\u0131rma de\u011ferlerine <code>import { config } from &#039;.\/config&#039;;<\/code> \u015feklinde eri\u015febilirsiniz. <code>.env<\/code> dosyas\u0131 ise hassas bilgileri i\u00e7erdi\u011fi i\u00e7in mutlaka <code>.gitignore<\/code> dosyas\u0131na eklenmelidir.<\/p>\n<p><strong>Hata Y\u00f6netimi (Middleware):<\/strong><\/p>\n<p>Express uygulamalar\u0131nda global hata yakalama mekanizmas\u0131 kurmak, kullan\u0131c\u0131lar\u0131n\u0131za daha tutarl\u0131 bir hata mesaj\u0131 sunman\u0131n ve sunucunuzun \u00e7\u00f6kmesini engellemenin anahtar\u0131d\u0131r. \u00d6zel bir hata yakalama middleware'i olu\u015fturarak t\u00fcm hatalar\u0131 tek bir noktadan y\u00f6netebilirsiniz.<\/p>\n<pre><code class=\"language-typescript\">\n    \/\/ src\/middleware\/errorHandler.ts\n    import { Request, Response, NextFunction } from 'express';\n\n    export const errorHandler = (err: any, req: Request, res: Response, next: NextFunction) => {\n      console.error(err.stack); \/\/ Hata detaylar\u0131n\u0131 logla\n      res.status(err.statusCode || 500).json({\n        message: err.message || 'Bir sunucu hatas\u0131 olu\u015ftu.',\n        error: process.env.NODE_ENV === 'development' ? err : {} \/\/ Geli\u015ftirme modunda hata detaylar\u0131n\u0131 g\u00f6ster\n      });\n    };\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu middleware'i <code>src\/index.ts<\/code> dosyan\u0131zda t\u00fcm rotalardan sonra \u00e7a\u011f\u0131rarak etkinle\u015ftirebilirsiniz.<\/p>\n<pre><code class=\"language-typescript\">\n    \/\/ src\/index.ts i\u00e7inde\n    \/\/ ... di\u011fer rotalar ve middleware'ler\n    import { errorHandler } from '.\/middleware\/errorHandler';\n\n    app.use(errorHandler); \/\/ En sona ekleyin\n  <\/pre>\n<p><\/code><\/p>\n<p><strong>Linting ve Bi\u00e7imlendirme (<code>ESLint<\/code>, <code>Prettier<\/code>):<\/strong><\/p>\n<p>Kod kalitesini ve tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in <code>ESLint<\/code> ve <code>Prettier<\/code> kullanmak vazge\u00e7ilmezdir. <code>ESLint<\/code> kodunuzdaki potansiyel hatalar\u0131 ve stil ihlallerini tespit ederken, <code>Prettier<\/code> kodunuzu otomatik olarak belirli bir stile g\u00f6re bi\u00e7imlendirir. Bu ara\u00e7lar, \u00f6zellikle \u00e7ok ki\u015filik ekiplerde kodun ayn\u0131 standartta kalmas\u0131n\u0131 sa\u011flar ve gereksiz \"kod stili\" tart\u0131\u015fmalar\u0131n\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<pre><code>\n    npm install --save-dev eslint prettier @typescript-eslint\/parser @typescript-eslint\/eslint-plugin eslint-config-prettier eslint-plugin-prettier\n  <\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan <code>.eslintrc.js<\/code> ve <code>.prettierrc<\/code> dosyalar\u0131n\u0131 yap\u0131land\u0131rarak projeniz i\u00e7in uygun kurallar\u0131 belirleyebilirsiniz. Bu uygulamalar, sadece kodunuzu daha okunabilir hale getirmekle kalmaz, ayn\u0131 zamanda gelecekteki bak\u0131m s\u00fcre\u00e7lerini de kolayla\u015ft\u0131r\u0131r. Bir proje b\u00fcy\u00fcd\u00fck\u00e7e, bu t\u00fcr \"best practice\"lerin faydalar\u0131 katlanarak artar.<\/p>\n<div class=\"case-study\">\n<h3>Vaka Analizi: Bir SaaS Uygulamas\u0131n\u0131n Mod\u00fcler Yap\u0131s\u0131<\/h3>\n<p>Bulut tabanl\u0131 bir proje y\u00f6netim SaaS uygulamas\u0131 geli\u015ftiren \"ProjeX\" ekibi, ba\u015flang\u0131\u00e7ta monolitik bir JavaScript yap\u0131s\u0131yla yola \u00e7\u0131kt\u0131. Ancak uygulama b\u00fcy\u00fcd\u00fck\u00e7e, yeni \u00f6zellik eklemek veya mevcut kodda de\u011fi\u015fiklik yapmak giderek zorla\u015ft\u0131. \u00d6zellikle farkl\u0131 geli\u015ftiricilerin ayn\u0131 dosya \u00fczerinde \u00e7al\u0131\u015fmas\u0131, merge \u00e7ak\u0131\u015fmalar\u0131na ve beklenmedik yan etkilere yol a\u00e7\u0131yordu. Bu sorunlar\u0131 \u00e7\u00f6zmek i\u00e7in ProjeX, uygulamas\u0131n\u0131 Express TypeScript tabanl\u0131, mod\u00fcler bir yap\u0131ya ge\u00e7irme karar\u0131 ald\u0131. <code>controllers<\/code>, <code>services<\/code>, <code>routes<\/code>, <code>models<\/code> gibi dizinler olu\u015fturuldu ve her mod\u00fcl\u00fcn kendi i\u00e7inde bu yap\u0131ya uymas\u0131 sa\u011fland\u0131. \u00d6rne\u011fin, \"Kullan\u0131c\u0131 Y\u00f6netimi\" mod\u00fcl\u00fc kendi <code>user.controller.ts<\/code>, <code>user.service.ts<\/code> ve <code>user.routes.ts<\/code> dosyalar\u0131na sahip oldu. Bu ge\u00e7i\u015fin ard\u0131ndan, yeni \u00f6zellik geli\u015ftirme s\u00fcresi %25 k\u0131sald\u0131, \u00e7\u00fcnk\u00fc geli\u015ftiriciler art\u0131k t\u00fcm kod taban\u0131n\u0131 anlamak zorunda kalmadan sadece ilgili mod\u00fcle odaklanabiliyorlard\u0131. Ayr\u0131ca, otomatik test kapsam\u0131 art\u0131r\u0131ld\u0131 ve hata ay\u0131klama s\u00fcre\u00e7leri kolayla\u015ft\u0131. Mod\u00fcler yap\u0131, ProjeX'in uygulamas\u0131n\u0131 daha s\u00fcrd\u00fcr\u00fclebilir hale getirerek, gelecekteki geni\u015flemeler ve mikroservis mimarisine ge\u00e7i\u015f i\u00e7in sa\u011flam bir temel olu\u015fturdu.<\/p>\n<\/p><\/div>\n<h2>\u0130leri D\u00fczey Konular: Veritaban\u0131 Entegrasyonu ve API Tasar\u0131m\u0131<\/h2>\n<p>Bir Express TypeScript sunucusunun temelini kurduktan sonra, \u00e7o\u011fu web uygulamas\u0131n\u0131n olmazsa olmaz\u0131 olan veritaban\u0131 entegrasyonu ve API tasar\u0131m prensiplerine odaklanmak \u00f6nemlidir. Backend uygulamalar\u0131n\u0131n \u00e7o\u011fu, verileri kal\u0131c\u0131 olarak depolamak ve y\u00f6netmek i\u00e7in bir veritaban\u0131na ihtiya\u00e7 duyar. Se\u00e7ti\u011finiz veritaban\u0131 t\u00fcr\u00fc (SQL veya NoSQL) ve ona eri\u015fim y\u00f6nteminiz, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve \u00f6l\u00e7eklenebilirli\u011fini do\u011frudan etkileyecektir.<\/p>\n<h3>Veritaban\u0131 Ba\u011flant\u0131s\u0131 ve ORM Kullan\u0131m\u0131<\/h3>\n<p>Yayg\u0131n olarak kullan\u0131lan iki veritaban\u0131 t\u00fcr\u00fc vard\u0131r: ili\u015fkisel (SQL) veritabanlar\u0131 (PostgreSQL, MySQL vb.) ve ili\u015fkisel olmayan (NoSQL) veritabanlar\u0131 (MongoDB, Redis vb.). TypeScript ile \u00e7al\u0131\u015f\u0131rken, bu veritabanlar\u0131 i\u00e7in tip g\u00fcvenli\u011fi sa\u011flayan adapt\u00f6rler veya Object-Relational Mapper (ORM) \/ Object-Document Mapper (ODM) k\u00fct\u00fcphaneleri kullanmak geli\u015ftirme s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r.<\/p>\n<p><strong>MongoDB ile Mongoose ve TypeScript:<\/strong><\/p>\n<p>MongoDB pop\u00fcler bir NoSQL veritaban\u0131d\u0131r ve Mongoose, Node.js i\u00e7in resmi olmasa da en yayg\u0131n kullan\u0131lan ODM'dir. Mongoose, \u015fema tabanl\u0131 bir \u00e7\u00f6z\u00fcm sunar ve MongoDB ile tip g\u00fcvenli \u00e7al\u0131\u015fmak i\u00e7in harikad\u0131r. \u0130lk olarak Mongoose'u ve tip tan\u0131mlar\u0131n\u0131 kural\u0131m:<\/p>\n<pre><code>\n    npm install mongoose @types\/mongoose\n    # veya yarn kullan\u0131yorsan\u0131z:\n    # yarn add mongoose @types\/mongoose\n  <\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, bir veritaban\u0131 ba\u011flant\u0131s\u0131 ve basit bir model olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-typescript\">\n    \/\/ src\/config\/database.ts\n    import mongoose from 'mongoose';\n    import { config } from '.\/index'; \/\/ \u00d6nceki config dosyas\u0131ndan\n\n    export const connectDB = async () => {\n      try {\n        await mongoose.connect(config.databaseUrl);\n        console.log('MongoDB ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131.');\n      } catch (error) {\n        console.error('MongoDB ba\u011flant\u0131 hatas\u0131:', error);\n        process.exit(1); \/\/ Uygulamay\u0131 sonland\u0131r\n      }\n    };\n  <\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-typescript\"><\/pre>\n<p><\/code><br \/>\n    \/\/ src\/models\/User.ts<br \/>\n    import { Schema, model, Document } from 'mongoose';<\/p>\n<p>    export interface IUser extends Document {<br \/>\n      username: string;<br \/>\n      email: string;<br \/>\n      createdAt: Date;<br \/>\n    }<\/p>\n<p>    const UserSchema = new Schema<IUser>({<br \/>\n      username: { type: String, required: true, unique: true },<br \/>\n      email: { type: String, required: true, unique: true },<br \/>\n      createdAt: { type: Date, default: Date.now },<br \/>\n    });<\/p>\n<p>    const User = model<IUser>('User', UserSchema);<br \/>\n    export default User;<br \/>\n  <\/code><\/p>\n<p>Bu modeli kullanarak <code>src\/services\/userService.ts<\/code> i\u00e7inde kullan\u0131c\u0131 i\u015flemleri yapabilir ve <code>src\/controllers\/userController.ts<\/code> i\u00e7inde bunlar\u0131 rotalara ba\u011flayabilirsiniz. <code>IUser<\/code> interface'i, kullan\u0131c\u0131 nesnelerinizin tip g\u00fcvenli\u011fini sa\u011flar.<\/p>\n<p><strong>PostgreSQL ile TypeORM ve TypeScript:<\/strong><\/p>\n<p>\u0130li\u015fkisel veritabanlar\u0131 i\u00e7in TypeORM, g\u00fc\u00e7l\u00fc bir ORM \u00e7\u00f6z\u00fcm\u00fcd\u00fcr. TypeScript'in avantajlar\u0131ndan tam olarak yararlan\u0131r ve entity'ler, repository'ler ile \u00e7al\u0131\u015fmay\u0131 kolayla\u015ft\u0131r\u0131r. PostgreSQL'i bir \u00f6rnek olarak alal\u0131m:<\/p>\n<pre><code>\n    npm install typeorm pg reflect-metadata\n    npm install --save-dev @types\/pg\n    # tsconfig.json dosyan\u0131zda \"emitDecoratorMetadata\": true ve \"experimentalDecorators\": true ayarlar\u0131n\u0131 etkinle\u015ftirmeyi unutmay\u0131n\n  <\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-typescript\"><\/pre>\n<p><\/code><br \/>\n    \/\/ src\/config\/database.ts (TypeORM i\u00e7in)<br \/>\n    import { DataSource } from 'typeorm';<br \/>\n    import { User } from '..\/models\/User'; \/\/ TypeORM Entity'niz<\/p>\n<p>    export const AppDataSource = new DataSource({<br \/>\n      type: 'postgres',<br \/>\n      host: 'localhost',<br \/>\n      port: 5432,<br \/>\n      username: 'your_username',<br \/>\n      password: 'your_password',<br \/>\n      database: 'your_database',<br \/>\n      synchronize: true, \/\/ Geli\u015ftirme i\u00e7in true, \u00fcretim i\u00e7in false<br \/>\n      logging: false,<br \/>\n      entities: [User],<br \/>\n      migrations: [],<br \/>\n      subscribers: [],<br \/>\n    });<\/p>\n<p>    export const connectDB = async () => {<br \/>\n      try {<br \/>\n        await AppDataSource.initialize();<br \/>\n        console.log('PostgreSQL ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131.');<br \/>\n      } catch (error) {<br \/>\n        console.error('PostgreSQL ba\u011flant\u0131 hatas\u0131:', error);<br \/>\n        process.exit(1);<br \/>\n      }<br \/>\n    };<br \/>\n  <\/code><\/p>\n<pre><code class=\"language-typescript\"><\/pre>\n<p><\/code><br \/>\n    \/\/ src\/models\/User.ts (TypeORM i\u00e7in)<br \/>\n    import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';<\/p>\n<p>    @Entity()<br \/>\n    export class User {<br \/>\n      @PrimaryGeneratedColumn()<br \/>\n      id!: number;<\/p>\n<p>      @Column({ unique: true })<br \/>\n      username!: string;<\/p>\n<p>      @Column({ unique: true })<br \/>\n      email!: string;<\/p>\n<p>      @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })<br \/>\n      createdAt!: Date;<br \/>\n    }<br \/>\n  <\/code><\/p>\n<p>Her iki \u00f6rnekte de, <code>connectDB<\/code> fonksiyonunu <code>src\/index.ts<\/code> dosyan\u0131zda sunucu ba\u015flamadan \u00f6nce \u00e7a\u011f\u0131rmal\u0131s\u0131n\u0131z.<\/p>\n<h3>RESTful API Prensipleri ve TypeScript'te Uygulan\u0131\u015f\u0131<\/h3>\n<p>API'leriniz, client uygulamalar\u0131n sunucunuzla etkile\u015fim kurdu\u011fu temel aray\u00fczd\u00fcr. RESTful prensiplerine uygun API'ler tasarlamak, API'lerinizin daha anla\u015f\u0131l\u0131r, \u00f6l\u00e7eklenebilir ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<ul>\n<li><strong>Kaynak Odakl\u0131l\u0131k:<\/strong> API'lerinizi \"kullan\u0131c\u0131lar\", \"\u00fcr\u00fcnler\", \"sipari\u015fler\" gibi kaynaklar etraf\u0131nda tasarlay\u0131n. URL'leriniz isimler (\u00e7o\u011ful) i\u00e7ermelidir: <code>\/api\/users<\/code>, <code>\/api\/products<\/code>.<\/li>\n<li><strong>HTTP Metodlar\u0131:<\/strong> Her HTTP metodu (GET, POST, PUT, DELETE) belirli bir CRUD (Create, Read, Update, Delete) i\u015flemine kar\u015f\u0131l\u0131k gelmelidir.\n<ul>\n<li><code>GET \/api\/users<\/code>: T\u00fcm kullan\u0131c\u0131lar\u0131 getir.<\/li>\n<li><code>GET \/api\/users\/:id<\/code>: Belirli bir kullan\u0131c\u0131y\u0131 getir.<\/li>\n<li><code>POST \/api\/users<\/code>: Yeni bir kullan\u0131c\u0131 olu\u015ftur.<\/li>\n<li><code>PUT \/api\/users\/:id<\/code>: Belirli bir kullan\u0131c\u0131y\u0131 g\u00fcncelle (t\u00fcm alanlar).<\/li>\n<li><code>PATCH \/api\/users\/:id<\/code>: Belirli bir kullan\u0131c\u0131y\u0131 k\u0131smen g\u00fcncelle (sadece de\u011fi\u015fen alanlar).<\/li>\n<li><code>DELETE \/api\/users\/:id<\/code>: Belirli bir kullan\u0131c\u0131y\u0131 sil.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Durumsuzluk (Stateless):<\/strong> Sunucu, client'tan gelen her iste\u011fi ba\u011f\u0131ms\u0131z olarak i\u015flemelidir. Oturum bilgileri gibi durumlar client taraf\u0131ndan y\u00f6netilmelidir (\u00f6rne\u011fin JWT ile).<\/li>\n<li><strong>Hata Kodlar\u0131:<\/strong> Standart HTTP durum kodlar\u0131n\u0131 (200 OK, 201 Created, 204 No Content, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Server Error) kullanarak API'nizin durumunu a\u00e7\u0131k\u00e7a belirtin.<\/li>\n<\/ul>\n<p>TypeScript, API tasar\u0131m\u0131nda \u00f6nemli bir rol oynar. \u0130stek g\u00f6vdeleri (request body), yan\u0131t yap\u0131lar\u0131 (response payload) ve parametreler i\u00e7in aray\u00fczler (interfaces) tan\u0131mlayarak, API'nizin s\u00f6zle\u015fmesini net bir \u015fekilde belirtirsiniz. Bu, hem backend hem de frontend geli\u015ftiricilerin daha g\u00fcvenli ve uyumlu kod yazmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-typescript\">\n    \/\/ src\/controllers\/userController.ts\n    import { Request, Response } from 'express';\n    import User, { IUser } from '..\/models\/User'; \/\/ Mongoose modelini import edin\n\n    interface CreateUserRequestBody {\n      username: string;\n      email: string;\n    }\n\n    export const createUser = async (req: Request<unknown, unknown, CreateUserRequestBody>, res: Response) => {\n      try {\n        const { username, email } = req.body;\n        const newUser: IUser = new User({ username, email });\n        await newUser.save();\n        res.status(201).json(newUser);\n      } catch (error: any) {\n        res.status(500).json({ message: error.message });\n      }\n    };\n\n    export const getUsers = async (req: Request, res: Response) => {\n      try {\n        const users = await User.find();\n        res.status(200).json(users);\n      } catch (error: any) {\n        res.status(500).json({ message: error.message });\n      }\n    };\n  <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte <code>CreateUserRequestBody<\/code> aray\u00fcz\u00fc, <code>createUser<\/code> fonksiyonuna gelen iste\u011fin g\u00f6vdesinin tipini tan\u0131mlar. Bu sayede <code>req.body<\/code>'den gelen verilere eri\u015firken tip g\u00fcvenli\u011fi sa\u011flan\u0131r ve olas\u0131 hatalar geli\u015ftirme a\u015famas\u0131nda yakalan\u0131r. Bu yakla\u015f\u0131m, API'lerinizi daha sa\u011flam ve hata diren\u00e7li hale getirir.<\/p>\n<p><strong>Middleware Kullan\u0131m\u0131:<\/strong><\/p>\n<p>Express'in middleware yap\u0131s\u0131, her iste\u011fin i\u015flenmeden \u00f6nce veya sonra belirli i\u015flemlerin yap\u0131lmas\u0131n\u0131 sa\u011flar. Kimlik do\u011frulama, yetkilendirme, loglama veya veri do\u011frulama gibi i\u015flemleri middleware olarak tan\u0131mlayarak kod tekrar\u0131n\u0131 \u00f6nleyebilirsiniz.<\/p>\n<pre><code class=\"language-typescript\">\n    \/\/ src\/middleware\/authMiddleware.ts\n    import { Request, Response, NextFunction } from 'express';\n\n    export const authenticate = (req: Request, res: Response, next: NextFunction) => {\n      const token = req.headers.authorization?.split(' ')[1];\n      if (!token) {\n        return res.status(401).json({ message: 'Yetkilendirme token\u0131 bulunamad\u0131.' });\n      }\n      \/\/ Token do\u011frulama mant\u0131\u011f\u0131 buraya gelir (\u00f6rne\u011fin JWT do\u011frulama)\n      \/\/ E\u011fer ge\u00e7erliyse, req.user gibi bir nesneye kullan\u0131c\u0131 bilgilerini ekleyebiliriz\n      \/\/ req.user = decodedToken.user;\n      next(); \/\/ Bir sonraki middleware veya route handler'a ge\u00e7\n    };\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu <code>authenticate<\/code> middleware'i, bir rota tan\u0131mlarken kullan\u0131labilir:<\/p>\n<pre><code class=\"language-typescript\">\n    \/\/ src\/routes\/userRoutes.ts\n    import { Router } from 'express';\n    import { getUsers, createUser } from '..\/controllers\/userController';\n    import { authenticate } from '..\/middleware\/authMiddleware';\n\n    const router = Router();\n\n    router.get('\/users', authenticate, getUsers); \/\/ Kullan\u0131c\u0131lar\u0131 getirmeden \u00f6nce kimlik do\u011frula\n    router.post('\/users', createUser); \/\/ Kimlik do\u011frulama gerekmeyebilir\n\n    export default router;\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu entegrasyonlar ve tasar\u0131m prensipleri, Express TypeScript uygulaman\u0131z\u0131n sadece \u00e7al\u0131\u015fmas\u0131n\u0131 de\u011fil, ayn\u0131 zamanda uzun vadede bak\u0131m\u0131 kolay, g\u00fcvenli ve performansl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Deploy ve Bak\u0131m: Uygulaman\u0131z\u0131 Canl\u0131ya Alma ve S\u00fcrd\u00fcr\u00fclebilirlik<\/h2>\n<p>Bir Express TypeScript sunucusunu ba\u015far\u0131yla geli\u015ftirmek kadar, onu \u00fcretim ortam\u0131na da\u011f\u0131tmak (deploy etmek) ve uzun vadede s\u00fcrd\u00fcr\u00fclebilirli\u011fini sa\u011flamak da kritik \u00f6neme sahiptir. Geli\u015ftirme ortam\u0131nda her \u015fey yolunda giderken, \u00fcretim ortam\u0131nda farkl\u0131 zorluklarla kar\u015f\u0131la\u015fabilirsiniz. Bu b\u00f6l\u00fcmde, uygulaman\u0131z\u0131 canl\u0131ya alma ad\u0131mlar\u0131n\u0131 ve gelecekteki bak\u0131m s\u00fcre\u00e7lerini kolayla\u015ft\u0131racak stratejileri ele alaca\u011f\u0131z.<\/p>\n<h3>\u00dcretim Ortam\u0131 \u0130\u00e7in Derleme (<code>tsc<\/code>)<\/h3>\n<p>Geli\u015ftirme s\u0131ras\u0131nda <code>ts-node<\/code> ve <code>nodemon<\/code> ile TypeScript dosyalar\u0131n\u0131 do\u011frudan \u00e7al\u0131\u015ft\u0131rsak da, \u00fcretim ortam\u0131nda bu yakla\u015f\u0131m \u00f6nerilmez. \u00dcretimde, TypeScript kodunuzu saf JavaScript'e derlemeli ve bu derlenmi\u015f JavaScript dosyalar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmal\u0131s\u0131n\u0131z. Bunun birka\u00e7 nedeni vard\u0131r: derlenmi\u015f kod daha optimize olabilir, ek ba\u011f\u0131ml\u0131l\u0131klara (TypeScript, ts-node) ihtiya\u00e7 duymaz ve genellikle daha h\u0131zl\u0131 ba\u015flar.<\/p>\n<p>Projenizi \u00fcretim i\u00e7in derlemek i\u00e7in <code>package.json<\/code> dosyas\u0131nda tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>build<\/code> beti\u011fini kullan\u0131n:<\/p>\n<pre><code>\n    npm run build\n    # veya yarn kullan\u0131yorsan\u0131z:\n    # yarn build\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>tsconfig.json<\/code> ayarlar\u0131n\u0131za g\u00f6re <code>src<\/code> klas\u00f6r\u00fcndeki t\u00fcm TypeScript dosyalar\u0131n\u0131z\u0131 <code>dist<\/code> klas\u00f6r\u00fcne derlenmi\u015f JavaScript dosyalar\u0131 olarak kopyalayacakt\u0131r. \u00d6rne\u011fin, <code>src\/index.ts<\/code> dosyas\u0131 <code>dist\/index.js<\/code> olarak derlenecektir. Art\u0131k \u00fcretim sunucunuzda sadece <code>dist<\/code> klas\u00f6r\u00fcndeki JavaScript dosyalar\u0131n\u0131 ve <code>node_modules<\/code> klas\u00f6r\u00fcn\u00fc bar\u0131nd\u0131ran hafif bir paket da\u011f\u0131tabilirsiniz.<\/p>\n<h3>PM2 veya Docker ile Da\u011f\u0131t\u0131m<\/h3>\n<p>Uygulaman\u0131z\u0131 canl\u0131ya ald\u0131ktan sonra, onun s\u00fcrekli \u00e7al\u0131\u015f\u0131r durumda kalmas\u0131n\u0131, \u00e7\u00f6kt\u00fc\u011f\u00fcnde otomatik olarak yeniden ba\u015flamas\u0131n\u0131 ve performans\u0131n\u0131n izlenebilmesini sa\u011flamak \u00f6nemlidir. Bunun i\u00e7in iki pop\u00fcler y\u00f6ntem vard\u0131r: PM2 ve Docker.<\/p>\n<ul>\n<li>\n      <strong>PM2 (Process Manager 2):<\/strong><\/p>\n<p>Node.js uygulamalar\u0131n\u0131 \u00fcretimde \u00e7al\u0131\u015ft\u0131rmak i\u00e7in g\u00fc\u00e7l\u00fc bir s\u00fcre\u00e7 y\u00f6neticisidir. PM2, uygulaman\u0131z\u0131n otomatik olarak yeniden ba\u015flat\u0131lmas\u0131n\u0131, k\u00fcme modunda (cluster mode) \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 (birden fazla CPU \u00e7ekirde\u011fini kullanmak i\u00e7in) ve performans izlemesini sa\u011flar.<\/p>\n<pre><code>\n        npm install -g pm2 # Global olarak kurun\n        # Uygulaman\u0131z\u0131 ba\u015flat\u0131n\n        pm2 start dist\/index.js --name \"my-express-app\"\n        # K\u00fcme modunda ba\u015flat\u0131n (\u00f6rn: 4 \u00e7ekirdek)\n        # pm2 start dist\/index.js -i 4 --name \"my-express-app-cluster\"\n        # T\u00fcm uygulamalar\u0131 listele\n        pm2 list\n        # Loglar\u0131 izle\n        pm2 logs my-express-app\n        # Uygulamay\u0131 durdur\n        pm2 stop my-express-app\n      <\/pre>\n<p><\/code><\/p>\n<p>PM2, uygulaman\u0131z\u0131n kesintisiz \u00e7al\u0131\u015fmas\u0131n\u0131 garanti eder ve sistem \u00e7\u00f6kmelerinde dahi uygulaman\u0131z\u0131 tekrar aya\u011fa kald\u0131r\u0131r.<\/p>\n<\/li>\n<li>\n      <strong>Docker:<\/strong><\/p>\n<p>Uygulaman\u0131z\u0131 ve t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f, ta\u015f\u0131nabilir bir konteyn\u0131r i\u00e7ine paketlemenizi sa\u011flar. Bu, \"benim makinemde \u00e7al\u0131\u015f\u0131yordu\" sorununu ortadan kald\u0131r\u0131r ve uygulamalar\u0131n\u0131z\u0131n her ortamda (geli\u015ftirme, test, \u00fcretim) ayn\u0131 \u015fekilde davranmas\u0131n\u0131 garanti eder. Modern da\u011f\u0131t\u0131m yakla\u015f\u0131mlar\u0131nda Docker vazge\u00e7ilmezdir.<\/p>\n<pre><code class=\"language-dockerfile\">\n        # Dockerfile\n        # Node.js'in resmi slim s\u00fcr\u00fcm\u00fcn\u00fc temel al\u0131r\n        FROM node:18-alpine\n\n        # Uygulama kodunun bulunaca\u011f\u0131 \u00e7al\u0131\u015fma dizini\n        WORKDIR \/app\n\n        # package.json ve package-lock.json dosyalar\u0131n\u0131 kopyala\n        COPY package*.json .\/\n\n        # Ba\u011f\u0131ml\u0131l\u0131klar\u0131 kur\n        RUN npm install\n\n        # Uygulama kaynak kodlar\u0131n\u0131 kopyala\n        COPY . .\n\n        # TypeScript kodunu JavaScript'e derle\n        RUN npm run build\n\n        # Uygulaman\u0131n dinleyece\u011fi portu belirt\n        EXPOSE 3000\n\n        # Uygulamay\u0131 ba\u015flat\n        CMD [\"npm\", \"start\"]\n      <\/pre>\n<p><\/code><\/p>\n<p>Bu <code>Dockerfile<\/code> ile uygulaman\u0131z\u0131 bir Docker imaj\u0131na d\u00f6n\u00fc\u015ft\u00fcrebilir ve herhangi bir Docker uyumlu ortamda \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code>\n        docker build -t my-express-app .\n        docker run -p 3000:3000 my-express-app\n      <\/pre>\n<p><\/code><\/p>\n<p>Docker, \u00f6zellikle mikroservis mimarileri ve CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) boru hatlar\u0131nda da\u011f\u0131t\u0131m\u0131 otomatikle\u015ftirir ve standartla\u015ft\u0131r\u0131r.<\/p>\n<\/li>\n<\/ul>\n<h3>G\u00fcnl\u00fckleme (Logging) ve \u0130zleme (Monitoring)<\/h3>\n<p>\u00dcretimdeki bir uygulaman\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 anlamak i\u00e7in g\u00fcnl\u00fckleme ve izleme sistemleri hayati \u00f6neme sahiptir. Hatalar\u0131 tespit etmek, performans darbo\u011fazlar\u0131n\u0131 bulmak ve uygulaman\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 anlamak i\u00e7in ayr\u0131nt\u0131l\u0131 g\u00fcnl\u00fckler tutmal\u0131s\u0131n\u0131z. Winston veya Pino gibi k\u00fct\u00fcphaneler, yap\u0131land\u0131r\u0131lm\u0131\u015f g\u00fcnl\u00fckler yazmak i\u00e7in pop\u00fcler se\u00e7imlerdir.<\/p>\n<pre><code class=\"language-typescript\">\n    \/\/ src\/utils\/logger.ts\n    import winston from 'winston';\n\n    const logger = winston.createLogger({\n      level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',\n      format: winston.format.json(),\n      transports: [\n        new winston.transports.Console(),\n        new winston.transports.File({ filename: 'error.log', level: 'error' }),\n        new winston.transports.File({ filename: 'combined.log' }),\n      ],\n    });\n\n    export default logger;\n  <\/pre>\n<p><\/code><\/p>\n<p>Uygulaman\u0131zda <code>logger.info(&#039;Kullan\u0131c\u0131 giri\u015f yapt\u0131&#039;);<\/code> veya <code>logger.error(&#039;Bir hata olu\u015ftu&#039;, error);<\/code> \u015feklinde kullanabilirsiniz. Ayr\u0131ca Prometheus, Grafana veya Datadog gibi izleme ara\u00e7lar\u0131 kullanarak CPU, bellek kullan\u0131m\u0131, istek s\u00fcreleri gibi metrikleri toplayabilir ve g\u00f6rselle\u015ftirebilirsiniz.<\/p>\n<h3>S\u00fcrd\u00fcr\u00fclebilirlik \u0130pu\u00e7lar\u0131: Test, Dok\u00fcmantasyon, G\u00fcvenlik<\/h3>\n<ul>\n<li>\n      <strong>Test:<\/strong> Uygulaman\u0131z i\u00e7in kapsaml\u0131 bir test paketi yaz\u0131n (birim testleri, entegrasyon testleri, u\u00e7tan uca testler). Jest veya Mocha\/Chai gibi k\u00fct\u00fcphaneler TypeScript ile iyi \u00e7al\u0131\u015f\u0131r. Testler, kod de\u011fi\u015fikliklerinin beklenmedik yan etkiler yaratmamas\u0131n\u0131 sa\u011flar ve refaktoring i\u015flemlerini g\u00fcvenli hale getirir.\n    <\/li>\n<li>\n      <strong>Dok\u00fcmantasyon:<\/strong> API'nizin nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, kaynaklar\u0131n\u0131 ve u\u00e7 noktalar\u0131n\u0131 a\u00e7\u0131klayan net bir dok\u00fcmantasyon (\u00f6rne\u011fin Swagger\/OpenAPI) haz\u0131rlay\u0131n. Bu, hem frontend ekibi hem de di\u011fer servislerle entegrasyonu kolayla\u015ft\u0131r\u0131r.\n    <\/li>\n<li>\n      <strong>G\u00fcvenlik:<\/strong> Temel g\u00fcvenlik \u00f6nlemlerini (CORS, Helmet, rate limiting, veri do\u011frulama) uygulay\u0131n. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 d\u00fczenli olarak g\u00fcncel tutun ve bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 takip edin. Ortam de\u011fi\u015fkenlerini hassas bilgiler i\u00e7in kullan\u0131n ve bunlar\u0131 versiyon kontrol\u00fcne eklemeyin.<\/li>\n<\/ul>\n<p>A\u015fa\u011f\u0131daki tablo, geli\u015ftirme ve \u00fcretim ortamlar\u0131 aras\u0131ndaki temel farklar\u0131 \u00f6zetlemektedir:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u00d6zellik<\/th>\n<th>Geli\u015ftirme Ortam\u0131<\/th>\n<th>\u00dcretim Ortam\u0131<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Derleme<\/strong><\/td>\n<td><code>ts-node<\/code> ile an\u0131nda (JIT)<\/td>\n<td>\u00d6nceden <code>tsc<\/code> ile derlenmi\u015f JavaScript<\/td>\n<\/tr>\n<tr>\n<td><strong>Yeniden Ba\u015flatma<\/strong><\/td>\n<td><code>nodemon<\/code> ile otomatik<\/td>\n<td><code>pm2<\/code> veya Docker ile s\u00fcrekli ve hata toleransl\u0131<\/td>\n<\/tr>\n<tr>\n<td><strong>Hata Mesajlar\u0131<\/strong><\/td>\n<td>Ayr\u0131nt\u0131l\u0131 hata y\u0131\u011f\u0131nlar\u0131<\/td>\n<td>Genel, kullan\u0131c\u0131lara y\u00f6nelik mesajlar<\/td>\n<\/tr>\n<tr>\n<td><strong>Performans<\/strong><\/td>\n<td>H\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc odakl\u0131<\/td>\n<td>Optimizasyon, h\u0131z ve kaynak verimlili\u011fi odakl\u0131<\/td>\n<\/tr>\n<tr>\n<td><strong>Ba\u011f\u0131ml\u0131l\u0131klar<\/strong><\/td>\n<td><code>devDependencies<\/code> dahil t\u00fcm\u00fc<\/td>\n<td>Sadece <code>dependencies<\/code> (derlenmi\u015f kod)<\/td>\n<\/tr>\n<tr>\n<td><strong>G\u00fcnl\u00fckleme<\/strong><\/td>\n<td><code>debug<\/code> veya <code>info<\/code> seviyesi, konsol \u00e7\u0131kt\u0131s\u0131<\/td>\n<td><code>info<\/code>, <code>warn<\/code>, <code>error<\/code> seviyesi, dosyalara veya merkezi log sistemlerine<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Bu stratejileri uygulayarak, Express TypeScript uygulaman\u0131z\u0131n yaln\u0131zca ba\u015far\u0131l\u0131 bir \u015fekilde geli\u015ftirilmesini de\u011fil, ayn\u0131 zamanda canl\u0131ya al\u0131nd\u0131ktan sonra da kararl\u0131, g\u00fcvenli ve kolayca y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc bir ikili olan Express ve TypeScript'in neden bu kadar pop\u00fcler oldu\u011funu, bu teknolojilerin temel kavramlar\u0131n\u0131, ad\u0131m ad\u0131m bir Express TypeScript sunucusunun nas\u0131l kuruldu\u011funu, proje yap\u0131s\u0131 i\u00e7in en iyi uygulamalar\u0131, veritaban\u0131 entegrasyonu gibi ileri d\u00fczey konular\u0131 ve son olarak uygulaman\u0131z\u0131 \u00fcretim ortam\u0131na nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini nas\u0131l sa\u011flayaca\u011f\u0131n\u0131z\u0131 \u00f6\u011frendiniz. TypeScript'in sundu\u011fu tip g\u00fcvenli\u011fi ve geli\u015ftirici verimlili\u011fi ile Express'in esnekli\u011fi ve hafifli\u011fi, bir araya geldi\u011finde sa\u011flam, \u00f6l\u00e7eklenebilir ve bak\u0131m\u0131 kolay backend sistemleri olu\u015fturman\u0131n anahtar\u0131n\u0131 sunar. Bu rehberde edindi\u011finiz bilgilerle, kendi projelerinizi ba\u015flatmak ve mevcut becerilerinizi geli\u015ftirmek i\u00e7in sa\u011flam bir temel olu\u015fturmu\u015f oldunuz. Art\u0131k kendi Express TypeScript sunucular\u0131n\u0131z\u0131 kurmaya ve modern web'in ihtiya\u00e7 duydu\u011fu uygulamalar\u0131 geli\u015ftirmeye haz\u0131rs\u0131n\u0131z.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n<h4>Express TypeScript projesinde <code>src<\/code> ve <code>dist<\/code> klas\u00f6rlerinin amac\u0131 nedir?<\/h4>\n<p><strong>Cevap:<\/strong> <code>src<\/code> (source) klas\u00f6r\u00fc, t\u00fcm orijinal TypeScript kaynak kodunuzu i\u00e7erir. <code>dist<\/code> (distribution) klas\u00f6r\u00fc ise <code>src<\/code> klas\u00f6r\u00fcndeki TypeScript kodunuzun TypeScript derleyicisi (<code>tsc<\/code>) taraf\u0131ndan JavaScript'e derlenmi\u015f halini i\u00e7erir. \u00dcretim ortam\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lan kod, <code>dist<\/code> klas\u00f6r\u00fcndeki JavaScript dosyalar\u0131d\u0131r. Bu ayr\u0131m, kaynak kodunuzu derlenmi\u015f \u00e7\u0131kt\u0131dan temiz tutar ve da\u011f\u0131t\u0131m paketinizin sadece gerekli dosyalar\u0131 i\u00e7ermesini sa\u011flar.<\/p>\n<\/li>\n<li>\n<h4><code>nodemon<\/code> ve <code>ts-node<\/code> neden geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131klar\u0131 (<code>devDependencies<\/code>) olarak kurulur?<\/h4>\n<p><strong>Cevap:<\/strong> <code>nodemon<\/code> ve <code>ts-node<\/code>, sadece geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131rmak i\u00e7in kullan\u0131lan ara\u00e7lard\u0131r (kod de\u011fi\u015fikliklerinde otomatik yeniden ba\u015flatma, TypeScript'i an\u0131nda \u00e7al\u0131\u015ft\u0131rma). \u00dcretim ortam\u0131nda uygulaman\u0131z zaten derlenmi\u015f JavaScript kodunu \u00e7al\u0131\u015ft\u0131raca\u011f\u0131 i\u00e7in bu ara\u00e7lara ihtiya\u00e7 duymaz. Bu nedenle, projenizin \u00fcretim paketini gereksiz yere b\u00fcy\u00fctmemek ad\u0131na <code>devDependencies<\/code> olarak kurulmalar\u0131 en iyi uygulamad\u0131r.<\/p>\n<\/li>\n<li>\n<h4>Bir Express TypeScript uygulamas\u0131nda ortam de\u011fi\u015fkenlerini (<code>.env<\/code>) nas\u0131l g\u00fcvenli bir \u015fekilde y\u00f6netirim?<\/h4>\n<p><strong>Cevap:<\/strong> Ortam de\u011fi\u015fkenlerini y\u00f6netmenin en g\u00fcvenli yolu, <code>dotenv<\/code> gibi bir k\u00fct\u00fcphane kullanarak <code>.env<\/code> dosyas\u0131nda tan\u0131mlamak ve bu <code>.env<\/code> dosyas\u0131n\u0131 kesinlikle <code>.gitignore<\/code> dosyas\u0131na ekleyerek versiyon kontrol sistemine (Git) dahil etmemektir. \u00dcretim ortam\u0131nda, bu de\u011fi\u015fkenler sunucu sa\u011flay\u0131c\u0131n\u0131z\u0131n (AWS, Heroku, DigitalOcean vb.) ortam de\u011fi\u015fkeni ayarlar\u0131 \u00fczerinden do\u011frudan sisteme enjekte edilir, b\u00f6ylece hassas bilgiler kod taban\u0131nda veya versiyon kontrol\u00fcnde saklanmam\u0131\u015f olur.<\/p>\n<\/li>\n<li>\n<h4>API'lerimde kimlik do\u011frulama (authentication) ve yetkilendirme (authorization) i\u015flemlerini nas\u0131l uygular\u0131m?<\/h4>\n<p><strong>Cevap:<\/strong> Kimlik do\u011frulama ve yetkilendirme i\u015flemleri i\u00e7in genellikle middleware fonksiyonlar\u0131 kullan\u0131l\u0131r. Kimlik do\u011frulama i\u00e7in JSON Web Tokens (JWT) pop\u00fcler bir \u00e7\u00f6z\u00fcmd\u00fcr; kullan\u0131c\u0131 giri\u015f yapt\u0131\u011f\u0131nda bir token olu\u015fturulur ve sonraki her istekte bu token g\u00f6nderilir. Sunucu, gelen token'\u0131 do\u011frulayarak kullan\u0131c\u0131n\u0131n kimli\u011fini onaylar. Yetkilendirme i\u00e7in ise, kimli\u011fi do\u011frulanm\u0131\u015f kullan\u0131c\u0131n\u0131n rollerine veya izinlerine bak\u0131larak belirli bir kayna\u011fa eri\u015fip eri\u015femeyece\u011fi kontrol edilir. Bu i\u015flemler, Express'in middleware zincirine eklenen \u00f6zel fonksiyonlar arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015ftirilir.<\/p>\n<\/li>\n<li>\n<h4>TypeORM veya Mongoose kullan\u0131rken <code>synchronize: true<\/code> ayar\u0131n\u0131 \u00fcretimde neden <code>false<\/code> yapmal\u0131y\u0131m?<\/h4>\n<p><strong>Cevap:<\/strong> <code>synchronize: true<\/code> ayar\u0131, TypeORM veya Mongoose'un modellerinize g\u00f6re veritaban\u0131 \u015femas\u0131n\u0131 otomatik olarak olu\u015fturmas\u0131n\u0131 veya g\u00fcncellemesini sa\u011flar. Bu, geli\u015ftirme a\u015famas\u0131nda h\u0131zl\u0131 prototipleme i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. Ancak \u00fcretim ortam\u0131nda, bu ayar veri kayb\u0131na yol a\u00e7abilecek potansiyel riskler ta\u015f\u0131r (\u00f6rne\u011fin, \u015fema de\u011fi\u015fiklikleri mevcut verileri silebilir). \u00dcretimde, veritaban\u0131 \u015fema de\u011fi\u015fikliklerini manuel olarak (migration dosyalar\u0131 ile) y\u00f6netmek ve dikkatli bir \u015fekilde uygulamak \u00e7ok daha g\u00fcvenlidir. Bu nedenle <code>synchronize: true<\/code> genellikle <code>development<\/code> ortam\u0131nda kullan\u0131l\u0131rken, <code>production<\/code> ortam\u0131nda <code>false<\/code> olmal\u0131d\u0131r.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131 geli\u015ftirmek isteyenler i\u00e7in Express ve TypeScript ikilisi, g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir backend \u00e7\u00f6z\u00fcmleri sunar. Bu ad\u0131m&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-30888","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber<\/title>\n<meta name=\"description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirmek isteyenler i\u00e7in Express ve TypeScript ikilisi, g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir backend \u00e7\u00f6z\u00fcmleri sunar. Bu ad\u0131m ad\u0131m rehber, tip g\u00fcvenli bir Express sunucusunu s\u0131f\u0131rdan nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye kadar t\u00fcm detaylar\u0131yla \u00f6\u011fretecek. Hatalar\u0131 minimuma indirirken geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffedin.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirmek isteyenler i\u00e7in Express ve TypeScript ikilisi, g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir backend \u00e7\u00f6z\u00fcmleri sunar. Bu ad\u0131m ad\u0131m rehber, tip g\u00fcvenli bir Express sunucusunu s\u0131f\u0131rdan nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye kadar t\u00fcm detaylar\u0131yla \u00f6\u011fretecek. Hatalar\u0131 minimuma indirirken geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffedin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-03T01:01:44+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"34 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber\",\"datePublished\":\"2025-10-03T01:01:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/\"},\"wordCount\":5426,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/\",\"name\":\"Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-03T01:01:44+00:00\",\"description\":\"Modern web uygulamalar\u0131 geli\u015ftirmek isteyenler i\u00e7in Express ve TypeScript ikilisi, g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir backend \u00e7\u00f6z\u00fcmleri sunar. Bu ad\u0131m ad\u0131m rehber, tip g\u00fcvenli bir Express sunucusunu s\u0131f\u0131rdan nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye kadar t\u00fcm detaylar\u0131yla \u00f6\u011fretecek. Hatalar\u0131 minimuma indirirken geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffedin.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber","description":"Modern web uygulamalar\u0131 geli\u015ftirmek isteyenler i\u00e7in Express ve TypeScript ikilisi, g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir backend \u00e7\u00f6z\u00fcmleri sunar. Bu ad\u0131m ad\u0131m rehber, tip g\u00fcvenli bir Express sunucusunu s\u0131f\u0131rdan nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye kadar t\u00fcm detaylar\u0131yla \u00f6\u011fretecek. Hatalar\u0131 minimuma indirirken geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffedin.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber","og_description":"Modern web uygulamalar\u0131 geli\u015ftirmek isteyenler i\u00e7in Express ve TypeScript ikilisi, g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir backend \u00e7\u00f6z\u00fcmleri sunar. Bu ad\u0131m ad\u0131m rehber, tip g\u00fcvenli bir Express sunucusunu s\u0131f\u0131rdan nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye kadar t\u00fcm detaylar\u0131yla \u00f6\u011fretecek. Hatalar\u0131 minimuma indirirken geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffedin.","og_url":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-03T01:01:44+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"34 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber","datePublished":"2025-10-03T01:01:44+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/"},"wordCount":5426,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/","name":"Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-03T01:01:44+00:00","description":"Modern web uygulamalar\u0131 geli\u015ftirmek isteyenler i\u00e7in Express ve TypeScript ikilisi, g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir backend \u00e7\u00f6z\u00fcmleri sunar. Bu ad\u0131m ad\u0131m rehber, tip g\u00fcvenli bir Express sunucusunu s\u0131f\u0131rdan nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye kadar t\u00fcm detaylar\u0131yla \u00f6\u011fretecek. Hatalar\u0131 minimuma indirirken geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffedin.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/express-typescript-sunucusu-nasil-kurulur-kapsamli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Express TypeScript Sunucusu Nas\u0131l Kurulur? Kapsaml\u0131 Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30888","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=30888"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30888\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30888"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30888"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30888"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}