{"id":30968,"date":"2025-10-04T04:01:17","date_gmt":"2025-10-04T01:01:17","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/"},"modified":"2025-10-04T04:01:17","modified_gmt":"2025-10-04T01:01:17","slug":"mastering-routing-in-express-ile-typescript","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/","title":{"rendered":"Mastering Routing in Express ile TypeScript"},"content":{"rendered":"<p>Karma\u015f\u0131k API&#8217;lerinizin y\u00f6nlendirme mant\u0131\u011f\u0131n\u0131 y\u00f6netmekte zorlan\u0131yor musunuz? \u00d6zellikle b\u00fcy\u00fck ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirirken, Express.js\u2019in esnek yap\u0131s\u0131 TypeScript\u2019in tip g\u00fcvenli\u011fi ile birle\u015fti\u011finde, y\u00f6nlendirme (routing) s\u00fcre\u00e7lerinizde devrim yaratabilir. Bu makalede, Express.js ve TypeScript kullanarak sa\u011flam, bak\u0131m\u0131 kolay ve performansl\u0131 bir y\u00f6nlendirme altyap\u0131s\u0131 nas\u0131l in\u015fa edece\u011finizi ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Geli\u015fmi\u015f middleware tekniklerinden mod\u00fcler mimarilere, tip g\u00fcvenli rotalardan performans ipu\u00e7lar\u0131na kadar her \u015feyi derinlemesine inceleyece\u011fiz. Haz\u0131r olun, \u00e7\u00fcnk\u00fc Express ve TypeScript ile API geli\u015ftirme yolculu\u011funuzda yeni bir seviyeye ula\u015facaks\u0131n\u0131z.<\/p>\n<p>Web uygulamalar\u0131n\u0131n belkemi\u011fini olu\u015fturan API\u2019ler, kullan\u0131c\u0131lar\u0131n veya di\u011fer sistemlerin sunucunuzla etkile\u015fim kurmas\u0131n\u0131 sa\u011flar. Bu etkile\u015fimin ilk ve en kritik ad\u0131m\u0131 ise y\u00f6nlendirmedir. Yani, gelen bir iste\u011fin (HTTP Request) hangi kayna\u011fa y\u00f6nlendirilece\u011fini ve hangi kod blo\u011fu taraf\u0131ndan i\u015flenece\u011fini belirleme s\u00fcrecidir. Express.js, Node.js ekosisteminin en pop\u00fcler ve minimalist web \u00e7at\u0131lar\u0131ndan biridir ve bu y\u00f6nlendirme i\u015flemini son derece basit ve esnek bir \u015fekilde ger\u00e7ekle\u015ftirmenize olanak tan\u0131r. Ancak, projeler b\u00fcy\u00fcd\u00fck\u00e7e bu esneklik, iyi y\u00f6netilmedi\u011finde bir karma\u015faya d\u00f6n\u00fc\u015febilir.<\/p>\n<p>Peki, bu noktada TypeScript neden devreye giriyor? JavaScript&#8217;in dinamik do\u011fas\u0131, k\u00fc\u00e7\u00fck projelerde h\u0131zl\u0131 prototipleme i\u00e7in harika olsa da, b\u00fcy\u00fck \u00f6l\u00e7ekli ve ekip tabanl\u0131 projelerde hata ay\u0131klama (debugging) ve bak\u0131m maliyetlerini art\u0131rabilir. TypeScript, JavaScript&#8217;e statik tipleme yetene\u011fi ekleyerek bu sorunlar\u0131 \u00e7\u00f6zer. Geli\u015ftiricilerin kod yazarken hatalar\u0131 erken yakalamas\u0131na, daha okunabilir ve \u00f6ng\u00f6r\u00fclebilir kodlar \u00fcretmesine yard\u0131mc\u0131 olur. Express.js ile TypeScript&#8217;i birle\u015ftirdi\u011fimizde, hem Express&#8217;in hafif ve g\u00fc\u00e7l\u00fc y\u00f6nlendirme yeteneklerinden faydalan\u0131r\u0131z hem de TypeScript&#8217;in sundu\u011fu tip g\u00fcvenli\u011fi sayesinde daha robust ve \u00f6l\u00e7eklenebilir API&#8217;ler in\u015fa ederiz. Bu sinerji, \u00f6zellikle mikroservis mimarilerinde veya b\u00fcy\u00fck monolitik uygulamalarda kritik \u00f6neme sahiptir.<\/p>\n<p>Y\u00f6nlendirme, sadece URL&#8217;leri fonksiyonlarla e\u015fle\u015ftirmekten \u00e7ok daha fazlas\u0131d\u0131r. \u0130yi bir y\u00f6nlendirme mimarisi, uygulaman\u0131z\u0131n bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r, yeni \u00f6zellikler eklemeyi h\u0131zland\u0131r\u0131r ve hatalar\u0131n yay\u0131lmas\u0131n\u0131 engeller. \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda &#8220;\/products&#8221; rotas\u0131 t\u00fcm \u00fcr\u00fcnleri listelerken, &#8220;\/products\/:id&#8221; rotas\u0131 belirli bir \u00fcr\u00fcn\u00fc getirir. Bu rotalar\u0131n her birinin kendine \u00f6zg\u00fc i\u015f mant\u0131\u011f\u0131 ve veri eri\u015fim gereksinimleri vard\u0131r. Bu i\u015f mant\u0131\u011f\u0131n\u0131 d\u00fczg\u00fcn bir \u015fekilde ay\u0131rmak ve y\u00f6netmek, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve g\u00fcvenli\u011fini do\u011frudan etkiler. Ayn\u0131 zamanda, ekip i\u00e7inde farkl\u0131 geli\u015ftiricilerin ayn\u0131 anda farkl\u0131 rotalar \u00fczerinde \u00e7al\u0131\u015fabilmesini sa\u011flar, bu da geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r. Temel Express y\u00f6nlendirmesi, <code>app.get()<\/code>, <code>app.post()<\/code> gibi y\u00f6ntemlerle basit\u00e7e HTTP metotlar\u0131n\u0131 belirli bir yola ataman\u0131z\u0131 sa\u011flar. Ancak ger\u00e7ek d\u00fcnya senaryolar\u0131nda bu yakla\u015f\u0131m h\u0131zla yetersiz kal\u0131r ve daha yap\u0131land\u0131r\u0131lm\u0131\u015f bir \u00e7\u00f6z\u00fcme ihtiya\u00e7 duyulur. Bu nedenle, y\u00f6nlendirme stratejileri \u00fczerinde ustala\u015fmak, modern web geli\u015ftirme d\u00fcnyas\u0131nda vazge\u00e7ilmez bir beceridir.<\/p>\n<pre><code>\n\/\/ app.ts - Temel Express ve TypeScript kurulumu\nimport express, { Application, Request, Response } from 'express';\n\nconst app: Application = express();\nconst PORT: number = 3000;\n\n\/\/ Body parser middleware'i\napp.use(express.json());\n\n\/\/ Temel GET rotas\u0131\napp.get('\/', (req: Request, res: Response) => {\n  res.send('Merhaba D\u00fcnya, Express ve TypeScript ile!');\n});\n\n\/\/ Dinamik parametreli GET rotas\u0131\napp.get('\/kullanicilar\/:id', (req: Request, res: Response) => {\n  const userId: string = req.params.id;\n  res.send(<code>Kullan\u0131c\u0131 ID: ${userId} bilgileri getiriliyor.<\/code>);\n});\n\n\/\/ POST rotas\u0131 \u00f6rne\u011fi\napp.post('\/urunler', (req: Request, res: Response) => {\n  const { ad, fiyat } = req.body;\n  if (!ad || !fiyat) {\n    return res.status(400).send('\u00dcr\u00fcn ad\u0131 ve fiyat\u0131 zorunludur.');\n  }\n  res.status(201).send(<code>\u00dcr\u00fcn olu\u015fturuldu: ${ad} - ${fiyat} TL<\/code>);\n});\n\napp.listen(PORT, () => {\n  console.log(<code>Sunucu http:\/\/localhost:${PORT} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});\n\n<\/pre>\n<p><\/code><\/p>\n<h2>Middleware ile G\u00fc\u00e7l\u00fc Y\u00f6nlendirme Katmanlar\u0131 Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Express.js'in en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri olan middleware, HTTP istek-cevap d\u00f6ng\u00fcs\u00fcn\u00fcn her a\u015famas\u0131nda \u00f6zel fonksiyonlar \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, \"orta katman yaz\u0131l\u0131m\" (middleware) istek gelip cevaba d\u00f6n\u00fc\u015fmeden \u00f6nce veya sonra \u00e7al\u0131\u015fan bir dizi fonksiyondur. Bu fonksiyonlar, iste\u011fi analiz edebilir, de\u011fi\u015ftirebilir, sonland\u0131rabilir veya bir sonraki middleware'e ya da rota i\u015fleyicisine devredebilir. TypeScript ile middleware kullanmak, bu fonksiyonlar\u0131n beklenen parametre tiplerini ve d\u00f6n\u00fc\u015f tiplerini a\u00e7\u0131k\u00e7a tan\u0131mlayarak kodunuzu daha g\u00fcvenli ve hata yakalamay\u0131 kolay hale getirir. Middleware'ler, bir uygulaman\u0131n bir\u00e7ok farkl\u0131 y\u00f6nlendirme i\u015flevini yerine getirmek i\u00e7in vazge\u00e7ilmezdir, \u00f6rne\u011fin kimlik do\u011frulama, yetkilendirme, veri do\u011frulama, loglama ve hata y\u00f6netimi gibi.<\/p>\n<p>Middleware'ler uygulaman\u0131n geneline (<code>app.use()<\/code>), belirli bir router grubuna (<code>router.use()<\/code>) veya tek bir rotaya \u00f6zg\u00fc olarak (<code>app.get(&#039;\/&#039;, myMiddleware, handler)<\/code>) uygulanabilir. \u00d6rne\u011fin, bir API anahtar\u0131 do\u011frulama middleware'i, her gelen iste\u011fin ge\u00e7erli bir API anahtar\u0131 i\u00e7erip i\u00e7ermedi\u011fini kontrol edebilir. E\u011fer anahtar eksik veya ge\u00e7ersizse, iste\u011fi hemen sonland\u0131rabilir ve bir hata mesaj\u0131 d\u00f6nd\u00fcrebilir. Bu sayede, her rota i\u015fleyicisine ayn\u0131 do\u011frulama mant\u0131\u011f\u0131n\u0131 tekrar tekrar yazmak zorunda kalmazs\u0131n\u0131z, bu da kod tekrar\u0131n\u0131 \u00f6nler ve bak\u0131m kolayl\u0131\u011f\u0131 sa\u011flar. \u00d6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, middleware zincirleri olu\u015fturarak karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 y\u00f6netmek \u00e7ok daha pratik hale gelir. \u00d6rne\u011fin, bir istek \u00f6nce loglama middleware'inden, sonra kimlik do\u011frulama middleware'inden, ard\u0131ndan yetkilendirme middleware'inden ge\u00e7ebilir ve son olarak as\u0131l rota i\u015fleyicisine ula\u015fabilir.<\/p>\n<p>Hata y\u00f6netimi de middleware'lerin kritik bir kullan\u0131m alan\u0131d\u0131r. Express'te \u00f6zel bir hata middleware'i tan\u0131mlayarak (d\u00f6rt parametre alan bir fonksiyon: <code>(err, req, res, next)<\/code>), uygulaman\u0131zda meydana gelen beklenmedik hatalar\u0131 merkezi bir yerde yakalayabilir ve kullan\u0131c\u0131ya tutarl\u0131 hata mesajlar\u0131 d\u00f6nd\u00fcrebilirsiniz. Bu, hem kullan\u0131c\u0131 deneyimini iyile\u015ftirir hem de uygulaman\u0131z\u0131n g\u00fcvenli\u011fini art\u0131r\u0131r, \u00e7\u00fcnk\u00fc hassas hata bilgilerinin d\u0131\u015far\u0131 s\u0131zmas\u0131n\u0131 engellersiniz. TypeScript ile bu hata middleware'ini tip a\u00e7\u0131s\u0131ndan g\u00fcvenli hale getirmek, farkl\u0131 hata tiplerini daha etkili bir \u015fekilde i\u015flemenize olanak tan\u0131r. Bir ba\u015fka ger\u00e7ek d\u00fcnya senaryosu ise, kullan\u0131c\u0131n\u0131n belirli bir kayna\u011fa eri\u015fim yetkisinin olup olmad\u0131\u011f\u0131n\u0131 kontrol eden bir yetkilendirme middleware'i olabilir. Diyelim ki, sadece \"admin\" rol\u00fcne sahip kullan\u0131c\u0131lar belirli bir API u\u00e7 noktas\u0131na eri\u015febilsin. Bu kontrol\u00fc her rotada yapmak yerine, tek bir yetkilendirme middleware'i yazarak kodu \u00e7ok daha temiz tutabiliriz.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Middleware'leri mant\u0131ksal gruplara ay\u0131rmak i\u00e7in ayr\u0131 dosyalarda tan\u0131mlay\u0131n (\u00f6rne\u011fin, <code>src\/middleware\/auth.ts<\/code>). Bu, kod okunabilirli\u011fini art\u0131r\u0131r ve projenizin organizasyonunu g\u00fc\u00e7lendirir. \u00d6zellikle \u00e7ok say\u0131da middleware kullan\u0131yorsan\u0131z bu yakla\u015f\u0131m kurtar\u0131c\u0131 olacakt\u0131r.\n<\/div>\n<pre><code>\n\/\/ src\/middleware\/auth.ts\nimport { Request, Response, NextFunction } from 'express';\n\n\/\/ Request tipine \u00f6zel bir alan eklemek i\u00e7in geni\u015fletme\n\/\/ Bu, request objesine userId gibi \u00f6zel veriler eklemenize olanak tan\u0131r.\ndeclare global {\n  namespace Express {\n    interface Request {\n      userId?: string;\n      userRole?: 'admin' | 'editor' | 'guest';\n    }\n  }\n}\n\nexport const authenticateAPIKey = (req: Request, res: Response, next: NextFunction) => {\n  const apiKey = req.headers['x-api-key'] as string;\n\n  if (!apiKey || apiKey !== 'SECRET_API_KEY') {\n    return res.status(401).send('Yetkisiz Eri\u015fim: Ge\u00e7ersiz veya Eksik API Anahtar\u0131');\n  }\n\n  \/\/ \u00d6rnek olarak kullan\u0131c\u0131 ID'si ekleyelim\n  req.userId = 'sample_user_123';\n  req.userRole = 'admin'; \/\/ Rol atamas\u0131\n  next(); \/\/ Bir sonraki middleware'e veya rota i\u015fleyicisine ge\u00e7\n};\n\nexport const authorizeRole = (requiredRole: 'admin' | 'editor' | 'guest') => {\n  return (req: Request, res: Response, next: NextFunction) => {\n    if (!req.userRole || req.userRole !== requiredRole) {\n      return res.status(403).send('Yasak: Bu kayna\u011fa eri\u015fim yetkiniz yok.');\n    }\n    next();\n  };\n};\n\n\/\/ src\/app.ts (veya router dosyas\u0131) i\u00e7inde kullan\u0131m\nimport express, { Application, Request, Response, NextFunction } from 'express';\nimport { authenticateAPIKey, authorizeRole } from '.\/middleware\/auth';\n\nconst app: Application = express();\napp.use(express.json());\n\n\/\/ T\u00fcm rotalar i\u00e7in API anahtar\u0131 do\u011frulamas\u0131n\u0131 uygula\napp.use(authenticateAPIKey);\n\napp.get('\/public', (req: Request, res: Response) => {\n  res.send('Bu herkese a\u00e7\u0131k bir rota.');\n});\n\n\/\/ Sadece adminlerin eri\u015febilece\u011fi bir rota\napp.get('\/admin-dashboard', authorizeRole('admin'), (req: Request, res: Response) => {\n  res.send(<code>Y\u00f6netici Paneli. Giri\u015f yapan kullan\u0131c\u0131 ID: ${req.userId}, Rol: ${req.userRole}<\/code>);\n});\n\n\/\/ Hata y\u00f6netimi middleware'i (her zaman di\u011fer middleware'lerden sonra gelmeli)\napp.use((err: Error, req: Request, res: Response, next: NextFunction) => {\n  console.error(err.stack);\n  res.status(500).send('Sunucu taraf\u0131nda bir hata olu\u015ftu.');\n});\n\n<\/pre>\n<p><\/code><\/p>\n<h2>Mod\u00fcler ve \u00d6l\u00e7eklenebilir Routing Mimarisi Nas\u0131l Tasarlan\u0131r?<\/h2>\n<p>B\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar geli\u015ftirirken, t\u00fcm rotalar\u0131 tek bir dosyada tutmak h\u0131zla y\u00f6netilemez bir hale gelir. Kod tekrar\u0131, d\u00fc\u015f\u00fck okunabilirlik ve zorlu bak\u0131m s\u00fcre\u00e7leri ka\u00e7\u0131n\u0131lmaz olur. \u0130\u015fte bu noktada mod\u00fcler y\u00f6nlendirme mimarileri devreye girer. Express.js'in <code>express.Router()<\/code> s\u0131n\u0131f\u0131, bu mod\u00fclerli\u011fi sa\u011flamak i\u00e7in tasarlanm\u0131\u015ft\u0131r. <code>express.Router()<\/code> ile belirli bir kaynak veya i\u015f alan\u0131 (\u00f6rne\u011fin, kullan\u0131c\u0131lar, \u00fcr\u00fcnler, sipari\u015fler) i\u00e7in kendi \u00f6zel y\u00f6nlendirme \u00f6rneklerini olu\u015fturabilir, bunlar\u0131 ayr\u0131 dosyalarda tan\u0131mlayabilir ve daha sonra ana Express uygulamas\u0131na ba\u011flayabilirsiniz. Bu yakla\u015f\u0131m, uygulaman\u0131z\u0131n farkl\u0131 b\u00f6l\u00fcmlerinin ba\u011f\u0131ms\u0131z olarak geli\u015ftirilmesini ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Mod\u00fcler bir yap\u0131 kurarken, genellikle kaynak bazl\u0131 bir organizasyon tercih edilir. Yani, her bir kayna\u011f\u0131n (<code>users<\/code>, <code>products<\/code>, <code>orders<\/code>) kendi router dosyas\u0131, controller'\u0131 ve muhtemelen servis katman\u0131 olur. \u00d6rne\u011fin, <code>src\/routes\/userRoutes.ts<\/code> dosyas\u0131 t\u00fcm kullan\u0131c\u0131larla ilgili rotalar\u0131 tan\u0131mlarken, <code>src\/controllers\/userController.ts<\/code> bu rotalar\u0131n i\u015f mant\u0131\u011f\u0131n\u0131 (kullan\u0131c\u0131 olu\u015fturma, g\u00fcncelleme, silme) bar\u0131nd\u0131r\u0131r. Bu ayr\u0131m, kodun sorumluluklar\u0131n\u0131 net bir \u015fekilde belirler (Separation of Concerns prensibi) ve projenizin genel mimarisini daha d\u00fczenli hale getirir. Her dosya veya mod\u00fcl sadece belirli bir g\u00f6reve odakland\u0131\u011f\u0131 i\u00e7in, bir hatan\u0131n kayna\u011f\u0131n\u0131 bulmak veya yeni bir \u00f6zellik eklemek \u00e7ok daha kolayla\u015f\u0131r. Bu yakla\u015f\u0131m, uygulaman\u0131z\u0131 test edilebilirli\u011fi a\u00e7\u0131s\u0131ndan da b\u00fcy\u00fck avantajlar sunar, \u00e7\u00fcnk\u00fc her bir mod\u00fcl ba\u011f\u0131ms\u0131z olarak test edilebilir.<\/p>\n<p>Ger\u00e7ek d\u00fcnya senaryosunda, b\u00fcy\u00fck bir e-ticaret platformunu d\u00fc\u015f\u00fcnelim. Bu platformda \u00fcr\u00fcnler, kullan\u0131c\u0131lar, sipari\u015fler, \u00f6demeler gibi bir\u00e7ok farkl\u0131 mod\u00fcl bulunur. Her mod\u00fcl\u00fcn kendine ait API u\u00e7 noktalar\u0131 vard\u0131r. Mod\u00fcler y\u00f6nlendirme sayesinde, <code>\/api\/v1\/products<\/code> ile ilgili t\u00fcm rotalar <code>productRoutes.ts<\/code> i\u00e7inde, <code>\/api\/v1\/users<\/code> ile ilgili rotalar ise <code>userRoutes.ts<\/code> i\u00e7inde tan\u0131mlanabilir. Ana <code>app.ts<\/code> dosyas\u0131 sadece bu router'lar\u0131 uygulaman\u0131n belirli bir yol \u00f6neki alt\u0131nda ba\u011flar. \u00d6rne\u011fin, <code>app.use('\/api\/v1\/products', productRouter)<\/code> \u015feklinde bir kullan\u0131m, \u00fcr\u00fcn API'lerine giden t\u00fcm isteklerin <code>productRouter<\/code> taraf\u0131ndan i\u015flenmesini sa\u011flar. Ayr\u0131ca, API versiyonlama (<code>\/api\/v1<\/code>, <code>\/api\/v2<\/code>) i\u00e7in de bu mod\u00fcler yap\u0131 idealdir. Eski versiyon rotalar\u0131n\u0131 korurken yeni versiyonlar i\u00e7in ayr\u0131 router'lar tan\u0131mlayabilirsiniz. Bu esneklik, API'nizin evrim ge\u00e7irmesini ve geriye d\u00f6n\u00fck uyumlulu\u011fu s\u00fcrd\u00fcrmesini kolayla\u015ft\u0131r\u0131r, bu da uzun \u00f6m\u00fcrl\u00fc ve s\u00fcrd\u00fcr\u00fclebilir bir yaz\u0131l\u0131m geli\u015ftirme i\u00e7in kritik bir fakt\u00f6rd\u00fcr.<\/p>\n<pre><code>\n\/\/ src\/controllers\/userController.ts\nimport { Request, Response } from 'express';\n\n\/\/ Tip g\u00fcvenli\u011fi i\u00e7in Request parametrelerini tan\u0131mlayal\u0131m\ninterface UserParams {\n  id: string;\n}\n\ninterface UserBody {\n  ad: string;\n  email: string;\n}\n\nexport const getAllUsers = (req: Request, res: Response) => {\n  \/\/ Veritaban\u0131ndan t\u00fcm kullan\u0131c\u0131lar\u0131 \u00e7ekme mant\u0131\u011f\u0131\n  const users = [{ id: '1', ad: 'Ali', email: 'ali@example.com' }];\n  res.json(users);\n};\n\nexport const getUserById = (req: Request<UserParams>, res: Response) => {\n  const { id } = req.params;\n  \/\/ Veritaban\u0131ndan belirli bir kullan\u0131c\u0131y\u0131 \u00e7ekme mant\u0131\u011f\u0131\n  const user = { id, ad: <code>Kullan\u0131c\u0131 ${id}<\/code>, email: <code>user${id}@example.com<\/code> };\n  res.json(user);\n};\n\nexport const createUser = (req: Request<{}, {}, UserBody>, res: Response) => {\n  const { ad, email } = req.body;\n  if (!ad || !email) {\n    return res.status(400).send('Ad ve email zorunludur.');\n  }\n  \/\/ Yeni kullan\u0131c\u0131y\u0131 veritaban\u0131na kaydetme mant\u0131\u011f\u0131\n  const newUser = { id: String(Date.now()), ad, email };\n  res.status(201).json(newUser);\n};\n\n\/\/ src\/routes\/userRoutes.ts\nimport { Router } from 'express';\nimport { getAllUsers, getUserById, createUser } from '..\/controllers\/userController';\nimport { authenticateAPIKey, authorizeRole } from '..\/middleware\/auth';\n\nconst router = Router();\n\n\/\/ Middleware'leri router seviyesinde uygulayabiliriz\n\/\/ router.use(authenticateAPIKey); \/\/ T\u00fcm kullan\u0131c\u0131 rotalar\u0131 i\u00e7in kimlik do\u011frulama\n\nrouter.get('\/', getAllUsers);\nrouter.get('\/:id', getUserById);\nrouter.post('\/', authorizeRole('admin'), createUser); \/\/ Sadece adminler yeni kullan\u0131c\u0131 olu\u015fturabilir\n\nexport default router;\n\n\/\/ src\/app.ts\nimport express, { Application } from 'express';\nimport userRoutes from '.\/routes\/userRoutes';\nimport productRoutes from '.\/routes\/productRoutes'; \/\/ \u00d6rnek olarak bir \u00fcr\u00fcn rotas\u0131 da ekleyelim\nimport { authenticateAPIKey } from '.\/middleware\/auth'; \/\/ Ana middleware'i de buraya ekleyebiliriz\n\nconst app: Application = express();\nconst PORT: number = 3000;\n\napp.use(express.json());\n\n\/\/ Uygulama genelinde ge\u00e7erli middleware'ler\napp.use(authenticateAPIKey);\n\n\/\/ Mod\u00fcler rotalar\u0131 ba\u011fla\napp.use('\/api\/v1\/users', userRoutes);\n\/\/ app.use('\/api\/v1\/products', productRoutes); \/\/ \u00dcr\u00fcn rotalar\u0131n\u0131 da benzer \u015fekilde ba\u011flayabiliriz\n\napp.listen(PORT, () => {\n  console.log(<code>Sunucu http:\/\/localhost:${PORT} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});\n\n<\/pre>\n<p><\/code><\/p>\n<h3>TypeScript ile Tip G\u00fcvenli Rotalar ve Parametreler Nas\u0131l Y\u00f6netilir?<\/h3>\n<p>TypeScript'in en b\u00fcy\u00fck faydas\u0131, tip g\u00fcvenli\u011fi sa\u011flamas\u0131d\u0131r. Express.js ile \u00e7al\u0131\u015f\u0131rken bu, \u00f6zellikle HTTP isteklerinden gelen verileri (parametreler, sorgu dizeleri, istek g\u00f6vdesi) i\u015flerken hayati \u00f6nem ta\u015f\u0131r. Varsay\u0131lan olarak, Express'teki <code>req.params<\/code>, <code>req.query<\/code> ve <code>req.body<\/code> gibi alanlar <code>any<\/code> tipindedir, bu da geli\u015ftirme s\u0131ras\u0131nda potansiyel hatalar\u0131 gizleyebilir. TypeScript'i do\u011fru kullanarak, bu alanlara beklenen tipleri atayabilir ve b\u00f6ylece \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 derleme zaman\u0131nda yakalayabilirsiniz. Bu, daha \u00f6ng\u00f6r\u00fclebilir, bak\u0131m\u0131 kolay ve g\u00fcvenilir kod yazman\u0131z\u0131 sa\u011flar.<\/p>\n<p>Tip g\u00fcvenli\u011fi sa\u011flaman\u0131n ilk ad\u0131m\u0131, iste\u011fin farkl\u0131 b\u00f6l\u00fcmleri i\u00e7in \u00f6zel aray\u00fczler (interfaces) veya tipler (types) tan\u0131mlamakt\u0131r. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n ID'sini i\u00e7eren bir URL parametresi i\u00e7in <code>UserParams<\/code> aray\u00fcz\u00fc, bir kullan\u0131c\u0131 olu\u015fturma iste\u011finin g\u00f6vdesi i\u00e7in <code>UserBody<\/code> aray\u00fcz\u00fc tan\u0131mlayabilirsiniz. Express'in <code>Request<\/code> tipi, generik tipleri kabul eder ve bu sayede <code>Request<Params, ResBody, ReqBody, ReqQuery><\/code> \u015feklinde tip tan\u0131mlamalar\u0131 yapabilirsiniz. Bu, rota i\u015fleyicinizin veya middleware'inizin bekledi\u011fi veri yap\u0131s\u0131n\u0131 a\u00e7\u0131k\u00e7a belirtir. Bu sayede, yanl\u0131\u015f bir alana eri\u015fmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda veya yanl\u0131\u015f bir tipte veri g\u00f6ndermeye kalkt\u0131\u011f\u0131n\u0131zda TypeScript derleyicisi sizi uyaracakt\u0131r. Bu, \u00f6zellikle b\u00fcy\u00fck ekiplerde ve karma\u015f\u0131k API'lerde kod kalitesini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r ve belgeleme ihtiyac\u0131n\u0131 azalt\u0131r, \u00e7\u00fcnk\u00fc tipler kodun kendisi i\u00e7in bir belge g\u00f6revi g\u00f6r\u00fcr.<\/p>\n<p>Veri do\u011frulama (validation) da tip g\u00fcvenli rotalar\u0131n ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r. TypeScript tek ba\u015f\u0131na veri tiplerini derleme zaman\u0131nda kontrol etse de, \u00e7al\u0131\u015fma zaman\u0131nda gelen verilerin (\u00f6rne\u011fin bir POST iste\u011finin g\u00f6vdesi) belirli kurallara (e-posta format\u0131, say\u0131 aral\u0131\u011f\u0131 vb.) uygun olup olmad\u0131\u011f\u0131n\u0131 garanti etmez. Bu noktada Zod veya Joi gibi g\u00fc\u00e7l\u00fc validasyon k\u00fct\u00fcphaneleri devreye girer. Bu k\u00fct\u00fcphaneleri TypeScript ile entegre ederek, hem veri yap\u0131lar\u0131n\u0131 tip a\u00e7\u0131s\u0131ndan tan\u0131mlayabilir hem de \u00e7al\u0131\u015fma zaman\u0131nda do\u011frulayabilirsiniz. \u00d6rne\u011fin, Zod ile bir \u015fema tan\u0131mlad\u0131\u011f\u0131n\u0131zda, bu \u015femadan otomatik olarak bir TypeScript tipi t\u00fcretebilirsiniz. Gelen iste\u011fin g\u00f6vdesini bu \u015femaya g\u00f6re do\u011frulay\u0131p, do\u011frulanan veriyi g\u00fcvenli bir \u015fekilde kullanabilirsiniz. B\u00f6ylece, API'nize gelen verinin her zaman bekledi\u011finiz formatta olaca\u011f\u0131ndan emin olursunuz, bu da uygulaman\u0131z\u0131n k\u0131r\u0131lganl\u0131\u011f\u0131n\u0131 azalt\u0131r ve hata oran\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr. Ayr\u0131ca, bu yakla\u015f\u0131m, uygulaman\u0131z\u0131n g\u00fcvenli\u011fini de art\u0131r\u0131r, \u00e7\u00fcnk\u00fc beklenmeyen veya k\u00f6t\u00fc ama\u00e7l\u0131 verilerin sisteminize s\u0131zmas\u0131n\u0131 engeller.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Express'in Request objesini geni\u015fletmek i\u00e7in <code>declare global<\/code> mekanizmas\u0131n\u0131 kullan\u0131n. Bu sayede, middleware'leriniz taraf\u0131ndan <code>req<\/code> objesine eklenen \u00f6zel alanlar\u0131 (<code>req.userId<\/code> gibi) tip g\u00fcvenli hale getirebilirsiniz. Bu, \u00f6zellikle kimlik do\u011frulama veya yetkilendirme sonras\u0131 kullan\u0131c\u0131 bilgilerini ta\u015f\u0131yan senaryolarda \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.\n<\/div>\n<pre><code>\n\/\/ src\/types\/express.d.ts - Express Request tipini geni\u015fletmek i\u00e7in\n\/\/ Bu dosyan\u0131n tsconfig.json taraf\u0131ndan include edildi\u011finden emin olun\nimport { Request } from 'express';\n\ndeclare global {\n  namespace Express {\n    interface Request {\n      \/\/ Middleware'ler taraf\u0131ndan eklenecek \u00f6zel alanlar\n      user?: {\n        id: string;\n        email: string;\n        role: 'admin' | 'user' | 'guest';\n      };\n      \/\/ Di\u011fer \u00f6zel tipler buraya eklenebilir\n    }\n  }\n}\n\n\/\/ src\/schemas\/userSchema.ts (\u00f6rne\u011fin, Zod ile)\nimport { z } from 'zod';\n\n\/\/ Kullan\u0131c\u0131 olu\u015fturma iste\u011fi i\u00e7in \u015fema\nexport const createUserSchema = z.object({\n  ad: z.string().min(3, 'Ad en az 3 karakter olmal\u0131d\u0131r.'),\n  email: z.string().email('Ge\u00e7erli bir e-posta adresi giriniz.'),\n  sifre: z.string().min(6, '\u015eifre en az 6 karakter olmal\u0131d\u0131r.'),\n});\n\n\/\/ Zod \u015femas\u0131ndan TypeScript tipi t\u00fcretme\nexport type CreateUserBody = z.infer<typeof createUserSchema>;\n\n\/\/ src\/controllers\/userController.ts (g\u00fcncellenmi\u015f)\nimport { Request, Response } from 'express';\nimport { CreateUserBody } from '..\/schemas\/userSchema'; \/\/ Tipimizi import ettik\n\ninterface UserParams {\n  id: string;\n}\n\n\/\/ req.body i\u00e7in CreateUserBody tipini kulland\u0131k\nexport const createUser = (req: Request<{}, {}, CreateUserBody>, res: Response) => {\n  const { ad, email, sifre } = req.body; \/\/ Art\u0131k ad, email, sifre tip g\u00fcvenli!\n  \n  \/\/ Burada Zod ile \u00e7al\u0131\u015fma zaman\u0131 validasyonu da yapabiliriz\n  try {\n    createUserSchema.parse(req.body); \/\/ Gelen veriyi \u015femaya g\u00f6re do\u011frula\n  } catch (error) {\n    return res.status(400).json(error); \/\/ Validasyon hatas\u0131n\u0131 d\u00f6nd\u00fcr\n  }\n\n  \/\/ Kullan\u0131c\u0131y\u0131 veritaban\u0131na kaydetme mant\u0131\u011f\u0131\n  const newUser = { id: String(Date.now()), ad, email, sifre, role: 'user' };\n  res.status(201).json(newUser);\n};\n\n\/\/ src\/routes\/userRoutes.ts (g\u00fcncellenmi\u015f)\nimport { Router } from 'express';\nimport { createUser } from '..\/controllers\/userController';\nimport { authorizeRole } from '..\/middleware\/auth';\n\nconst router = Router();\n\nrouter.post('\/', authorizeRole('admin'), createUser);\n\nexport default router;\n\n<\/pre>\n<p><\/code><\/p>\n<h2>Geli\u015fmi\u015f Routing Teknikleri ve Performans \u0130pu\u00e7lar\u0131 Nelerdir?<\/h2>\n<p>Bir Express.js uygulamas\u0131n\u0131 sadece \u00e7al\u0131\u015f\u0131r hale getirmek bir ba\u015flang\u0131\u00e7t\u0131r, ancak onu y\u00fcksek performansl\u0131, g\u00fcvenli ve s\u00fcrd\u00fcr\u00fclebilir k\u0131lmak geli\u015fmi\u015f teknikler gerektirir. Routing katman\u0131n\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131, uygulaman\u0131z\u0131n genel performans\u0131n\u0131 ve kullan\u0131c\u0131 deneyimini do\u011frudan etkiler. Bu b\u00f6l\u00fcmde, Express ve TypeScript ile uygulayabilece\u011finiz baz\u0131 geli\u015fmi\u015f y\u00f6nlendirme tekniklerine ve performans optimizasyonlar\u0131na odaklanaca\u011f\u0131z.<\/p>\n<p>\u0130lk olarak, asenkron i\u015flemler ve hata yakalama Express uygulamalar\u0131nda kritik bir rol oynar. Modern Node.js geli\u015ftirme, yo\u011funlukla <code>async\/await<\/code> s\u00f6zdizimiyle asenkron fonksiyonlar kullan\u0131r. Rota i\u015fleyicilerinizde veya middleware'lerinizde asenkron operasyonlar (veritaban\u0131 sorgular\u0131, a\u011f istekleri vb.) kulland\u0131\u011f\u0131n\u0131zda, bu i\u015flemlerin potansiyel hatalar\u0131n\u0131 d\u00fczg\u00fcn bir \u015fekilde y\u00f6netmek \u00e7ok \u00f6nemlidir. Express varsay\u0131lan olarak <code>async\/await<\/code> ile f\u0131rlat\u0131lan hatalar\u0131 otomatik olarak yakalamaz. Bu nedenle, her asenkron i\u015flem i\u00e7in manuel <code>try-catch<\/code> bloklar\u0131 eklemek yerine, <code>express-async-errors<\/code> gibi k\u00fct\u00fcphaneler kullanabilir veya kendi \u00f6zel hata sar\u0131c\u0131 (wrapper) fonksiyonlar\u0131n\u0131z\u0131 yazarak bu hatalar\u0131 merkezi bir hata i\u015fleyici middleware'ine y\u00f6nlendirebilirsiniz. Bu, kodunuzu daha temiz ve hata y\u00f6netimini daha tutarl\u0131 hale getirir.<\/p>\n<p>Performans a\u00e7\u0131s\u0131ndan, \u00f6nbellekleme (caching) ve oran s\u0131n\u0131rlama (rate limiting) stratejileri, API'lerinizin y\u00fck alt\u0131nda daha iyi performans g\u00f6stermesini sa\u011flar. Route caching, s\u0131k eri\u015filen ve de\u011fi\u015fmeyen verileri (\u00f6rne\u011fin, statik i\u00e7erikler veya nadiren g\u00fcncellenen \u00fcr\u00fcn listeleri) belirli bir s\u00fcre bellekte tutarak her istekte veritaban\u0131na gitme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r. Bu, yan\u0131t s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve sunucu \u00fczerindeki y\u00fck\u00fc hafifletir. Oran s\u0131n\u0131rlama ise, belirli bir zaman diliminde bir IP adresinden veya bir kullan\u0131c\u0131dan gelen istek say\u0131s\u0131n\u0131 k\u0131s\u0131tlayarak API'nizi k\u00f6t\u00fcye kullan\u0131ma (\u00f6rne\u011fin, DoS sald\u0131r\u0131lar\u0131 veya kaba kuvvet denemeleri) kar\u015f\u0131 korur. <code>express-rate-limit<\/code> gibi k\u00fct\u00fcphaneler bu i\u015flevi kolayca entegre etmenizi sa\u011flar. Bu t\u00fcr g\u00fcvenlik ve performans \u00f6nlemleri, \u00f6zellikle halka a\u00e7\u0131k API'ler i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<p>Ayr\u0131ca, mobil uyumlu API tasar\u0131m\u0131, modern uygulamalar\u0131n \u00f6nemli bir par\u00e7as\u0131d\u0131r. Gelen isteklerin mobil cihazlardan m\u0131 yoksa masa\u00fcst\u00fcnden mi geldi\u011fini tespit ederek, farkl\u0131 cihazlara farkl\u0131 yan\u0131tlar (\u00f6rne\u011fin, daha az veri veya farkl\u0131 formatta) g\u00f6nderebilirsiniz. Bu, routing seviyesinde bir middleware ile kontrol edilebilir veya <code>User-Agent<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 inceleyerek yap\u0131labilir. Her ne kadar y\u00f6nlendirme do\u011frudan mobil uyumlu HTML \u00fcretmese de, API'nizin mobil \u00f6n u\u00e7lar i\u00e7in daha optimize edilmi\u015f yan\u0131tlar vermesi genel kullan\u0131c\u0131 deneyimini iyile\u015ftirir. A\u015fa\u011f\u0131da bir CSS medya sorgusu \u00f6rne\u011fi verilmi\u015ftir, ancak API'nizin bu t\u00fcr bir esneklik sunmas\u0131, \u00f6n u\u00e7 geli\u015ftiricilere daha fazla kontrol sa\u011flar. Son olarak, API versiyonlama, API'nizin zaman i\u00e7inde evrimle\u015fmesini sa\u011flar. URL tabanl\u0131 (<code>\/v1\/users<\/code>, <code>\/v2\/users<\/code>) veya Header tabanl\u0131 (<code>Accept-version: 1.0<\/code>) versiyonlama stratejileri, istemcilerinizin eski API s\u00fcr\u00fcmlerini kullanmaya devam ederken yeni \u00f6zellikler eklemenize olanak tan\u0131r. Bu, b\u00fcy\u00fck ve s\u00fcrekli geli\u015fen projeler i\u00e7in kritik bir y\u00f6netim stratejisidir.<\/p>\n<pre><code>\n\/\/ src\/utils\/asyncHandler.ts\nimport { Request, Response, NextFunction } from 'express';\n\n\/\/ Asenkron hata yakalama sarmalay\u0131c\u0131s\u0131 (wrapper)\nconst asyncHandler = (fn: (req: Request, res: Response, next: NextFunction) => Promise<any>) =>\n  (req: Request, res: Response, next: NextFunction) => {\n    Promise.resolve(fn(req, res, next)).catch(next);\n  };\n\nexport default asyncHandler;\n\n\/\/ src\/controllers\/productController.ts (asyncHandler kullan\u0131m\u0131 ile)\nimport { Request, Response } from 'express';\nimport asyncHandler from '..\/utils\/asyncHandler';\n\nexport const getProductById = asyncHandler(async (req: Request<{ id: string }>, res: Response) => {\n  const { id } = req.params;\n  \/\/ Sim\u00fcle edilmi\u015f veritaban\u0131 i\u015flemi\n  const product = await new Promise(resolve => setTimeout(() => {\n    if (id === '1') {\n      resolve({ id: '1', ad: 'Laptop', fiyat: 15000 });\n    } else {\n      resolve(null);\n    }\n  }, 100));\n\n  if (!product) {\n    return res.status(404).send('\u00dcr\u00fcn bulunamad\u0131.');\n  }\n  res.json(product);\n});\n\n\/\/ src\/app.ts (veya router dosyas\u0131) i\u00e7inde\nimport express, { Application, Request, Response, NextFunction } from 'express';\nimport { getProductById } from '.\/controllers\/productController';\nimport rateLimit from 'express-rate-limit'; \/\/ express-rate-limit k\u00fct\u00fcphanesi\n\nconst app: Application = express();\napp.use(express.json());\n\n\/\/ Oran s\u0131n\u0131rlama middleware'i\nconst apiLimiter = rateLimit({\n  windowMs: 15 * 60 * 1000, \/\/ 15 dakika\n  max: 100, \/\/ Her IP i\u00e7in 15 dakikada 100 istek\n  message: \"\u00c7ok fazla istek g\u00f6nderdiniz, l\u00fctfen bir s\u00fcre sonra tekrar deneyin.\"\n});\n\napp.use('\/api\/', apiLimiter); \/\/ T\u00fcm \/api rotalar\u0131na oran s\u0131n\u0131rlama uygula\n\napp.get('\/api\/products\/:id', getProductById);\n\n\/\/ CSS media query \u00f6rne\u011fi (HTML i\u00e7inde bir div'in stilini de\u011fi\u015ftirmek i\u00e7in)\n\/\/ Bu sadece bir \u00f6rnektir ve API'nin do\u011frudan responsive davran\u0131\u015f\u0131 ile ilgili de\u011fildir,\n\/\/ ancak mobil uyumlu tasar\u0131m\u0131 genel olarak destekleme anlam\u0131nda verilmi\u015ftir.\n\/*\n<style>\n  .content {\n    width: 90%;\n    margin: auto;\n  }\n\n  \/\/ Mobil cihazlar i\u00e7in stil\n  @media (max-width: 768px) {\n    .content {\n      width: 100%;\n      padding: 10px;\n    }\n    h2 {\n      font-size: 1.2em;\n    }\n  }\n<\/style>\n*\/\n\n\/\/ Hata y\u00f6netimi middleware'i (en sona konulmal\u0131)\napp.use((err: Error, req: Request, res: Response, next: NextFunction) => {\n  console.error('Yakalanan hata:', err.stack);\n  res.status(500).send('Beklenmedik bir sunucu hatas\u0131 olu\u015ftu.');\n});\n\n<\/pre>\n<p><\/code><\/p>\n<h2>Sonu\u00e7: Gelece\u011fe Y\u00f6nelik Bir Bak\u0131\u015f<\/h2>\n<p>Bu makalede, Express.js ve TypeScript'in g\u00fc\u00e7l\u00fc kombinasyonunu kullanarak modern, \u00f6l\u00e7eklenebilir ve bak\u0131m\u0131 kolay API'ler olu\u015fturman\u0131n inceliklerini derinlemesine inceledik. Temel y\u00f6nlendirme mekanizmalar\u0131ndan ba\u015flayarak, middleware'in g\u00fcc\u00fcn\u00fc, mod\u00fcler bir routing mimarisinin faydalar\u0131n\u0131, TypeScript ile tip g\u00fcvenli rotalar\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 ve son olarak geli\u015fmi\u015f performans ve g\u00fcvenlik tekniklerini ele ald\u0131k. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, do\u011fru ara\u00e7lar ve stratejilerle, karma\u015f\u0131k API'lerinizi bile d\u00fczenli, anla\u015f\u0131l\u0131r ve verimli bir \u015fekilde y\u00f6netebilirsiniz. TypeScript'in tip g\u00fcvenli\u011fi, geli\u015ftirme s\u00fcrecindeki hatalar\u0131 en aza indirirken, Express.js'in esnekli\u011fi size projenizin gerektirdi\u011fi her t\u00fcrl\u00fc \u00f6zelle\u015ftirmeyi yapma imkan\u0131 sunar.<\/p>\n<p>Modern web uygulamalar\u0131 s\u00fcrekli evrim ge\u00e7iriyor ve geli\u015ftiricilerden her zamankinden daha fazla esneklik ve verimlilik bekleniyor. Express ve TypeScript ile y\u00f6nlendirme konusunda ustala\u015fmak, sadece bug\u00fcn\u00fcn de\u011fil, yar\u0131n\u0131n da karma\u015f\u0131k API gereksinimlerini kar\u015f\u0131laman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Bu teknikleri projelerinize uygulayarak, daha sa\u011flam bir kod taban\u0131 olu\u015fturacak, ekip i\u00e7i i\u015fbirli\u011fini kolayla\u015ft\u0131racak ve sonu\u00e7 olarak daha kaliteli \u00fcr\u00fcnler ortaya koyacaks\u0131n\u0131z. Unutmay\u0131n, iyi tasarlanm\u0131\u015f bir y\u00f6nlendirme altyap\u0131s\u0131, uygulaman\u0131z\u0131n gelecekteki b\u00fcy\u00fcmesini destekleyen temel bir yat\u0131r\u0131md\u0131r. \u015eimdi bu bilgileri prati\u011fe d\u00f6kme ve Express ve TypeScript ile API geli\u015ftirme becerilerinizi bir sonraki seviyeye ta\u015f\u0131ma zaman\u0131.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ul>\n<li>\n<h4>Express ile TypeScript kullanmak performans\u0131 etkiler mi?<\/h4>\n<p>Hay\u0131r, TypeScript derleme zaman\u0131nda JavaScript'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc\u011f\u00fc i\u00e7in \u00e7al\u0131\u015fma zaman\u0131 performans\u0131na do\u011frudan bir etkisi yoktur. Performans, yazd\u0131\u011f\u0131n\u0131z JavaScript kodunun kalitesine ve kulland\u0131\u011f\u0131n\u0131z k\u00fct\u00fcphanelere ba\u011fl\u0131d\u0131r. TypeScript, hatalar\u0131 erken yakalayarak geli\u015ftirme s\u00fcrecindeki zaman kayb\u0131n\u0131 azalt\u0131r ve daha optimize edilmi\u015f kod yazman\u0131za yard\u0131mc\u0131 olabilir.<\/p>\n<\/li>\n<li>\n<h4>Hangi durumlarda <code>express.Router()<\/code> kullanmal\u0131y\u0131m?<\/h4>\n<p><code>express.Router()<\/code>, uygulaman\u0131zda belirli bir mod\u00fcl, kaynak veya API versiyonuna ait rotalar\u0131 grupland\u0131rmak istedi\u011finizde kullan\u0131lmal\u0131d\u0131r. \u00d6zellikle projeniz b\u00fcy\u00fcd\u00fck\u00e7e veya farkl\u0131 geli\u015ftiricilerin ayn\u0131 anda farkl\u0131 \u00f6zellikler \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda kodun mod\u00fclerli\u011fini, okunabilirli\u011fini ve bak\u0131m kolayl\u0131\u011f\u0131n\u0131 art\u0131rmak i\u00e7in idealdir. T\u00fcm rotalar\u0131 tek bir dosyada tutmaktan ka\u00e7\u0131nmak istedi\u011finiz her durumda tercih edebilirsiniz.<\/p>\n<\/li>\n<li>\n<h4>B\u00fcy\u00fck projelerde routing mimarisi nas\u0131l olmal\u0131?<\/h4>\n<p>B\u00fcy\u00fck projelerde kaynak tabanl\u0131 (resource-based) ve katmanl\u0131 bir routing mimarisi \u00f6nerilir. Her bir ana kaynak (kullan\u0131c\u0131lar, \u00fcr\u00fcnler vb.) i\u00e7in ayr\u0131 bir <code>express.Router()<\/code> \u00f6rne\u011fi olu\u015fturulmal\u0131 ve bu router'lar kendi controller'lar\u0131 ve servis katmanlar\u0131yla entegre edilmelidir. Ayr\u0131ca, middleware'leri uygun seviyelerde (uygulama geneli, router veya rota \u00f6zelinde) kullanarak yetkilendirme, kimlik do\u011frulama, loglama gibi \u00e7apraz kesen endi\u015feler y\u00f6netilmelidir. API versiyonlama da b\u00fcy\u00fck projelerde esneklik sa\u011flar.<\/p>\n<\/li>\n<li>\n<h4>Route validation i\u00e7in en iyi y\u00f6ntem nedir?<\/h4>\n<p>Route validation i\u00e7in en iyi y\u00f6ntem, TypeScript'in tip sistemini Zod, Joi veya Yup gibi \u00e7al\u0131\u015fma zaman\u0131 validasyon k\u00fct\u00fcphaneleriyle birle\u015ftirmektir. Bu k\u00fct\u00fcphanelerle \u015femalar tan\u0131mlayarak gelen istek verilerini (parametreler, sorgular, g\u00f6vde) derleme zaman\u0131nda tip a\u00e7\u0131s\u0131ndan, \u00e7al\u0131\u015fma zaman\u0131nda ise i\u00e7erik ve format a\u00e7\u0131s\u0131ndan do\u011frulayabilirsiniz. Bu yakla\u015f\u0131m, hem tip g\u00fcvenli\u011fi hem de sa\u011flam veri i\u015fleme sa\u011flar, hatalar\u0131 erken a\u015famada yakalar.<\/p>\n<\/li>\n<li>\n<h4>RESTful olmayan API'lerde routing nas\u0131l yap\u0131l\u0131r?<\/h4>\n<p>RESTful olmayan API'lerde (\u00f6rne\u011fin RPC tarz\u0131 veya GraphQL gibi) routing prensipleri biraz farkl\u0131l\u0131k g\u00f6sterebilir. Express.js hala HTTP metotlar\u0131 ve yollar arac\u0131l\u0131\u011f\u0131yla iste\u011fi ilgili i\u015fleyiciye y\u00f6nlendirme yetene\u011fi sunar. RPC tarz\u0131 API'lerde genellikle tek bir ana u\u00e7 nokta (\u00f6rne\u011fin <code>\/api<\/code>) kullan\u0131l\u0131r ve iste\u011fin g\u00f6vdesindeki bir alan (\u00f6rne\u011fin <code>method<\/code>) hangi fonksiyonun \u00e7a\u011fr\u0131laca\u011f\u0131n\u0131 belirler. GraphQL API'lerinde ise genellikle tek bir <code>\/graphql<\/code> u\u00e7 noktas\u0131 bulunur ve t\u00fcm etkile\u015fimler GraphQL sorgular\u0131 veya mutasyonlar\u0131 arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015fir. Her iki durumda da Express routing, gelen iste\u011fi do\u011fru i\u015fleme katman\u0131na ula\u015ft\u0131rmak i\u00e7in temel bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr.<\/p>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"Karma\u015f\u0131k API&#8217;lerinizin y\u00f6nlendirme mant\u0131\u011f\u0131n\u0131 y\u00f6netmekte zorlan\u0131yor musunuz? \u00d6zellikle b\u00fcy\u00fck ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirirken, Express.js\u2019in esnek yap\u0131s\u0131 TypeScript\u2019in tip&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-30968","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>Mastering Routing in Express ile TypeScript<\/title>\n<meta name=\"description\" content=\"Karma\u015f\u0131k API&#039;lerinizin y\u00f6nlendirme mant\u0131\u011f\u0131n\u0131 y\u00f6netmekte zorlan\u0131yor musunuz? \u00d6zellikle b\u00fcy\u00fck ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirirken, Express.js\u2019in esnek yap\u0131s\u0131 TypeScript\u2019in tip g\u00fcvenli\u011fi ile birle\u015fti\u011finde, y\u00f6nlendirme (routing) s\u00fcre\u00e7lerinizde devrim yaratabilir. Bu makalede, Express.js ve TypeScript kullanarak sa\u011flam, bak\u0131m\u0131 kolay ve performansl\u0131 bir y\u00f6nlendirme altyap\u0131s\u0131 nas\u0131l in\u015fa edece\u011finizi ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Geli\u015fmi\u015f middleware tekniklerinden mod\u00fcler mimarilere, tip g\u00fcvenli rotalardan performans ipu\u00e7lar\u0131na kadar her \u015feyi derinlemesine inceleyece\u011fiz. Haz\u0131r olun, \u00e7\u00fcnk\u00fc Express ve TypeScript ile API geli\u015ftirme yolculu\u011funuzda yeni bir seviyeye ula\u015facaks\u0131n\u0131z.\" \/>\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\/mastering-routing-in-express-ile-typescript\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mastering Routing in Express ile TypeScript\" \/>\n<meta property=\"og:description\" content=\"Karma\u015f\u0131k API&#039;lerinizin y\u00f6nlendirme mant\u0131\u011f\u0131n\u0131 y\u00f6netmekte zorlan\u0131yor musunuz? \u00d6zellikle b\u00fcy\u00fck ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirirken, Express.js\u2019in esnek yap\u0131s\u0131 TypeScript\u2019in tip g\u00fcvenli\u011fi ile birle\u015fti\u011finde, y\u00f6nlendirme (routing) s\u00fcre\u00e7lerinizde devrim yaratabilir. Bu makalede, Express.js ve TypeScript kullanarak sa\u011flam, bak\u0131m\u0131 kolay ve performansl\u0131 bir y\u00f6nlendirme altyap\u0131s\u0131 nas\u0131l in\u015fa edece\u011finizi ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Geli\u015fmi\u015f middleware tekniklerinden mod\u00fcler mimarilere, tip g\u00fcvenli rotalardan performans ipu\u00e7lar\u0131na kadar her \u015feyi derinlemesine inceleyece\u011fiz. Haz\u0131r olun, \u00e7\u00fcnk\u00fc Express ve TypeScript ile API geli\u015ftirme yolculu\u011funuzda yeni bir seviyeye ula\u015facaks\u0131n\u0131z.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-04T01:01:17+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=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Mastering Routing in Express ile TypeScript\",\"datePublished\":\"2025-10-04T01:01:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/\"},\"wordCount\":3292,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/\",\"name\":\"Mastering Routing in Express ile TypeScript\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-04T01:01:17+00:00\",\"description\":\"Karma\u015f\u0131k API'lerinizin y\u00f6nlendirme mant\u0131\u011f\u0131n\u0131 y\u00f6netmekte zorlan\u0131yor musunuz? \u00d6zellikle b\u00fcy\u00fck ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirirken, Express.js\u2019in esnek yap\u0131s\u0131 TypeScript\u2019in tip g\u00fcvenli\u011fi ile birle\u015fti\u011finde, y\u00f6nlendirme (routing) s\u00fcre\u00e7lerinizde devrim yaratabilir. Bu makalede, Express.js ve TypeScript kullanarak sa\u011flam, bak\u0131m\u0131 kolay ve performansl\u0131 bir y\u00f6nlendirme altyap\u0131s\u0131 nas\u0131l in\u015fa edece\u011finizi ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Geli\u015fmi\u015f middleware tekniklerinden mod\u00fcler mimarilere, tip g\u00fcvenli rotalardan performans ipu\u00e7lar\u0131na kadar her \u015feyi derinlemesine inceleyece\u011fiz. Haz\u0131r olun, \u00e7\u00fcnk\u00fc Express ve TypeScript ile API geli\u015ftirme yolculu\u011funuzda yeni bir seviyeye ula\u015facaks\u0131n\u0131z.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mastering Routing in Express ile TypeScript\"}]},{\"@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":"Mastering Routing in Express ile TypeScript","description":"Karma\u015f\u0131k API'lerinizin y\u00f6nlendirme mant\u0131\u011f\u0131n\u0131 y\u00f6netmekte zorlan\u0131yor musunuz? \u00d6zellikle b\u00fcy\u00fck ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirirken, Express.js\u2019in esnek yap\u0131s\u0131 TypeScript\u2019in tip g\u00fcvenli\u011fi ile birle\u015fti\u011finde, y\u00f6nlendirme (routing) s\u00fcre\u00e7lerinizde devrim yaratabilir. Bu makalede, Express.js ve TypeScript kullanarak sa\u011flam, bak\u0131m\u0131 kolay ve performansl\u0131 bir y\u00f6nlendirme altyap\u0131s\u0131 nas\u0131l in\u015fa edece\u011finizi ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Geli\u015fmi\u015f middleware tekniklerinden mod\u00fcler mimarilere, tip g\u00fcvenli rotalardan performans ipu\u00e7lar\u0131na kadar her \u015feyi derinlemesine inceleyece\u011fiz. Haz\u0131r olun, \u00e7\u00fcnk\u00fc Express ve TypeScript ile API geli\u015ftirme yolculu\u011funuzda yeni bir seviyeye ula\u015facaks\u0131n\u0131z.","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\/mastering-routing-in-express-ile-typescript\/","og_locale":"tr_TR","og_type":"article","og_title":"Mastering Routing in Express ile TypeScript","og_description":"Karma\u015f\u0131k API'lerinizin y\u00f6nlendirme mant\u0131\u011f\u0131n\u0131 y\u00f6netmekte zorlan\u0131yor musunuz? \u00d6zellikle b\u00fcy\u00fck ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirirken, Express.js\u2019in esnek yap\u0131s\u0131 TypeScript\u2019in tip g\u00fcvenli\u011fi ile birle\u015fti\u011finde, y\u00f6nlendirme (routing) s\u00fcre\u00e7lerinizde devrim yaratabilir. Bu makalede, Express.js ve TypeScript kullanarak sa\u011flam, bak\u0131m\u0131 kolay ve performansl\u0131 bir y\u00f6nlendirme altyap\u0131s\u0131 nas\u0131l in\u015fa edece\u011finizi ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Geli\u015fmi\u015f middleware tekniklerinden mod\u00fcler mimarilere, tip g\u00fcvenli rotalardan performans ipu\u00e7lar\u0131na kadar her \u015feyi derinlemesine inceleyece\u011fiz. Haz\u0131r olun, \u00e7\u00fcnk\u00fc Express ve TypeScript ile API geli\u015ftirme yolculu\u011funuzda yeni bir seviyeye ula\u015facaks\u0131n\u0131z.","og_url":"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-04T01:01:17+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Mastering Routing in Express ile TypeScript","datePublished":"2025-10-04T01:01:17+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/"},"wordCount":3292,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/","url":"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/","name":"Mastering Routing in Express ile TypeScript","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-04T01:01:17+00:00","description":"Karma\u015f\u0131k API'lerinizin y\u00f6nlendirme mant\u0131\u011f\u0131n\u0131 y\u00f6netmekte zorlan\u0131yor musunuz? \u00d6zellikle b\u00fcy\u00fck ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirirken, Express.js\u2019in esnek yap\u0131s\u0131 TypeScript\u2019in tip g\u00fcvenli\u011fi ile birle\u015fti\u011finde, y\u00f6nlendirme (routing) s\u00fcre\u00e7lerinizde devrim yaratabilir. Bu makalede, Express.js ve TypeScript kullanarak sa\u011flam, bak\u0131m\u0131 kolay ve performansl\u0131 bir y\u00f6nlendirme altyap\u0131s\u0131 nas\u0131l in\u015fa edece\u011finizi ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Geli\u015fmi\u015f middleware tekniklerinden mod\u00fcler mimarilere, tip g\u00fcvenli rotalardan performans ipu\u00e7lar\u0131na kadar her \u015feyi derinlemesine inceleyece\u011fiz. Haz\u0131r olun, \u00e7\u00fcnk\u00fc Express ve TypeScript ile API geli\u015ftirme yolculu\u011funuzda yeni bir seviyeye ula\u015facaks\u0131n\u0131z.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mastering-routing-in-express-ile-typescript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Mastering Routing in Express ile TypeScript"}]},{"@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\/30968","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=30968"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30968\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30968"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30968"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30968"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}