{"id":34113,"date":"2025-11-11T10:31:01","date_gmt":"2025-11-11T07:31:01","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/"},"modified":"2025-11-11T10:31:01","modified_gmt":"2025-11-11T07:31:01","slug":"express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/","title":{"rendered":"Express.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber"},"content":{"rendered":"<p><body><\/p>\n<style>\n        \/* Temel Responsive CSS *\/\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            line-height: 1.6;\n            color: #333;\n            max-width: 1000px;\n            margin: 20px auto;\n            padding: 0 15px;\n            background-color: #f9f9f9;\n        }<\/p>\n<p>        h2, h3 {\n            color: #2c3e50;\n            margin-top: 35px;\n            margin-bottom: 15px;\n        }<\/p>\n<p>        h2 {\n            border-bottom: 2px solid #3498db;\n            padding-bottom: 10px;\n        }<\/p>\n<p>        h3 {\n            color: #34495e;\n        }<\/p>\n<p>        p {\n            margin-bottom: 1em;\n        }<\/p>\n<p>        code {\n            background-color: #eee;\n            padding: 2px 4px;\n            border-radius: 4px;\n            font-family: 'Consolas', 'Monaco', monospace;\n            font-size: 0.9em;\n        }<\/p>\n<p>        pre {\n            background-color: #2d2d2d;\n            color: #f8f8f2;\n            padding: 15px;\n            border-radius: 8px;\n            overflow-x: auto;\n            margin-bottom: 20px;\n            font-family: 'Consolas', 'Monaco', monospace;\n            font-size: 0.95em;\n            line-height: 1.4;\n        }<\/p>\n<p>        pre code {\n            background-color: transparent;\n            color: inherit;\n            padding: 0;\n            border-radius: 0;\n        }<\/p>\n<p>        ul, ol {\n            margin-bottom: 1em;\n            padding-left: 25px;\n        }<\/p>\n<p>        li {\n            margin-bottom: 0.5em;\n        }<\/p>\n<p>        .expert-tip, .interactive-tip {\n            background-color: #e8f7fa;\n            border-left: 5px solid #3498db;\n            padding: 15px;\n            margin: 20px 0;\n            border-radius: 5px;\n            font-style: italic;\n            color: #2c3e50;\n        }<\/p>\n<p>        .expert-tip strong, .interactive-tip strong {\n            color: #2980b9;\n        }<\/p>\n<p>        \/* Responsive Kurallar *\/\n        @media (max-width: 768px) {\n            body {\n                margin: 10px auto;\n                padding: 0 10px;\n            }<\/p>\n<p>            h2 {\n                font-size: 1.8em;\n            }<\/p>\n<p>            h3 {\n                font-size: 1.4em;\n            }\n        }<\/p>\n<p>        @media (max-width: 480px) {\n            body {\n                font-size: 0.9em;\n            }<\/p>\n<p>            h2 {\n                font-size: 1.5em;\n            }<\/p>\n<p>            h3 {\n                font-size: 1.2em;\n            }<\/p>\n<p>            pre {\n                padding: 10px;\n            }\n        }\n    <\/style>\n<p>Express.js uygulamalar\u0131nda kontrolc\u00fcler, iste\u011fin i\u015flenmesi ve yan\u0131t\u0131n olu\u015fturulmas\u0131 s\u00fcre\u00e7lerini nas\u0131l y\u00f6netir? Bu makale, sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 d\u00fczenlemenin temelini olu\u015fturan bu kritik bile\u015fenleri ba\u015ftan sona anlaman\u0131z\u0131 sa\u011flayacak kapsaml\u0131 bir rehber sunuyor. Express.js ile daha temiz, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir API&#8217;ler geli\u015ftirmek i\u00e7in kontrolc\u00fclerin g\u00fcc\u00fcn\u00fc ke\u015ffetmeye haz\u0131r olun.<\/p>\n<p>G\u00fcn\u00fcm\u00fczde modern web uygulamalar\u0131 ve RESTful API&#8217;ler geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, kod taban\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 y\u00f6netmektir. \u00d6zellikle de uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, her iste\u011fe yan\u0131t veren mant\u0131\u011f\u0131n tek bir yerde toplanmas\u0131, kodun okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve test edilebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde zorla\u015ft\u0131rabilir. \u0130\u015fte tam da bu noktada, Express.js kontrolc\u00fclerinin \u00f6nemi ortaya \u00e7\u0131kar.<\/p>\n<p>Peki, bir Express.js kontrolc\u00fcs\u00fc tam olarak nedir? Temel olarak, bir kontrolc\u00fc (controller), belirli bir istemci iste\u011fini (request) i\u015flemekten ve uygun bir yan\u0131t (response) d\u00f6nd\u00fcrmekten sorumlu olan bir fonksiyondur veya fonksiyonlar k\u00fcmesidir. Genellikle &#8220;Model-View-Controller (MVC)&#8221; gibi mimari kal\u0131plarla an\u0131lsa da, Express.js do\u011frudan bir MVC \u00e7at\u0131s\u0131 de\u011fildir. Ancak, kontrolc\u00fc kavram\u0131n\u0131 benimseyerek uygulamalar\u0131m\u0131z\u0131 MVC benzeri bir mod\u00fclerlikte organize edebiliriz. Bu, rotalar\u0131m\u0131z\u0131n sadece iste\u011fi al\u0131p kontrolc\u00fcye y\u00f6nlendiren basit yap\u0131lar olmas\u0131n\u0131 sa\u011flarken, t\u00fcm i\u015f mant\u0131\u011f\u0131n\u0131n (veritaban\u0131 i\u015flemleri, do\u011frulama, hata y\u00f6netimi vb.) kontrolc\u00fcler i\u00e7inde veya kontrolc\u00fcler taraf\u0131ndan \u00e7a\u011fr\u0131lan di\u011fer mod\u00fcllerde yer almas\u0131na olanak tan\u0131r.<\/p>\n<p>Kontrolc\u00fcler kullanman\u0131n faydalar\u0131n\u0131 daha yak\u0131ndan inceleyelim:<\/p>\n<ul>\n<li><strong>Mod\u00fclerlik ve Sorumluluk Ayr\u0131m\u0131:<\/strong> Kontrolc\u00fcler, i\u015f mant\u0131\u011f\u0131n\u0131 rotalardan ay\u0131rarak her bir birimin tek bir sorumlulu\u011fu olmas\u0131n\u0131 sa\u011flar. Rotalar, sadece gelen iste\u011fi belirli bir kontrolc\u00fc fonksiyonuna y\u00f6nlendirirken, kontrolc\u00fc bu iste\u011fi nas\u0131l i\u015fleyece\u011fini bilir. Bu sayede, kodunuz daha d\u00fczenli, anla\u015f\u0131l\u0131r ve y\u00f6netilebilir hale gelir. \u00d6rne\u011fin, kullan\u0131c\u0131larla ilgili t\u00fcm i\u015flemler <code>userController.js<\/code> dosyas\u0131nda toplanabilir.<\/li>\n<li><strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> \u0130\u015f mant\u0131\u011f\u0131 ayr\u0131 dosyalarda organize edildi\u011finde, bir hatay\u0131 ay\u0131klamak veya yeni bir \u00f6zellik eklemek \u00e7ok daha kolayla\u015f\u0131r. Belirli bir hatan\u0131n hangi kontrolc\u00fcde meydana geldi\u011fini h\u0131zla tespit edebilir veya bir \u00f6zelli\u011fin hangi kontrolc\u00fc fonksiyonunu etkiledi\u011fini g\u00f6rebilirsiniz. Bu, uzun vadede projenin s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r.<\/li>\n<li><strong>Yeniden Kullan\u0131labilirlik:<\/strong> Ayn\u0131 i\u015f mant\u0131\u011f\u0131 farkl\u0131 rotalar taraf\u0131ndan kullan\u0131labiliyorsa, bu mant\u0131\u011f\u0131 bir kontrolc\u00fc i\u00e7inde tan\u0131mlay\u0131p birden fazla rotada \u00e7a\u011f\u0131rabilirsiniz. Bu, &#8220;Kendini Tekrar Etme (DRY &#8211; Don&#8217;t Repeat Yourself)&#8221; prensibine uyulmas\u0131na yard\u0131mc\u0131 olur ve kod fazlal\u0131\u011f\u0131n\u0131 \u00f6nler.<\/li>\n<li><strong>Test Edilebilirlik:<\/strong> Sorumluluklar\u0131 ayr\u0131lm\u0131\u015f kontrolc\u00fcler, birim testleri (unit tests) yazmay\u0131 kolayla\u015ft\u0131r\u0131r. Her bir kontrolc\u00fc fonksiyonunu izole bir \u015fekilde test edebilir, farkl\u0131 giri\u015fler kar\u015f\u0131s\u0131nda nas\u0131l davrand\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz. Bu, uygulaman\u0131z\u0131n kalitesini ve g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/li>\n<li><strong>Geli\u015ftirici Deneyimi:<\/strong> B\u00fcy\u00fck ekiplerde \u00e7al\u0131\u015f\u0131rken, herkesin ayn\u0131 kod taban\u0131nda farkl\u0131 \u00f6zellikler \u00fczerinde e\u015f zamanl\u0131 olarak \u00e7al\u0131\u015fmas\u0131 gerekir. Kontrolc\u00fcler, \u00e7ak\u0131\u015fmalar\u0131 en aza indiren ve i\u015f b\u00f6l\u00fcm\u00fcn\u00fc kolayla\u015ft\u0131ran net bir yap\u0131 sunar. Bu da genel geli\u015ftirici deneyimini iyile\u015ftirir.<\/li>\n<p>\u00d6zetle, kontrolc\u00fcler Express.js uygulamalar\u0131n\u0131zda karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmek, kodu daha okunabilir hale getirmek ve uzun vadede projenizi s\u00fcrd\u00fcr\u00fclebilir k\u0131lmak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Bir sonraki b\u00f6l\u00fcmde, kontrolc\u00fcleri pratik olarak nas\u0131l yap\u0131land\u0131raca\u011f\u0131m\u0131z\u0131 ve rotalar\u0131m\u0131za nas\u0131l entegre edece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h2>Express.js Uygulaman\u0131zda Kontrolc\u00fcleri Nas\u0131l Yap\u0131land\u0131r\u0131rs\u0131n\u0131z?<\/h2>\n<p>Kontrolc\u00fclerin teorik faydalar\u0131n\u0131 anlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi bu yap\u0131y\u0131 Express.js projenize nas\u0131l entegre edece\u011finize odaklanal\u0131m. Uygulaman\u0131zda kontrolc\u00fcleri yap\u0131land\u0131rmak, genellikle belirli bir dosya d\u00fczenini takip etmeyi ve rotalar\u0131n\u0131z\u0131 bu kontrolc\u00fclere ba\u011flamay\u0131 i\u00e7erir. \u0130\u015fte ad\u0131m ad\u0131m bir rehber:<\/p>\n<h3>Ad\u0131m 1: Proje Yap\u0131s\u0131n\u0131 Olu\u015fturma<\/h3>\n<p>Mod\u00fcler bir yap\u0131 i\u00e7in, genellikle <code>controllers<\/code> ve <code>routes<\/code> ad\u0131nda iki ana dizin olu\u015ftururuz. Proje k\u00f6k dizininiz \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code>\nmy-express-app\/\n\u251c\u2500\u2500 node_modules\/\n\u251c\u2500\u2500 controllers\/\n\u2502   \u2514\u2500\u2500 userController.js\n\u251c\u2500\u2500 routes\/\n\u2502   \u2514\u2500\u2500 userRoutes.js\n\u251c\u2500\u2500 app.js\n\u251c\u2500\u2500 package.json\n\u2514\u2500\u2500 ...\n    <\/pre>\n<p><\/code><\/p>\n<p><code>app.js<\/code> ana uygulama dosyan\u0131z olacak, <code>userController.js<\/code> kullan\u0131c\u0131larla ilgili i\u015f mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131racak ve <code>userRoutes.js<\/code> ise kullan\u0131c\u0131 rotalar\u0131n\u0131 tan\u0131mlayacakt\u0131r.<\/p>\n<h3>Ad\u0131m 2: Ana Express Uygulamas\u0131n\u0131 Tan\u0131mlama (app.js)<\/h3>\n<p><code>app.js<\/code> dosyas\u0131nda Express uygulamas\u0131n\u0131 ba\u015flat\u0131r, middleware'leri tan\u0131mlar ve rotalar\u0131 uygulaman\u0131za dahil edersiniz. Bu dosyada, farkl\u0131 rota mod\u00fcllerinizi i\u00e7e aktar\u0131p uygulaman\u0131za ba\u011flaman\u0131z gerekecek.<\/p>\n<pre><code>\n    \/\/ app.js\n    const express = require('express');\n    const app = express();\n    const port = 3000;\n\n    \/\/ Body parser middleware'i\n    app.use(express.json());\n\n    \/\/ Rota dosyalar\u0131n\u0131 i\u00e7eri aktar\u0131n\n    const userRoutes = require('.\/routes\/userRoutes');\n\n    \/\/ Rotalar\u0131 uygulamaya ba\u011flay\u0131n\n    app.use('\/api\/users', userRoutes); \/\/ T\u00fcm \/api\/users isteklerini userRoutes'a y\u00f6nlendir\n\n    \/\/ Ana sayfa rotas\u0131 (iste\u011fe ba\u011fl\u0131)\n    app.get('\/', (req, res) => {\n        res.send('Ho\u015f Geldiniz! API belgelerine g\u00f6z at\u0131n.');\n    });\n\n    \/\/ Uygulamay\u0131 belirtilen portta dinlemeye ba\u015flay\u0131n\n    app.listen(port, () => {\n        console.log(<code>Sunucu http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n    });\n    <\/pre>\n<p><\/code><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>userRoutes<\/code> mod\u00fcl\u00fc <code>\/api\/users<\/code> path'i alt\u0131nda kullan\u0131l\u0131yor. Bu, t\u00fcm kullan\u0131c\u0131larla ilgili isteklerin bu rota mod\u00fcl\u00fcne y\u00f6nlendirilece\u011fi anlam\u0131na geliyor.<\/p>\n<h3>Ad\u0131m 3: Kontrolc\u00fc Dosyas\u0131n\u0131 Olu\u015fturma (controllers\/userController.js)<\/h3>\n<p>\u015eimdi s\u0131ra as\u0131l i\u015f mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131racak olan kontrolc\u00fc dosyam\u0131z\u0131 olu\u015fturmaya geldi. <code>controllers\/userController.js<\/code> i\u00e7inde, her biri belirli bir i\u015flemi ger\u00e7ekle\u015ftirecek fonksiyonlar tan\u0131mlayaca\u011f\u0131z. Bu fonksiyonlar, Express rota i\u015fleyici imzas\u0131na (<code>(req, res, next) => { ... }<\/code>) uygun olmal\u0131d\u0131r.<\/p>\n<pre><code>\n    \/\/ controllers\/userController.js\n    const users = [\n        { id: 1, name: 'Alice' },\n        { id: 2, name: 'Bob' }\n    ];\n\n    \/\/ T\u00fcm kullan\u0131c\u0131lar\u0131 getiren kontrolc\u00fc fonksiyonu\n    exports.getAllUsers = (req, res) => {\n        res.status(200).json({\n            status: 'success',\n            results: users.length,\n            data: {\n                users\n            }\n        });\n    };\n\n    \/\/ Belirli bir kullan\u0131c\u0131y\u0131 ID'ye g\u00f6re getiren kontrolc\u00fc fonksiyonu\n    exports.getUserById = (req, res) => {\n        const id = parseInt(req.params.id);\n        const user = users.find(u => u.id === id);\n\n        if (!user) {\n            return res.status(404).json({\n                status: 'fail',\n                message: 'Kullan\u0131c\u0131 bulunamad\u0131'\n            });\n        }\n\n        res.status(200).json({\n            status: 'success',\n            data: {\n                user\n            }\n        });\n    };\n\n    \/\/ Yeni bir kullan\u0131c\u0131 olu\u015fturan kontrolc\u00fc fonksiyonu\n    exports.createUser = (req, res) => {\n        const newUser = req.body; \/\/ \u0130stek g\u00f6vdesinden yeni kullan\u0131c\u0131 bilgilerini al\n        \/\/ Basit bir ID atama mekanizmas\u0131\n        newUser.id = users.length > 0 ? Math.max(...users.map(u => u.id)) + 1 : 1;\n        users.push(newUser);\n\n        res.status(201).json({ \/\/ 201 Created durum kodu\n            status: 'success',\n            data: {\n                user: newUser\n            }\n        });\n    };\n\n    \/\/ Bir kullan\u0131c\u0131y\u0131 g\u00fcncelleyen kontrolc\u00fc fonksiyonu (\u00f6rnek olmas\u0131 i\u00e7in eklendi)\n    exports.updateUser = (req, res) => {\n        const id = parseInt(req.params.id);\n        const userIndex = users.findIndex(u => u.id === id);\n\n        if (userIndex === -1) {\n            return res.status(404).json({ status: 'fail', message: 'Kullan\u0131c\u0131 bulunamad\u0131' });\n        }\n\n        users[userIndex] = { ...users[userIndex], ...req.body };\n        res.status(200).json({\n            status: 'success',\n            data: {\n                user: users[userIndex]\n            }\n        });\n    };\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, kullan\u0131c\u0131 verilerini basit bir dizi i\u00e7inde sakl\u0131yoruz. Ger\u00e7ek bir uygulamada burada veritaban\u0131 i\u015flemleri (MongoDB, PostgreSQL vb.) yer alacakt\u0131r. Her bir fonksiyonu <code>exports<\/code> anahtar kelimesiyle d\u0131\u015fa aktar\u0131yoruz, b\u00f6ylece di\u011fer mod\u00fcller bu fonksiyonlar\u0131 kullanabilir.<\/p>\n<h3>Ad\u0131m 4: Rota Dosyas\u0131n\u0131 Olu\u015fturma ve Kontrolc\u00fcye Ba\u011flama (routes\/userRoutes.js)<\/h3>\n<p>Son olarak, <code>routes\/userRoutes.js<\/code> dosyas\u0131nda Express Router'\u0131 kullanarak rotalar\u0131 tan\u0131mlayaca\u011f\u0131z ve bu rotalar\u0131 ilgili kontrolc\u00fc fonksiyonlar\u0131na ba\u011flayaca\u011f\u0131z.<\/p>\n<pre><code>\n    \/\/ routes\/userRoutes.js\n    const express = require('express');\n    const userController = require('..\/controllers\/userController'); \/\/ Kontrolc\u00fcy\u00fc i\u00e7eri aktar\n\n    const router = express.Router(); \/\/ Yeni bir router objesi olu\u015ftur\n\n    \/\/ Rotalar\u0131 kontrolc\u00fc fonksiyonlar\u0131na ba\u011flama\n    router\n        .route('\/') \/\/ '\/' path'i i\u00e7in\n        .get(userController.getAllUsers) \/\/ GET istekleri getAllUsers fonksiyonuna gider\n        .post(userController.createUser); \/\/ POST istekleri createUser fonksiyonuna gider\n\n    router\n        .route('\/:id') \/\/ '\/:id' path'i i\u00e7in\n        .get(userController.getUserById) \/\/ GET istekleri getUserById fonksiyonuna gider\n        .patch(userController.updateUser); \/\/ PATCH istekleri updateUser fonksiyonuna gider\n\n    module.exports = router; \/\/ Router'\u0131 d\u0131\u015fa aktar\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131da, <code>app.js<\/code> sadece bir arac\u0131 g\u00f6revi g\u00f6r\u00fcyor ve iste\u011fi do\u011fru rota mod\u00fcl\u00fcne y\u00f6nlendiriyor. Rota mod\u00fcl\u00fc ise iste\u011fi al\u0131p uygun kontrolc\u00fc fonksiyonuna iletiyor. B\u00f6ylece, uygulaman\u0131z\u0131n farkl\u0131 katmanlar\u0131 aras\u0131nda net bir ayr\u0131m sa\u011flanm\u0131\u015f oluyor. \u00d6zellikle karma\u015f\u0131k projelerde, bu ayr\u0131m kodun y\u00f6netimini inan\u0131lmaz derecede kolayla\u015ft\u0131r\u0131r.<\/p>\n<div class=\"expert-tip\">\n        <strong>Uzman \u0130pucu: Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu ve Servis Katman\u0131<\/strong><br \/>\n        B\u00fcy\u00fck projelerde, kontrolc\u00fclerin do\u011frudan veritaban\u0131 i\u015flemleri veya harici servis \u00e7a\u011fr\u0131lar\u0131 yapmas\u0131ndan ka\u00e7\u0131n\u0131lmal\u0131d\u0131r. Bunun yerine, kontrolc\u00fclerinize servis katman\u0131ndan (\u00f6rne\u011fin, <code>userService.js<\/code>) ba\u011f\u0131ml\u0131l\u0131k enjekte edebilir ve i\u015f mant\u0131\u011f\u0131n\u0131 bu servis katman\u0131nda tutabilirsiniz. Bu, kontrolc\u00fclerinizi daha \"ince\" tutarak test edilebilirli\u011fi ve sorumluluk ayr\u0131m\u0131n\u0131 daha da art\u0131r\u0131r.\n    <\/div>\n<h2>Kontrolc\u00fclerle Ger\u00e7ek D\u00fcnya Senaryolar\u0131n\u0131 Nas\u0131l Y\u00f6netebiliriz? (Vaka Analizi)<\/h2>\n<p>Teorik bilgileri ve basit yap\u0131land\u0131rmay\u0131 \u00f6\u011frendik, ancak kontrolc\u00fcler ger\u00e7ek d\u00fcnya uygulamalar\u0131nda nas\u0131l daha etkin bir \u015fekilde kullan\u0131l\u0131r? \u00d6zellikle hata y\u00f6netimi, asenkron i\u015flemler ve veri do\u011frulama gibi konular, kontrolc\u00fclerin tasar\u0131m\u0131nda kritik rol oynar. \u015eimdi, basit bir e-ticaret uygulamas\u0131ndaki \u00fcr\u00fcn y\u00f6netimi senaryosu \u00fczerinden kontrolc\u00fclerin g\u00fcc\u00fcn\u00fc inceleyelim.<\/p>\n<p><strong>Vaka Senaryosu:<\/strong> Bir e-ticaret API'si geli\u015ftirdi\u011finizi d\u00fc\u015f\u00fcn\u00fcn. Bu API'nin yeni \u00fcr\u00fcn ekleme, \u00fcr\u00fcn listeleme, \u00fcr\u00fcn detaylar\u0131n\u0131 g\u00f6r\u00fcnt\u00fcleme gibi fonksiyonlar\u0131 olmal\u0131. \u00d6zellikle yeni bir \u00fcr\u00fcn eklerken, \u00fcr\u00fcn ad\u0131n\u0131n, fiyat\u0131n\u0131n ve stok miktar\u0131n\u0131n do\u011fru formatta girildi\u011finden emin olmam\u0131z, bir hata olu\u015ftu\u011funda kullan\u0131c\u0131ya anlaml\u0131 bir geri bildirim vermemiz ve t\u00fcm bu i\u015flemlerin asenkron olarak (veritaban\u0131 i\u015flemleri nedeniyle) sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamam\u0131z gerekiyor.<\/p>\n<h3>Problemler ve Kontrolc\u00fc \u00c7\u00f6z\u00fcmleri<\/h3>\n<ol>\n<li><strong>Veri Do\u011frulama (Validation):<\/strong> Gelen istek g\u00f6vdesindeki verilerin (\u00fcr\u00fcn ad\u0131, fiyat vb.) ge\u00e7erli oldu\u011fundan emin olmal\u0131y\u0131z. Kontrolc\u00fc i\u00e7inde do\u011frudan do\u011frulama yapmak yerine, bunu bir middleware'e devretmek daha iyi bir yakla\u015f\u0131md\u0131r.<\/li>\n<li><strong>Asenkron \u0130\u015flemler:<\/strong> \u00dcr\u00fcn bilgilerini veritaban\u0131na kaydetmek gibi i\u015flemler genellikle asenkrondur. Kontrolc\u00fclerimizin bu asenkron i\u015flemleri d\u00fczg\u00fcn bir \u015fekilde y\u00f6netmesi gerekir.<\/li>\n<li><strong>Hata Y\u00f6netimi:<\/strong> Veritaban\u0131 ba\u011flant\u0131 sorunlar\u0131, do\u011frulama hatalar\u0131 veya di\u011fer beklenmedik durumlar ortaya \u00e7\u0131kt\u0131\u011f\u0131nda, uygulaman\u0131n \u00e7\u00f6kmemesi ve kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r hata mesajlar\u0131 d\u00f6nmesi \u00f6nemlidir.<\/li>\n<\/ol>\n<p>\u015eimdi bu senaryoyu ele alan bir <code>productController.js<\/code> dosyas\u0131 ve ilgili rota mod\u00fcl\u00fcn\u00fc inceleyelim:<\/p>\n<h3>controllers\/productController.js<\/h3>\n<pre><code>\n    \/\/ controllers\/productController.js\n    const products = []; \/\/ Basit bir \u00fcr\u00fcn deposu, ger\u00e7ekte veritaban\u0131 olur\n\n    \/\/ Asenkron i\u015flemleri kolayla\u015ft\u0131rmak i\u00e7in bir yard\u0131mc\u0131 fonksiyon\n    const catchAsync = fn => {\n        return (req, res, next) => {\n            fn(req, res, next).catch(next); \/\/ Hatalar\u0131 Express'in hata i\u015fleyicisine g\u00f6nder\n        };\n    };\n\n    \/\/ T\u00fcm \u00fcr\u00fcnleri getiren kontrolc\u00fc\n    exports.getAllProducts = catchAsync(async (req, res, next) => {\n        \/\/ Ger\u00e7ek bir senaryoda burada veritaban\u0131ndan \u00fcr\u00fcnler \u00e7ekilirdi\n        \/\/ \u00d6rnek olarak gecikme sim\u00fclasyonu yapal\u0131m\n        await new Promise(resolve => setTimeout(resolve, 100));\n\n        res.status(200).json({\n            status: 'success',\n            results: products.length,\n            data: {\n                products\n            }\n        });\n    });\n\n    \/\/ Yeni \u00fcr\u00fcn ekleyen kontrolc\u00fc\n    exports.createProduct = catchAsync(async (req, res, next) => {\n        \/\/ NOT: Veri do\u011frulama genellikle bir middleware'de yap\u0131l\u0131r.\n        \/\/ Burada basit\u00e7e kontrol ediyoruz.\n        if (!req.body.name || !req.body.price || !req.body.stock) {\n            \/\/ Hata nesnesi olu\u015fturup next() ile hata i\u015fleyiciye g\u00f6nder\n            return next(new Error('\u00dcr\u00fcn ad\u0131, fiyat\u0131 ve stok miktar\u0131 gerekli.', 400));\n        }\n\n        \/\/ Ger\u00e7ek bir senaryoda veritaban\u0131na yeni \u00fcr\u00fcn ekleme i\u015flemi olurdu\n        \/\/ \u00d6rnek olarak gecikme sim\u00fclasyonu yapal\u0131m\n        await new Promise(resolve => setTimeout(resolve, 200));\n\n        const newProduct = {\n            id: products.length > 0 ? Math.max(...products.map(p => p.id)) + 1 : 1,\n            name: req.body.name,\n            price: req.body.price,\n            stock: req.body.stock\n        };\n        products.push(newProduct);\n\n        res.status(201).json({\n            status: 'success',\n            data: {\n                product: newProduct\n            }\n        });\n    });\n\n    \/\/ Belirli bir \u00fcr\u00fcn\u00fc ID'ye g\u00f6re getiren kontrolc\u00fc\n    exports.getProductById = catchAsync(async (req, res, next) => {\n        const id = parseInt(req.params.id);\n        \/\/ Ger\u00e7ek bir senaryoda veritaban\u0131ndan \u00fcr\u00fcn \u00e7ekilirdi\n        await new Promise(resolve => setTimeout(resolve, 50));\n\n        const product = products.find(p => p.id === id);\n\n        if (!product) {\n            \/\/ \u00d6zel bir hata nesnesi olu\u015fturup next() ile hata i\u015fleyiciye g\u00f6nder\n            return next(new Error('\u00dcr\u00fcn bulunamad\u0131', 404));\n        }\n\n        res.status(200).json({\n            status: 'success',\n            data: {\n                product\n            }\n        });\n    });\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte dikkat etmemiz gereken birka\u00e7 \u00f6nemli nokta var:<\/p>\n<ul>\n<li><strong><code>catchAsync<\/code> Yard\u0131mc\u0131 Fonksiyonu:<\/strong> Express, asenkron fonksiyonlarda olu\u015fan hatalar\u0131 otomatik olarak yakalamaz. Bu nedenle, <code>async\/await<\/code> kullanan kontrolc\u00fc fonksiyonlar\u0131m\u0131z\u0131 bir <code>catchAsync<\/code> sarmalay\u0131c\u0131 i\u00e7ine alarak, olu\u015fan t\u00fcm hatalar\u0131 <code>next(err)<\/code> ile global hata i\u015fleyicimize y\u00f6nlendiriyoruz. Bu, her kontrolc\u00fcde tekrar tekrar <code>try-catch<\/code> bloklar\u0131 yazma y\u00fck\u00fcn\u00fc ortadan kald\u0131r\u0131r.<\/li>\n<li><strong>Veri Do\u011frulama:<\/strong> <code>createProduct<\/code> fonksiyonunda basit bir do\u011frulama \u00f6rne\u011fi g\u00f6r\u00fcyorsunuz. Ancak, ger\u00e7ek uygulamalarda Joi veya Express-validator gibi k\u00fct\u00fcphaneleri kullanarak middleware katman\u0131nda \u00e7ok daha kapsaml\u0131 do\u011frulamalar yapman\u0131z \u00f6nerilir. Bu, kontrolc\u00fcn\u00fcz\u00fc daha temiz ve sadece i\u015f mant\u0131\u011f\u0131na odaklanm\u0131\u015f tutar.<\/li>\n<li><strong>Hata Nesneleri:<\/strong> <code>next(new Error('mesaj', durumKodu))<\/code> \u015feklinde \u00f6zel hata mesajlar\u0131 ve durum kodlar\u0131 i\u00e7eren hata nesneleri olu\u015fturarak, global hata i\u015fleyicinizin bu hatalar\u0131 yakalay\u0131p uygun HTTP yan\u0131tlar\u0131 d\u00f6nmesini sa\u011flayabilirsiniz.<\/li>\n<\/ul>\n<h3>routes\/productRoutes.js<\/h3>\n<pre><code>\n    \/\/ routes\/productRoutes.js\n    const express = require('express');\n    const productController = require('..\/controllers\/productController');\n    \/\/ const productValidator = require('..\/middlewares\/productValidator'); \/\/ \u00d6rnek middleware\n\n    const router = express.Router();\n\n    router\n        .route('\/')\n        .get(productController.getAllProducts)\n        \/\/ .post(productValidator.createProduct, productController.createProduct); \/\/ Middleware ile do\u011frulama\n        .post(productController.createProduct);\n\n    router\n        .route('\/:id')\n        .get(productController.getProductById);\n\n    module.exports = router;\n    <\/pre>\n<p><\/code><\/p>\n<p>Son olarak, <code>app.js<\/code> dosyan\u0131zda <code>\/api\/products<\/code> rotas\u0131n\u0131 <code>productRoutes<\/code>'a ba\u011flayarak bu yap\u0131y\u0131 aktif hale getirirsiniz. Bu vaka analizi, kontrolc\u00fclerin sadece rota-i\u015f mant\u0131\u011f\u0131 ayr\u0131m\u0131 sa\u011flamakla kalmay\u0131p, ayn\u0131 zamanda asenkronite ve hata y\u00f6netimi gibi karma\u015f\u0131k konular\u0131 daha d\u00fczenli bir \u015fekilde ele almam\u0131za nas\u0131l yard\u0131mc\u0131 oldu\u011funu g\u00f6stermektedir.<\/p>\n<div class=\"interactive-tip\">\n        <strong>Etkile\u015fimli \u0130pucu: Global Hata Y\u00f6netimi<\/strong><br \/>\n        Uygulaman\u0131z\u0131n sonunda (t\u00fcm rotalardan sonra) genel bir hata i\u015fleyici middleware tan\u0131mlamak, t\u00fcm kontrolc\u00fc veya middleware'lerden gelen hatalar\u0131 merkezi bir yerde y\u00f6netmenizi sa\u011flar. Bu sayede, tutarl\u0131 hata yan\u0131tlar\u0131 verebilir ve hassas bilgilerin istemciye s\u0131zmas\u0131n\u0131 engelleyebilirsiniz. \u00d6rnek:<\/p>\n<pre><code>\n        \/\/ app.js dosyas\u0131n\u0131n en alt\u0131nda\n        app.use((err, req, res, next) => {\n            console.error('Hata yakaland\u0131:', err.message);\n            res.status(err.statusCode || 500).json({\n                status: 'error',\n                message: err.message || 'Beklenmedik bir hata olu\u015ftu!'\n            });\n        });\n        <\/pre>\n<p><\/code>\n    <\/div>\n<h2>Daha Okunabilir ve Bak\u0131m\u0131 Kolay Kontrolc\u00fcler \u0130\u00e7in En \u0130yi Pratikler Nelerdir?<\/h2>\n<p>Kontrolc\u00fcleri projenize dahil etmek, ba\u015flang\u0131\u00e7 i\u00e7in harika bir ad\u0131md\u0131r. Ancak, zamanla uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, kontrolc\u00fclerinizin de karma\u015f\u0131kla\u015fmamas\u0131 ve \"\u015fi\u015fman kontrolc\u00fc\" (fat controller) sorununa d\u00f6n\u00fc\u015fmemesi i\u00e7in belirli en iyi pratikleri uygulamak \u00f6nemlidir. Bu pratikler, kodunuzu daha okunabilir, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir hale getirecektir.<\/p>\n<h3>1. Tek Sorumluluk Prensibi (Single Responsibility Principle - SRP)<\/h3>\n<p>Her kontrolc\u00fc fonksiyonu yaln\u0131zca tek bir i\u015flevi yerine getirmelidir. \u00d6rne\u011fin, bir <code>createUser<\/code> kontrolc\u00fcs\u00fc sadece kullan\u0131c\u0131 olu\u015fturmaktan sorumlu olmal\u0131, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131 listeleme veya g\u00fcncelleme gibi i\u015flevleri i\u00e7ermemelidir. Bu, kodunuzu daha mod\u00fcler ve anla\u015f\u0131l\u0131r k\u0131lar. Bir fonksiyonun birden fazla i\u015f yapmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 fark etti\u011finizde, onu daha k\u00fc\u00e7\u00fck ve odaklanm\u0131\u015f fonksiyonlara b\u00f6lmeyi d\u00fc\u015f\u00fcn\u00fcn.<\/p>\n<h3>2. Hafif Kontrolc\u00fcler (Thin Controllers)<\/h3>\n<p>Bu, belki de en \u00f6nemli pratiklerden biridir. Kontrolc\u00fclerinizin \"hafif\" olmas\u0131, yani do\u011frudan i\u015f mant\u0131\u011f\u0131n\u0131 (veritaban\u0131 i\u015flemleri, karma\u015f\u0131k hesaplamalar, d\u0131\u015f API \u00e7a\u011fr\u0131lar\u0131 vb.) i\u00e7ermemesi gerekti\u011fi anlam\u0131na gelir. Bunun yerine, bu t\u00fcr i\u015f mant\u0131klar\u0131n\u0131 ayr\u0131 \"servis\" (service) veya \"model\" katmanlar\u0131na devretmelisiniz. Kontrolc\u00fcn\u00fcn ana g\u00f6revi:<\/p>\n<ul>\n<li>\u0130stek g\u00f6vdesinden ve parametrelerinden veriyi almak.<\/li>\n<li>Gerekli servisleri \u00e7a\u011f\u0131rmak.<\/li>\n<li>Servislerden gelen yan\u0131t\u0131 i\u015flemek ve istemciye uygun bir HTTP yan\u0131t\u0131 g\u00f6ndermek.<\/li>\n<\/ul>\n<p>Bu yakla\u015f\u0131m, kontrolc\u00fclerinizi sadece bir \"trafik polisi\" gibi \u00e7al\u0131\u015ft\u0131r\u0131r, bu da onlar\u0131n daha basit, test edilebilir ve yeniden kullan\u0131labilir olmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n \u015fifresini g\u00fcncelleyen bir kontrolc\u00fc, do\u011frudan veritaban\u0131 sorgusu yapmak yerine, <code>userService.updatePassword(userId, newPassword)<\/code> gibi bir servis fonksiyonunu \u00e7a\u011f\u0131rabilir.<\/p>\n<h3>3. Do\u011frulama (Validation) ve Kimlik Do\u011frulama\/Yetkilendirme (Authentication\/Authorization) i\u00e7in Middleware Kullan\u0131m\u0131<\/h3>\n<p>Gelen iste\u011fin g\u00f6vdesindeki verileri do\u011frulamak (\u00f6rne\u011fin, bir e-posta adresinin ge\u00e7erli formatta olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek) veya kullan\u0131c\u0131n\u0131n yetkili olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek, kontrolc\u00fclerin sorumlulu\u011fu de\u011fildir. Bu t\u00fcr i\u015flemleri, kontrolc\u00fc fonksiyonunuz \u00e7a\u011fr\u0131lmadan \u00f6nce \u00e7al\u0131\u015fan ayr\u0131 middleware fonksiyonlar\u0131na devretmelisiniz. Joi, Express-validator gibi k\u00fct\u00fcphanelerle veri do\u011frulama middleware'leri olu\u015fturabilir, Passport.js ile kimlik do\u011frulama i\u015flemini y\u00f6netebilirsiniz. Bu sayede kontrolc\u00fcleriniz sadece temiz ve do\u011frulanm\u0131\u015f verilerle \u00e7al\u0131\u015f\u0131r.<\/p>\n<h3>4. Tutarl\u0131 Hata Y\u00f6netimi<\/h3>\n<p>Uygulaman\u0131z\u0131n her yerinde tutarl\u0131 bir hata y\u00f6netimi stratejisi benimseyin. Yukar\u0131da bahsetti\u011fimiz <code>catchAsync<\/code> yard\u0131mc\u0131 fonksiyonu ve global hata i\u015fleyici middleware'i, bu tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in harika y\u00f6ntemlerdir. Kontrolc\u00fclerinizde manuel <code>try-catch<\/code> bloklar\u0131 yerine, hatalar\u0131 <code>next(err)<\/code> ile merkezi hata i\u015fleyiciye y\u00f6nlendirin. Bu, kullan\u0131c\u0131lar\u0131n\u0131za anlaml\u0131 hata mesajlar\u0131 sunman\u0131z\u0131 ve hassas hata detaylar\u0131n\u0131n a\u00e7\u0131\u011fa \u00e7\u0131kmas\u0131n\u0131 engellemenizi sa\u011flar.<\/p>\n<h3>5. Parametre Do\u011frulama<\/h3>\n<p>Rota parametrelerini (<code>req.params<\/code>) veya sorgu parametrelerini (<code>req.query<\/code>) kullan\u0131rken, bunlar\u0131n bekledi\u011finiz formatta veya t\u00fcrde oldu\u011fundan emin olun. \u00d6rne\u011fin, bir ID parametresinin say\u0131sal olmas\u0131 bekleniyorsa, kontrolc\u00fcye gelmeden \u00f6nce bunun kontrol edilmesi faydal\u0131d\u0131r. Bu, olas\u0131 g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 veya \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur.<\/p>\n<h3>6. Mod\u00fcler Dosya Yap\u0131s\u0131<\/h3>\n<p>Kontrolc\u00fclerinizi ve ilgili mod\u00fclleri mant\u0131kl\u0131 bir \u015fekilde organize edin. \u00d6rne\u011fin, her kaynak (users, products, orders vb.) i\u00e7in ayr\u0131 kontrolc\u00fc dosyalar\u0131, rota dosyalar\u0131 ve belki de servis dosyalar\u0131 olu\u015fturun. Bu, projenizin b\u00fcy\u00fcmesiyle birlikte gezinmeyi ve bak\u0131m\u0131 \u00e7ok daha kolay hale getirir.<\/p>\n<div class=\"expert-tip\">\n        <strong>Uzman \u0130pucu: Klas\u00f6r Yap\u0131s\u0131 \u00d6rne\u011fi<\/strong><br \/>\n        \u00d6l\u00e7eklenebilir bir Express.js projesi i\u00e7in mod\u00fcler bir klas\u00f6r yap\u0131s\u0131 \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code>\n        src\/\n        \u251c\u2500\u2500 app.js\n        \u251c\u2500\u2500 config\/                  # Ortam de\u011fi\u015fkenleri, veritaban\u0131 ayarlar\u0131\n        \u251c\u2500\u2500 controllers\/\n        \u2502   \u251c\u2500\u2500 authController.js\n        \u2502   \u2514\u2500\u2500 userController.js\n        \u2502   \u2514\u2500\u2500 productController.js\n        \u251c\u2500\u2500 middlewares\/             # Kimlik do\u011frulama, do\u011frulama, hata yakalama\n        \u2502   \u251c\u2500\u2500 authMiddleware.js\n        \u2502   \u2514\u2500\u2500 validationMiddleware.js\n        \u2502   \u2514\u2500\u2500 errorMiddleware.js\n        \u251c\u2500\u2500 models\/                  # Veritaban\u0131 modelleri (Mongoose \u015femalar\u0131 vb.)\n        \u2502   \u251c\u2500\u2500 User.js\n        \u2502   \u2514\u2500\u2500 Product.js\n        \u251c\u2500\u2500 routes\/                  # Rota tan\u0131mlar\u0131\n        \u2502   \u251c\u2500\u2500 authRoutes.js\n        \u2502   \u2514\u2500\u2500 userRoutes.js\n        \u2502   \u2514\u2500\u2500 productRoutes.js\n        \u251c\u2500\u2500 services\/                # \u0130\u015f mant\u0131\u011f\u0131, veritaban\u0131 etkile\u015fimleri\n        \u2502   \u251c\u2500\u2500 userService.js\n        \u2502   \u2514\u2500\u2500 productService.js\n        \u2514\u2500\u2500 utils\/                   # Yard\u0131mc\u0131 fonksiyonlar (catchAsync, APIError s\u0131n\u0131f\u0131 vb.)\n            \u251c\u2500\u2500 appError.js\n            \u2514\u2500\u2500 catchAsync.js\n        <\/pre>\n<p><\/code><br \/>\n        Bu yap\u0131, her bir bile\u015fenin sorumlulu\u011funu net bir \u015fekilde ay\u0131rarak projenizin y\u00f6netimini basitle\u015ftirir.\n    <\/div>\n<p>Bu en iyi pratikleri uygulayarak, Express.js kontrolc\u00fclerinizi sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda uzun vadede bak\u0131m\u0131 kolay ve s\u00fcrd\u00fcr\u00fclebilir hale getirebilirsiniz. Unutmay\u0131n, iyi yaz\u0131lm\u0131\u015f bir kod taban\u0131 sadece bug\u00fcn de\u011fil, gelecekteki de\u011fi\u015fiklikler ve geni\u015fletmeler i\u00e7in de sa\u011flam bir temel olu\u015fturur.<\/p>\n<h2>Sonu\u00e7: Express.js Kontrolc\u00fclerinin G\u00fcc\u00fcn\u00fc Ke\u015ffedin<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, Express.js kontrolc\u00fclerinin ne oldu\u011funu, neden bu kadar \u00f6nemli olduklar\u0131n\u0131 ve modern API geli\u015ftirmenin temelini nas\u0131l olu\u015fturduklar\u0131n\u0131 detayl\u0131 bir \u015fekilde inceledik. Kontrolc\u00fcler, bir uygulaman\u0131n i\u015f mant\u0131\u011f\u0131n\u0131 rotalar\u0131ndan ay\u0131rarak mod\u00fclerlik, bak\u0131m kolayl\u0131\u011f\u0131, yeniden kullan\u0131labilirlik ve test edilebilirlik gibi say\u0131s\u0131z fayda sa\u011flar. Ger\u00e7ek d\u00fcnya senaryolar\u0131 ve en iyi pratikler \u00fczerinden, veri do\u011frulama, asenkron i\u015flemler ve hata y\u00f6netimi gibi karma\u015f\u0131k konular\u0131 kontrolc\u00fcler arac\u0131l\u0131\u011f\u0131yla nas\u0131l daha etkin bir \u015fekilde ele alabilece\u011fimizi g\u00f6rd\u00fck.<\/p>\n<p>Express.js, \"unopinionated\" (fikirsiz) bir framework oldu\u011fu i\u00e7in, kontrolc\u00fcleri nas\u0131l yap\u0131land\u0131raca\u011f\u0131n\u0131z konusunda size esneklik tan\u0131r. Ancak, yukar\u0131da bahsedilen prensipleri ve yap\u0131land\u0131rma yakla\u015f\u0131mlar\u0131n\u0131 benimsemek, projenizin b\u00fcy\u00fckl\u00fc\u011f\u00fc ne olursa olsun, temiz, d\u00fczenli ve \u00f6l\u00e7eklenebilir bir kod taban\u0131 olu\u015fturman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Bu bilgileri pratik projelerinizde uygulayarak kendi deneyiminizi geli\u015ftirmeniz, Express.js'te usta bir geli\u015ftirici olma yolunda ataca\u011f\u0131n\u0131z en \u00f6nemli ad\u0131mlardan biridir.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<h3>Kontrolc\u00fcleri ne zaman kullanmal\u0131y\u0131m?<\/h3>\n<p>Uygulaman\u0131zda birden fazla rota tan\u0131mlamaya ba\u015flad\u0131\u011f\u0131n\u0131zda veya rotalar\u0131n\u0131z\u0131n i\u015fleyi\u015fi karma\u015f\u0131kla\u015fmaya ba\u015flad\u0131\u011f\u0131nda kontrolc\u00fcleri kullanmal\u0131s\u0131n\u0131z. Kontrolc\u00fcler, i\u015f mant\u0131\u011f\u0131n\u0131 rotalardan ay\u0131rarak kodunuzu daha okunabilir ve y\u00f6netilebilir hale getirir. Basit tek sayfal\u0131k uygulamalarda bile, ilerideki geni\u015flemeler i\u00e7in bir al\u0131\u015fkanl\u0131k olarak kontrolc\u00fc kullanmaya ba\u015flamak faydal\u0131d\u0131r.<\/p>\n<h3>Kontrolc\u00fcler ve Middleware aras\u0131ndaki fark nedir?<\/h3>\n<p>Kontrolc\u00fcler, bir HTTP iste\u011fini do\u011frudan i\u015flemekten ve bir yan\u0131t d\u00f6nd\u00fcrmekten sorumlu olan ana i\u015f mant\u0131\u011f\u0131 par\u00e7alar\u0131d\u0131r. Middleware ise, istek ve yan\u0131t d\u00f6ng\u00fcs\u00fc s\u0131ras\u0131nda belirli i\u015flemleri ger\u00e7ekle\u015ftirmek i\u00e7in kullan\u0131lan fonksiyonlard\u0131r. \u00d6rne\u011fin, bir middleware iste\u011fi do\u011frulayabilir, kimlik do\u011frulamas\u0131n\u0131 yapabilir, loglama yapabilir veya hata yakalayabilir ve ard\u0131ndan iste\u011fi bir sonraki middleware'e veya kontrolc\u00fcye aktarabilir. Yani, middleware \"\u00f6n i\u015fleme\" veya \"son i\u015fleme\" yaparken, kontrolc\u00fc iste\u011fin ana \"i\u015flenmesini\" yapar.<\/p>\n<h3>Tek bir kontrolc\u00fc dosyas\u0131nda birden fazla kontrolc\u00fc fonksiyonu bulunabilir mi?<\/h3>\n<p>Evet, kesinlikle bulunabilir. Asl\u0131nda, bu yayg\u0131n bir pratiktir. Genellikle, belirli bir kayna\u011fa (\u00f6rne\u011fin, \"Kullan\u0131c\u0131lar\" veya \"\u00dcr\u00fcnler\") ait t\u00fcm i\u015flemler (olu\u015fturma, okuma, g\u00fcncelleme, silme - CRUD) tek bir kontrolc\u00fc dosyas\u0131 i\u00e7inde (\u00f6rne\u011fin, <code>userController.js<\/code> veya <code>productController.js<\/code>) ayr\u0131 ayr\u0131 fonksiyonlar olarak tan\u0131mlan\u0131r. Bu, ilgili mant\u0131\u011f\u0131 tek bir yerde toplar ve kodun organizasyonunu kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Kontrolc\u00fclerde veritaban\u0131 sorgular\u0131 yapmak do\u011fru mu?<\/h3>\n<p>Teknik olarak yapabilirsiniz, ancak bu genellikle en iyi pratik olarak kabul edilmez. \"Hafif kontrolc\u00fcler\" prensibine g\u00f6re, kontrolc\u00fcler i\u015f mant\u0131\u011f\u0131n\u0131 do\u011frudan kendileri uygulamamal\u0131d\u0131r. Veritaban\u0131 sorgular\u0131 gibi karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131, genellikle ayr\u0131 bir \"servis\" veya \"model\" katman\u0131na ta\u015f\u0131nmal\u0131d\u0131r. Kontrolc\u00fc, sadece bu servis katman\u0131n\u0131 \u00e7a\u011f\u0131rarak veritaban\u0131 i\u015flemlerini tetiklemeli ve servisten gelen yan\u0131t\u0131 i\u015flemelidir. Bu ayr\u0131m, kodunuzu daha mod\u00fcler, test edilebilir ve sorumluluklar\u0131 net hale getirir.<\/p>\n<p><\/body><br \/>\n<\/html><\/p>\n","protected":false},"excerpt":{"rendered":"Express.js uygulamalar\u0131nda kontrolc\u00fcler, iste\u011fin i\u015flenmesi ve yan\u0131t\u0131n olu\u015fturulmas\u0131 s\u00fcre\u00e7lerini nas\u0131l y\u00f6netir? Bu makale, sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 d\u00fczenlemenin temelini&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-34113","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.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber<\/title>\n<meta name=\"description\" content=\"Express.js uygulamalar\u0131nda kontrolc\u00fcler, iste\u011fin i\u015flenmesi ve yan\u0131t\u0131n olu\u015fturulmas\u0131 s\u00fcre\u00e7lerini nas\u0131l y\u00f6netir? Bu makale, sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 d\u00fczenlemenin temelini olu\u015fturan bu kritik bile\u015fenleri ba\u015ftan sona anlaman\u0131z\u0131 sa\u011flayacak kapsaml\u0131 bir rehber sunuyor. Express.js ile daha temiz, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir API&#039;ler geli\u015ftirmek i\u00e7in kontrolc\u00fclerin g\u00fcc\u00fcn\u00fc ke\u015ffetmeye haz\u0131r olun.\" \/>\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-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Express.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"Express.js uygulamalar\u0131nda kontrolc\u00fcler, iste\u011fin i\u015flenmesi ve yan\u0131t\u0131n olu\u015fturulmas\u0131 s\u00fcre\u00e7lerini nas\u0131l y\u00f6netir? Bu makale, sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 d\u00fczenlemenin temelini olu\u015fturan bu kritik bile\u015fenleri ba\u015ftan sona anlaman\u0131z\u0131 sa\u011flayacak kapsaml\u0131 bir rehber sunuyor. Express.js ile daha temiz, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir API&#039;ler geli\u015ftirmek i\u00e7in kontrolc\u00fclerin g\u00fcc\u00fcn\u00fc ke\u015ffetmeye haz\u0131r olun.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-11T07:31:01+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=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Express.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber\",\"datePublished\":\"2025-11-11T07:31:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/\"},\"wordCount\":2933,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/\",\"name\":\"Express.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-11T07:31:01+00:00\",\"description\":\"Express.js uygulamalar\u0131nda kontrolc\u00fcler, iste\u011fin i\u015flenmesi ve yan\u0131t\u0131n olu\u015fturulmas\u0131 s\u00fcre\u00e7lerini nas\u0131l y\u00f6netir? Bu makale, sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 d\u00fczenlemenin temelini olu\u015fturan bu kritik bile\u015fenleri ba\u015ftan sona anlaman\u0131z\u0131 sa\u011flayacak kapsaml\u0131 bir rehber sunuyor. Express.js ile daha temiz, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir API'ler geli\u015ftirmek i\u00e7in kontrolc\u00fclerin g\u00fcc\u00fcn\u00fc ke\u015ffetmeye haz\u0131r olun.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Express.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Express.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber","description":"Express.js uygulamalar\u0131nda kontrolc\u00fcler, iste\u011fin i\u015flenmesi ve yan\u0131t\u0131n olu\u015fturulmas\u0131 s\u00fcre\u00e7lerini nas\u0131l y\u00f6netir? Bu makale, sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 d\u00fczenlemenin temelini olu\u015fturan bu kritik bile\u015fenleri ba\u015ftan sona anlaman\u0131z\u0131 sa\u011flayacak kapsaml\u0131 bir rehber sunuyor. Express.js ile daha temiz, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir API'ler geli\u015ftirmek i\u00e7in kontrolc\u00fclerin g\u00fcc\u00fcn\u00fc ke\u015ffetmeye haz\u0131r olun.","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-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Express.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber","og_description":"Express.js uygulamalar\u0131nda kontrolc\u00fcler, iste\u011fin i\u015flenmesi ve yan\u0131t\u0131n olu\u015fturulmas\u0131 s\u00fcre\u00e7lerini nas\u0131l y\u00f6netir? Bu makale, sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 d\u00fczenlemenin temelini olu\u015fturan bu kritik bile\u015fenleri ba\u015ftan sona anlaman\u0131z\u0131 sa\u011flayacak kapsaml\u0131 bir rehber sunuyor. Express.js ile daha temiz, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir API'ler geli\u015ftirmek i\u00e7in kontrolc\u00fclerin g\u00fcc\u00fcn\u00fc ke\u015ffetmeye haz\u0131r olun.","og_url":"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-11T07:31:01+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Express.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber","datePublished":"2025-11-11T07:31:01+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/"},"wordCount":2933,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/","name":"Express.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-11T07:31:01+00:00","description":"Express.js uygulamalar\u0131nda kontrolc\u00fcler, iste\u011fin i\u015flenmesi ve yan\u0131t\u0131n olu\u015fturulmas\u0131 s\u00fcre\u00e7lerini nas\u0131l y\u00f6netir? Bu makale, sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 d\u00fczenlemenin temelini olu\u015fturan bu kritik bile\u015fenleri ba\u015ftan sona anlaman\u0131z\u0131 sa\u011flayacak kapsaml\u0131 bir rehber sunuyor. Express.js ile daha temiz, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir API'ler geli\u015ftirmek i\u00e7in kontrolc\u00fclerin g\u00fcc\u00fcn\u00fc ke\u015ffetmeye haz\u0131r olun.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/express-js-kontrolculerini-anlamak-mimariden-uygulamaya-kapsamli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Express.js Kontrolc\u00fclerini Anlamak: Mimariden Uygulamaya Kapsaml\u0131 Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34113","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=34113"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34113\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}