{"id":36935,"date":"2025-12-25T04:30:36","date_gmt":"2025-12-25T01:30:36","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/"},"modified":"2025-12-25T04:30:36","modified_gmt":"2025-12-25T01:30:36","slug":"express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/","title":{"rendered":"Express Controller&#8217;lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z)"},"content":{"rendered":"<h2>Express Controller&#8217;lar\u0131nda <code>try-catch<\/code> Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z)<\/h2>\n<p>Express.js ile web uygulamalar\u0131 geli\u015ftirirken, asenkron i\u015flemlerin yo\u011funlu\u011fu ka\u00e7\u0131n\u0131lmazd\u0131r. Veritaban\u0131 sorgular\u0131, API \u00e7a\u011fr\u0131lar\u0131, dosya i\u015flemleri&#8230; T\u00fcm bu i\u015flemler potansiyel hata kaynaklar\u0131d\u0131r ve bu hatalar\u0131 y\u00f6netmek kritik \u00f6neme sahiptir. Geleneksel olarak, bir\u00e7ok geli\u015ftirici her bir controller fonksiyonunun i\u00e7ine bir <code>try-catch<\/code> blo\u011fu yerle\u015ftirerek bu hatalar\u0131 yakalamaya \u00e7al\u0131\u015f\u0131r. Ancak bu yakla\u015f\u0131m, kod tekrar\u0131na, okunabilirli\u011fin azalmas\u0131na ve bak\u0131m zorluklar\u0131na yol a\u00e7an bir &#8220;anti-pattern&#8221; haline gelebilir. Bu makalede, Express uygulamalar\u0131n\u0131zda <code>try-catch<\/code> karma\u015fas\u0131ndan nas\u0131l kurtulaca\u011f\u0131n\u0131z\u0131, daha temiz, daha s\u00fcrd\u00fcr\u00fclebilir ve daha profesyonel bir hata y\u00f6netimi stratejisi olu\u015fturmay\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Geleneksel Express Hata Y\u00f6netimi ve Zorluklar\u0131<\/h3>\n<p>Bir\u00e7ok Express geli\u015ftiricisinin ilk kar\u015f\u0131la\u015ft\u0131\u011f\u0131 ve en s\u0131k uygulad\u0131\u011f\u0131 hata y\u00f6netimi \u015fekli, her bir asenkron controller fonksiyonunu bir <code>try-catch<\/code> blo\u011fu ile sarmalamakt\u0131r. Bu yakla\u015f\u0131m, ilk bak\u0131\u015fta mant\u0131kl\u0131 g\u00f6r\u00fcnse de, b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda ciddi sorunlara yol a\u00e7abilir.<\/p>\n<h4>Her Controller&#8217;da <code>try-catch<\/code> Blo\u011fu<\/h4>\n<p>Tipik bir Express controller&#8217;\u0131 a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcnebilir:<\/p>\n<pre><code class=\"language-javascript\">\napp.get('\/kullanicilar\/:id', async (req, res) => {\n  try {\n    const kullanici = await Kullanici.findById(req.params.id);\n    if (!kullanici) {\n      return res.status(404).json({ mesaj: 'Kullan\u0131c\u0131 bulunamad\u0131.' });\n    }\n    res.status(200).json(kullanici);\n  } catch (hata) {\n    console.error(hata);\n    res.status(500).json({ mesaj: 'Sunucu hatas\u0131 olu\u015ftu.' });\n  }\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Kullanici.findById<\/code> asenkron bir i\u015flem oldu\u011fu i\u00e7in olas\u0131 hatalar\u0131 yakalamak amac\u0131yla <code>try-catch<\/code> kullan\u0131lm\u0131\u015ft\u0131r. Her controller i\u00e7in bu yap\u0131y\u0131 tekrarlamak, kodunuzu h\u0131zla \u015fi\u015firecektir.<\/p>\n<h4>Kod Tekrar\u0131 ve Bak\u0131m Zorlu\u011fu<\/h4>\n<p>Uygulaman\u0131zda onlarca, hatta y\u00fczlerce controller oldu\u011funu hayal edin. Her birinde ayn\u0131 <code>catch<\/code> blo\u011funu tekrarlamak, DRY (Don't Repeat Yourself) prensibine ayk\u0131r\u0131d\u0131r. Hata yan\u0131t format\u0131n\u0131 de\u011fi\u015ftirmek veya loglama mekanizmas\u0131n\u0131 g\u00fcncellemek istedi\u011finizde, bu de\u011fi\u015fiklikleri y\u00fczlerce farkl\u0131 dosyada yapman\u0131z gerekir. Bu durum, bak\u0131m maliyetini art\u0131r\u0131r ve hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 y\u00fckseltir.<\/p>\n<h4>Okunabilirlik ve Geli\u015ftirici Deneyimi<\/h4>\n<p>\u0130\u015f mant\u0131\u011f\u0131 kodunuzun <code>try<\/code> blo\u011funun i\u00e7ine g\u00f6m\u00fclmesi, kodun okunabilirli\u011fini azalt\u0131r. Her bir controller'a bakt\u0131\u011f\u0131n\u0131zda, as\u0131l i\u015flevselli\u011fi anlamak i\u00e7in <code>try-catch<\/code> kalabal\u0131\u011f\u0131n\u0131 a\u015fman\u0131z gerekir. Bu, yeni geli\u015ftiricilerin projeye adaptasyonunu zorla\u015ft\u0131rabilir ve mevcut geli\u015ftiricilerin verimlili\u011fini d\u00fc\u015f\u00fcrebilir.<\/p>\n<h3>Asenkron Hatalar ve Express'in Varsay\u0131lan Davran\u0131\u015f\u0131<\/h3>\n<p>Express, asenkron hatalar\u0131 ele alma konusunda baz\u0131 \u00f6zel davran\u0131\u015flara sahiptir. \u00d6zellikle <code>async\/await<\/code> yap\u0131s\u0131 ile \u00e7al\u0131\u015f\u0131rken, bu davran\u0131\u015flar\u0131 anlamak global hata y\u00f6netimi i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4><code>async\/await<\/code> ile Hata Propagasyonu<\/h4>\n<p>JavaScript'te <code>async<\/code> bir fonksiyon i\u00e7inde f\u0131rlat\u0131lan bir hata, Promise zinciri boyunca yukar\u0131 do\u011fru yay\u0131l\u0131r. E\u011fer bu hata yakalanmazsa, Promise reddedilir ve genellikle uygulaman\u0131n \u00e7\u00f6kmesine neden olur (Node.js'de <code>unhandledRejection<\/code> olay\u0131). Express ba\u011flam\u0131nda, bir controller'da yakalanmayan asenkron bir hata, varsay\u0131lan olarak Express'in hata i\u015fleme mekanizmas\u0131na ula\u015fmaz.<\/p>\n<h4>Express'in Varsay\u0131lan Hata \u0130\u015fleme Mekanizmas\u0131<\/h4>\n<p>Express, senkron hatalar\u0131 ve <code>next(err)<\/code> ile a\u00e7\u0131k\u00e7a iletilen hatalar\u0131 otomatik olarak yakalayabilen bir mekanizmaya sahiptir. Ancak, bir <code>async<\/code> controller'da yakalanmayan bir Promise reddi (yani bir hata), do\u011frudan Express'in middleware zincirine d\u00fc\u015fmez. Bu, uygulaman\u0131z\u0131n beklenmedik bir \u015fekilde \u00e7\u00f6kmesine neden olabilir.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Bu controller'daki hata Express taraf\u0131ndan yakalanmaz ve uygulama \u00e7\u00f6ker\napp.get('\/riskli-islem', async (req, res, next) => {\n  \/\/ Promise reddi Express'e ula\u015fmaz\n  throw new Error('Beklenmedik bir hata olu\u015ftu!'); \n});\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>throw new Error<\/code> bir <code>async<\/code> fonksiyon i\u00e7inde oldu\u011fu i\u00e7in, bu hata Promise taraf\u0131ndan reddedilir ancak Express'in hata middleware'ine otomatik olarak iletilmez. Bu durum, <code>try-catch<\/code> bloklar\u0131n\u0131 her yere yayma ihtiyac\u0131n\u0131n temel nedenlerinden biridir.<\/p>\n<h3>Global Hata Yakalama Middleware'i ile Tan\u0131\u015fma<\/h3>\n<p>Express'te hata y\u00f6netimini merkezile\u015ftirmenin en g\u00fc\u00e7l\u00fc yolu, global bir hata yakalama middleware'i kullanmakt\u0131r. Bu middleware, t\u00fcm uygulaman\u0131zdaki hatalar\u0131 tek bir noktadan ele alman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>Middleware Zinciri ve Hata Middleware'i<\/h4>\n<p>Express'te middleware'ler, istek ve yan\u0131t d\u00f6ng\u00fcs\u00fc s\u0131ras\u0131nda belirli i\u015flemleri ger\u00e7ekle\u015ftiren fonksiyonlard\u0131r. Normal middleware'ler <code>(req, res, next)<\/code> imzas\u0131n\u0131 kullan\u0131rken, hata yakalama middleware'leri \u00f6zel bir imzaya sahiptir: <code>(err, req, res, next)<\/code>. Express, bu d\u00f6rt parametreli middleware'i bir hata f\u0131rlat\u0131ld\u0131\u011f\u0131nda veya <code>next(err)<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda otomatik olarak \u00e7a\u011f\u0131r\u0131r.<\/p>\n<h4>Temel Yap\u0131 ve \u0130\u015fleyi\u015f<\/h4>\n<p>Global hata yakalama middleware'i, genellikle uygulaman\u0131zdaki di\u011fer t\u00fcm rotalar\u0131n ve middleware'lerin en sonuna yerle\u015ftirilir. Bu sayede, \u00f6nceki t\u00fcm katmanlardan gelen hatalar\u0131 yakalayabilir.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ app.js veya server.js dosyan\u0131zda\n\/\/ ... di\u011fer rotalar ve middleware'ler ...\n\n\/\/ Global hata yakalama middleware'i\napp.use((err, req, res, next) => {\n  console.error(err.stack); \/\/ Hatan\u0131n stack trace'ini logla\n\n  \/\/ Varsay\u0131lan olarak 500 Internal Server Error d\u00f6n\n  const statusCode = err.statusCode || 500;\n  const message = err.message || 'Sunucu taraf\u0131nda bilinmeyen bir hata olu\u015ftu.';\n\n  res.status(statusCode).json({\n    durum: 'hata',\n    mesaj: message\n  });\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Bu middleware, herhangi bir controller'da <code>next(new Error('Bir hata olu\u015ftu'))<\/code> \u015feklinde bir hata iletildi\u011finde veya senkron bir hata f\u0131rlat\u0131ld\u0131\u011f\u0131nda devreye girer. Ancak, yukar\u0131da bahsetti\u011fimiz gibi, <code>async<\/code> controller'lardaki yakalanmayan Promise reddini do\u011frudan yakalamaz.<\/p>\n<h3><code>express-async-errors<\/code> K\u00fct\u00fcphanesi: Temiz Bir \u00c7\u00f6z\u00fcm<\/h3>\n<p>\u0130\u015fte tam da bu noktada <code>express-async-errors<\/code> gibi k\u00fct\u00fcphaneler devreye girer. Bu k\u00fct\u00fcphane, <code>async<\/code> controller'lardaki yakalanmayan hatalar\u0131 otomatik olarak Express'in hata yakalama middleware'ine ileterek, <code>try-catch<\/code> bloklar\u0131na olan ihtiyac\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<h4>K\u00fct\u00fcphanenin Amac\u0131<\/h4>\n<p><code>express-async-errors<\/code> k\u00fct\u00fcphanesi, Express'in <code>Router.prototype.use<\/code> ve <code>Router.prototype.handle<\/code> metodlar\u0131n\u0131 yamalayarak (patching), <code>async<\/code> fonksiyonlardan f\u0131rlat\u0131lan hatalar\u0131 yakalar ve bunlar\u0131 otomatik olarak <code>next(err)<\/code> \u00e7a\u011fr\u0131s\u0131 gibi global hata yakalama middleware'inize y\u00f6nlendirir. B\u00f6ylece, her <code>async<\/code> controller'\u0131 manuel olarak sarmalamak zorunda kalmazs\u0131n\u0131z.<\/p>\n<h4>Kurulum ve Kullan\u0131m<\/h4>\n<p>Kurulumu olduk\u00e7a basittir:<\/p>\n<pre><code class=\"language-bash\">\nnpm install express-async-errors\n<\/pre>\n<p><\/code><\/p>\n<p>Kullan\u0131m\u0131 ise daha da basittir; sadece uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 dosyas\u0131nda (genellikle <code>app.js<\/code> veya <code>server.js<\/code>) en \u00fcstte bir kere i\u00e7e aktarman\u0131z yeterlidir:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ app.js veya server.js dosyan\u0131z\u0131n en \u00fcst\u00fcnde\nrequire('express-async-errors'); \/\/ ES mod\u00fclleri i\u00e7in: import 'express-async-errors';\n\nconst express = require('express');\nconst app = express();\n\n\/\/ ... di\u011fer middleware'ler ve rotalar ...\n\n\/\/ Art\u0131k try-catch'e gerek yok!\napp.get('\/kullanicilar\/:id', async (req, res, next) => {\n  const kullanici = await Kullanici.findById(req.params.id); \/\/ Hata f\u0131rlatabilir\n  if (!kullanici) {\n    \/\/ next() ile \u00f6zel bir hata iletebiliriz\n    return next(new AppError('Kullan\u0131c\u0131 bulunamad\u0131', 404)); \n  }\n  res.status(200).json(kullanici);\n});\n\napp.get('\/hata-olustur', async (req, res, next) => {\n  \/\/ Bu hata otomatik olarak global hata middleware'ine iletilecek\n  throw new Error('Bu bir test hatas\u0131d\u0131r!'); \n});\n\n\/\/ Global hata yakalama middleware'i (uygulaman\u0131n en sonunda)\napp.use((err, req, res, next) => {\n  console.error(err.stack);\n  const statusCode = err.statusCode || 500;\n  const message = err.message || 'Sunucu taraf\u0131nda bilinmeyen bir hata olu\u015ftu.';\n  res.status(statusCode).json({\n    durum: 'hata',\n    mesaj: message\n  });\n});\n\n\/\/ ... sunucuyu ba\u015flatma kodu ...\n<\/pre>\n<p><\/code><\/p>\n<p>Art\u0131k controller'lar\u0131n\u0131zda <code>try-catch<\/code> bloklar\u0131na ihtiyac\u0131n\u0131z kalmayacak. <code>async<\/code> bir fonksiyonda f\u0131rlat\u0131lan herhangi bir hata, otomatik olarak global hata yakalama middleware'inize iletilecektir. Bu, kodunuzu inan\u0131lmaz derecede temizler ve i\u015f mant\u0131\u011f\u0131na odaklanman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>\u00d6zel Hata S\u0131n\u0131flar\u0131 ve Geli\u015fmi\u015f Hata Y\u00f6netimi<\/h3>\n<p>T\u00fcm hatalar\u0131 genel bir \"Sunucu Hatas\u0131\" olarak ele almak, kullan\u0131c\u0131 deneyimi ve hata ay\u0131klama a\u00e7\u0131s\u0131ndan yeterli de\u011fildir. Farkl\u0131 hata senaryolar\u0131 i\u00e7in (\u00f6rne\u011fin, kullan\u0131c\u0131 bulunamad\u0131, yetkilendirme hatas\u0131, do\u011frulama hatas\u0131) \u00f6zel hata s\u0131n\u0131flar\u0131 olu\u015fturmak, daha anlaml\u0131 yan\u0131tlar ve daha kolay hata ay\u0131klama sa\u011flar.<\/p>\n<h4>Farkl\u0131 Hata Senaryolar\u0131 \u0130\u00e7in \u00d6zel S\u0131n\u0131flar<\/h4>\n<p>Kendi \u00f6zel hata s\u0131n\u0131flar\u0131n\u0131z\u0131 olu\u015fturarak, hata t\u00fcr\u00fcne g\u00f6re farkl\u0131 HTTP durum kodlar\u0131 ve mesajlar d\u00f6nd\u00fcrebilirsiniz. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ errors\/appError.js\nclass AppError extends Error {\n  constructor(message, statusCode) {\n    super(message);\n    this.statusCode = statusCode;\n    this.status = <code>${statusCode}<\/code>.startsWith('4') ? 'fail' : 'error';\n    this.isOperational = true; \/\/ Programlama hatas\u0131 m\u0131, operasyonel hata m\u0131?\n\n    Error.captureStackTrace(this, this.constructor);\n  }\n}\n\nmodule.exports = AppError;\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>AppError<\/code> s\u0131n\u0131f\u0131n\u0131 kullanarak, controller'lar\u0131n\u0131zda daha spesifik hatalar f\u0131rlatabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\nconst AppError = require('.\/errors\/appError');\n\napp.get('\/kullanicilar\/:id', async (req, res, next) => {\n  const kullanici = await Kullanici.findById(req.params.id);\n  if (!kullanici) {\n    return next(new AppError('Bu ID ile bir kullan\u0131c\u0131 bulunamad\u0131.', 404));\n  }\n  res.status(200).json(kullanici);\n});\n<\/pre>\n<p><\/code><\/p>\n<h4>Global Middleware'de Hata T\u00fcrlerini \u0130\u015fleme<\/h4>\n<p>Global hata yakalama middleware'inizde, f\u0131rlat\u0131lan hatan\u0131n t\u00fcr\u00fcn\u00fc kontrol ederek farkl\u0131 i\u015flemler yapabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\nconst AppError = require('.\/errors\/appError'); \/\/ AppError s\u0131n\u0131f\u0131n\u0131 import edin\n\napp.use((err, req, res, next) => {\n  \/\/ Operasyonel hatalar (AppError gibi) ve programlama hatalar\u0131n\u0131 ay\u0131rt et\n  if (err.isOperational) {\n    return res.status(err.statusCode).json({\n      durum: err.status,\n      mesaj: err.message\n    });\n  } else {\n    \/\/ Programlama hatalar\u0131 veya bilinmeyen hatalar\n    console.error('HATA \ud83d\udca5', err); \/\/ Geli\u015ftirme ortam\u0131nda tam hatay\u0131 logla\n\n    \/\/ \u00dcretim ortam\u0131nda hassas bilgileri if\u015fa etme\n    res.status(500).json({\n      durum: 'hata',\n      mesaj: 'Beklenmeyen bir hata olu\u015ftu!'\n    });\n  }\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, kullan\u0131c\u0131ya daha anlaml\u0131 hata mesajlar\u0131 sunarken, ayn\u0131 zamanda geli\u015ftirme ortam\u0131nda detayl\u0131 hata bilgisi alman\u0131z\u0131 ve \u00fcretim ortam\u0131nda hassas bilgileri gizlemenizi sa\u011flar.<\/p>\n<h3>En \u0130yi Uygulamalar ve Dikkat Edilmesi Gerekenler<\/h3>\n<p>Global hata y\u00f6netimi uygularken, uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 ve g\u00fcvenli\u011fini art\u0131rmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131s\u0131n\u0131z.<\/p>\n<h4>G\u00fcvenlik ve Hata Mesajlar\u0131<\/h4>\n<p>\u00dcretim ortam\u0131nda, kullan\u0131c\u0131lara asla hassas hata detaylar\u0131 (veritaban\u0131 sorgular\u0131, stack trace'ler vb.) g\u00f6stermemelisiniz. Bu bilgiler potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131 yaratabilir. Global hata middleware'inizde, geli\u015ftirme ve \u00fcretim ortamlar\u0131n\u0131 ay\u0131rt ederek farkl\u0131 hata yan\u0131tlar\u0131 d\u00f6nd\u00fcrmelisiniz. \u00d6rne\u011fin, geli\u015ftirme ortam\u0131nda detayl\u0131 hata \u00e7\u0131kt\u0131s\u0131 verirken, \u00fcretimde genel bir \"Beklenmeyen bir hata olu\u015ftu\" mesaj\u0131 g\u00f6stermek daha g\u00fcvenlidir.<\/p>\n<h4>Kapsaml\u0131 Loglama<\/h4>\n<p>Hatalar\u0131 sadece kullan\u0131c\u0131ya bildirmekle kalmay\u0131p, ayn\u0131 zamanda kapsaml\u0131 bir \u015fekilde loglaman\u0131z gerekir. <code>console.error<\/code> basit uygulamalar i\u00e7in yeterli olsa da, kurumsal uygulamalarda Winston, Pino gibi profesyonel loglama k\u00fct\u00fcphaneleri kullanmal\u0131s\u0131n\u0131z. Loglar, hatalar\u0131n k\u00f6k nedenini bulmak ve performans\u0131 izlemek i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h4>Hata \u0130zleme Ara\u00e7lar\u0131 ile Entegrasyon<\/h4>\n<p>Sentry, New Relic, Datadog gibi hata izleme ara\u00e7lar\u0131, uygulaman\u0131zdaki hatalar\u0131 ger\u00e7ek zamanl\u0131 olarak takip etmenizi, analiz etmenizi ve bildirim alman\u0131z\u0131 sa\u011flar. Global hata yakalama middleware'iniz, bu ara\u00e7larla kolayca entegre edilebilir, b\u00f6ylece her hata an\u0131nda size ula\u015f\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ \u00d6rnek Sentry entegrasyonu\nconst Sentry = require('@sentry\/node');\n\n\/\/ ... Sentry'yi ba\u015flatma kodu ...\n\napp.use((err, req, res, next) => {\n  if (!err.isOperational) { \/\/ Operasyonel olmayan hatalar\u0131 Sentry'ye g\u00f6nder\n    Sentry.captureException(err);\n  }\n  \/\/ ... di\u011fer hata i\u015fleme mant\u0131\u011f\u0131 ...\n});\n<\/pre>\n<p><\/code><\/p>\n<h4>Test Edilebilirlik<\/h4>\n<p>Hata y\u00f6netim mekanizman\u0131z\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in testler yaz\u0131n. Farkl\u0131 hata senaryolar\u0131n\u0131 (\u00f6rne\u011fin, 404, 401, 500) tetikleyerek, uygulaman\u0131z\u0131n beklenen yan\u0131tlar\u0131 d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc do\u011frulay\u0131n. Bu, uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve gelecekteki de\u011fi\u015fikliklerde hata y\u00f6netiminin bozulmamas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Express controller'lar\u0131nda her seferinde <code>try-catch<\/code> yazma al\u0131\u015fkanl\u0131\u011f\u0131ndan vazge\u00e7mek, modern web uygulamas\u0131 geli\u015ftirmenin \u00f6nemli bir ad\u0131m\u0131d\u0131r. <code>express-async-errors<\/code> gibi k\u00fct\u00fcphanelerle desteklenen merkezi bir global hata yakalama middleware'i kullanarak, kodunuzu sadele\u015ftirebilir, okunabilirli\u011fi art\u0131rabilir ve hata y\u00f6netimini tutarl\u0131 hale getirebilirsiniz. \u00d6zel hata s\u0131n\u0131flar\u0131 ile bu sistemi daha da g\u00fc\u00e7lendirerek, kullan\u0131c\u0131lar\u0131n\u0131za daha anlaml\u0131 geri bildirimler sunarken, geli\u015ftiriciler olarak da hatalar\u0131 daha etkin bir \u015fekilde izleyebilir ve \u00e7\u00f6zebilirsiniz. Bu yakla\u015f\u0131m, sadece kod kalitenizi de\u011fil, ayn\u0131 zamanda geli\u015ftirici deneyiminizi ve uygulaman\u0131z\u0131n genel sa\u011flaml\u0131\u011f\u0131n\u0131 da \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. Art\u0131k <code>try-catch<\/code> bloklar\u0131n\u0131n karma\u015fas\u0131ndan kurtulma ve daha temiz, daha verimli bir Express deneyimine ge\u00e7me zaman\u0131!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>1. Neden her <code>try-catch<\/code> blokundan kurtulmal\u0131y\u0131m?<\/h4>\n<p>Her controller'da <code>try-catch<\/code> kullanmak kod tekrar\u0131na, okunabilirli\u011fin azalmas\u0131na ve bak\u0131m zorluklar\u0131na yol a\u00e7ar. Global bir hata yakalama mekanizmas\u0131 ile t\u00fcm hatalar\u0131 tek bir yerden y\u00f6netebilir, kodunuzu daha temiz ve s\u00fcrd\u00fcr\u00fclebilir hale getirebilirsiniz.<\/p>\n<h4>2. Bu yakla\u015f\u0131m performans\u0131m\u0131 etkiler mi?<\/h4>\n<p>Hay\u0131r, aksine performans\u0131 olumlu y\u00f6nde etkileyebilir. Her controller'da ayr\u0131 <code>try-catch<\/code> bloklar\u0131 olu\u015fturmak yerine, tek bir global middleware kullanmak, Express'in dahili hata i\u015fleme mekanizmas\u0131n\u0131 daha verimli kullanmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, daha temiz kod genellikle daha az hataya ve daha kolay hata ay\u0131klamaya yol a\u00e7ar.<\/p>\n<h4>3. Hangi durumlarda yine de <code>try-catch<\/code> kullanmal\u0131y\u0131m?<\/h4>\n<p>Global hata y\u00f6netimi \u00e7o\u011fu senaryoyu kapsasa da, baz\u0131 \u00f6zel durumlarda lokal <code>try-catch<\/code> bloklar\u0131 hala anlaml\u0131 olabilir. \u00d6rne\u011fin, bir hatay\u0131 yakalay\u0131p belirli bir \u015fekilde ele ald\u0131ktan sonra (\u00f6rne\u011fin, bir i\u015flemi tekrar denemek veya belirli bir varsay\u0131lan de\u011feri kullanmak) i\u015f ak\u0131\u015f\u0131na devam etmek istedi\u011finizde. Ancak bu durumlar genellikle bir hatay\u0131 \"yakalay\u0131p d\u00fczeltmek\" \u00fczerine odaklan\u0131r, genel bir HTTP yan\u0131t\u0131 d\u00f6nd\u00fcrmek \u00fczerine de\u011fil.<\/p>\n<h4>4. <code>express-async-errors<\/code> yerine kendi sarmalay\u0131c\u0131m\u0131 yazabilir miyim?<\/h4>\n<p>Evet, kesinlikle yazabilirsiniz. <code>express-async-errors<\/code> k\u00fct\u00fcphanesi, her <code>async<\/code> controller'\u0131 manuel olarak bir sarmalay\u0131c\u0131 fonksiyona ge\u00e7irmenize gerek kalmadan bu i\u015fi otomatik yapar. Kendi sarmalay\u0131c\u0131n\u0131z\u0131 yazmak isterseniz, her controller'\u0131 \u015fu \u015fekilde sarmalaman\u0131z gerekir:<\/p>\n<pre><code class=\"language-javascript\">\nconst catchAsync = fn => (req, res, next) => {\n  fn(req, res, next).catch(next);\n};\n\napp.get('\/kullanicilar\/:id', catchAsync(async (req, res, next) => {\n  \/\/ try-catch yok\n  const kullanici = await Kullanici.findById(req.params.id);\n  \/\/ ...\n}));\n<\/pre>\n<p><\/code><\/p>\n<p><code>express-async-errors<\/code> bu sarmalama i\u015flemini sizin i\u00e7in otomatikle\u015ftirir.<\/p>\n<h4>5. Hata mesajlar\u0131n\u0131 kullan\u0131c\u0131ya nas\u0131l g\u00f6stermeliyim?<\/h4>\n<p>\u00dcretim ortam\u0131nda, kullan\u0131c\u0131ya genel ve anla\u015f\u0131l\u0131r hata mesajlar\u0131 g\u00f6stermelisiniz (\u00f6rne\u011fin, \"Bir sorun olu\u015ftu, l\u00fctfen daha sonra tekrar deneyin\" veya \"Girdi\u011finiz bilgiler ge\u00e7ersiz\"). Hassas hata detaylar\u0131n\u0131 (veritaban\u0131 hatalar\u0131, stack trace'ler) asla if\u015fa etmeyin. \u00d6zel hata s\u0131n\u0131flar\u0131 kullanarak (<code>AppError<\/code> \u00f6rne\u011findeki gibi), kullan\u0131c\u0131ya \u00f6zel, ancak g\u00fcvenli mesajlar d\u00f6nd\u00fcrebilirsiniz (\u00f6rne\u011fin, \"Kullan\u0131c\u0131 bulunamad\u0131\").<\/p>\n","protected":false},"excerpt":{"rendered":"Express.js ile web uygulamalar\u0131 geli\u015ftirirken, asenkron i\u015flemlerin yo\u011funlu\u011fu ka\u00e7\u0131n\u0131lmazd\u0131r. Veritaban\u0131 sorgular\u0131, API \u00e7a\u011fr\u0131lar\u0131, dosya i\u015fleml&#8230;","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-36935","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 Controller&#039;lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Express Controller&#039;lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z)\" \/>\n<meta property=\"og:description\" content=\"Express.js ile web uygulamalar\u0131 geli\u015ftirirken, asenkron i\u015flemlerin yo\u011funlu\u011fu ka\u00e7\u0131n\u0131lmazd\u0131r. Veritaban\u0131 sorgular\u0131, API \u00e7a\u011fr\u0131lar\u0131, dosya i\u015fleml...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-25T01:30:36+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=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Express Controller&#8217;lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z)\",\"datePublished\":\"2025-12-25T01:30:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/\"},\"wordCount\":1854,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/\",\"name\":\"Express Controller'lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-25T01:30:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Express Controller&#8217;lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z)\"}]},{\"@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 Controller'lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/","og_locale":"tr_TR","og_type":"article","og_title":"Express Controller'lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z)","og_description":"Express.js ile web uygulamalar\u0131 geli\u015ftirirken, asenkron i\u015flemlerin yo\u011funlu\u011fu ka\u00e7\u0131n\u0131lmazd\u0131r. Veritaban\u0131 sorgular\u0131, API \u00e7a\u011fr\u0131lar\u0131, dosya i\u015fleml...","og_url":"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-25T01:30:36+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Express Controller&#8217;lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z)","datePublished":"2025-12-25T01:30:36+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/"},"wordCount":1854,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/","url":"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/","name":"Express Controller'lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-25T01:30:36+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/express-controllerlarinda-try-catch-yazmayi-biraktim-siz-de-birakmalisiniz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Express Controller&#8217;lar\u0131nda `try-catch` Yazmay\u0131 B\u0131rakt\u0131m (Siz de B\u0131rakmal\u0131s\u0131n\u0131z)"}]},{"@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\/36935","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=36935"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36935\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36935"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36935"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}