{"id":33087,"date":"2025-10-29T10:41:20","date_gmt":"2025-10-29T07:41:20","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33087"},"modified":"2025-10-29T10:41:20","modified_gmt":"2025-10-29T07:41:20","slug":"node-js-ve-express-ile-gelisime-baslangic-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/","title":{"rendered":"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi<\/h2>\n<h3>Giri\u015f: Web Geli\u015ftirmenin Kalbinde Node.js ve Express<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn modern web uygulamalar\u0131, sadece istemci taraf\u0131nda zengin kullan\u0131c\u0131 deneyimleri sunmakla kalm\u0131yor, ayn\u0131 zamanda sunucu taraf\u0131nda da y\u00fcksek performans, \u00f6l\u00e7eklenebilirlik ve esneklik bekliyor. \u0130\u015fte tam bu noktada Node.js ve Express ikilisi devreye giriyor. Node.js, Google Chrome&#8217;un V8 JavaScript motoru \u00fczerine kurulu, sunucu taraf\u0131 a\u011f uygulamalar\u0131 geli\u015ftirmek i\u00e7in kullan\u0131lan a\u00e7\u0131k kaynakl\u0131, \u00e7al\u0131\u015fma zaman\u0131 bir ortamd\u0131r. Geleneksel sunucu dillerinin aksine, JavaScript&#8217;i sunucu taraf\u0131nda \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r ve olay odakl\u0131, engellemeyen (non-blocking) I\/O modeli sayesinde y\u00fcksek performansl\u0131 ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmek i\u00e7in idealdir. Express.js ise Node.js i\u00e7in minimalist ve esnek bir web uygulama \u00e7at\u0131s\u0131d\u0131r (framework). Node.js&#8217;in ham g\u00fcc\u00fcn\u00fc kullanarak web uygulamalar\u0131 ve API&#8217;ler olu\u015fturmay\u0131 \u00e7ok daha kolay ve d\u00fczenli hale getirir. Bu makalede, Node.js ve Express d\u00fcnyas\u0131na ad\u0131m atacak, kurulumdan ba\u015flayarak temel kavramlar\u0131 \u00f6\u011frenecek, basit bir REST API geli\u015ftirecek ve bu g\u00fc\u00e7l\u00fc ikiliyle neler yapabilece\u011finizi ke\u015ffedeceksiniz.<\/p>\n<h3>Node.js Kurulumu: \u0130lk Ad\u0131mlar\u0131n\u0131z\u0131 At\u0131n<\/h3>\n<p>Node.js ve Express ile \u00e7al\u0131\u015fmaya ba\u015flamak i\u00e7in \u00f6ncelikle Node.js&#8217;i geli\u015ftirme ortam\u0131n\u0131za kurman\u0131z gerekir. Bu b\u00f6l\u00fcm, farkl\u0131 i\u015fletim sistemlerinde Node.js kurulumunu ve kurulumun do\u011frulanmas\u0131n\u0131 kapsayacakt\u0131r.<\/p>\n<h4>\u0130\u015fletim Sistemlerine G\u00f6re Kurulum<\/h4>\n<p>*   <strong>Windows:<\/strong><br \/>\n    Node.js&#8217;in resmi web sitesi (nodejs.org) \u00fczerinden Windows Installer (.msi) dosyas\u0131n\u0131 indirmeniz en kolay yoldur. \u0130ndirdi\u011finiz dosyay\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n ve kurulum sihirbaz\u0131ndaki ad\u0131mlar\u0131 takip edin. Varsay\u0131lan ayarlarla ilerlemek genellikle yeterlidir. Bu kurulum, Node.js ile birlikte npm (Node Package Manager) paket y\u00f6neticisini de otomatik olarak y\u00fckleyecektir.<br \/>\n*   <strong>macOS:<\/strong><br \/>\n    Windows&#8217;a benzer \u015fekilde, Node.js&#8217;in resmi web sitesinden macOS Installer (.pkg) dosyas\u0131n\u0131 indirip kurabilirsiniz. Alternatif olarak, macOS kullan\u0131c\u0131lar\u0131 genellikle Homebrew paket y\u00f6neticisini tercih ederler. Homebrew kurulu ise, terminalde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak Node.js&#8217;i kurabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">brew install node<\/code><\/pre>\n<p>    Bu komut, Node.js ve npm&#8217;i sisteminize kuracakt\u0131r.<br \/>\n*   <strong>Linux (Ubuntu\/Debian tabanl\u0131 sistemler i\u00e7in \u00f6rnek):<\/strong><br \/>\n    Linux da\u011f\u0131t\u0131mlar\u0131 i\u00e7in Node.js&#8217;i kurman\u0131n birka\u00e7 yolu vard\u0131r. En yayg\u0131n y\u00f6ntemlerden biri, NodeSource depolar\u0131n\u0131 kullanmakt\u0131r. Bu depolar, Node.js&#8217;in en g\u00fcncel ve kararl\u0131 s\u00fcr\u00fcmlerini sunar.<\/p>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/deb.nodesource.com\/setup_lts.x | sudo -E bash -\n    sudo apt-get install -y nodejs<\/code><\/pre>\n<p>    <code>lts.x<\/code> yerine istedi\u011finiz Node.js versiyonunu (\u00f6rne\u011fin <code>18.x<\/code>, <code>20.x<\/code>) yazabilirsiniz. Bu i\u015flem de npm&#8217;i otomatik olarak kuracakt\u0131r.<\/p>\n<h4>Kurulum Do\u011frulamas\u0131<\/h4>\n<p>Kurulum tamamland\u0131ktan sonra, Node.js ve npm&#8217;in do\u011fru bir \u015fekilde kurulup kurulmad\u0131\u011f\u0131n\u0131 kontrol etmek \u00f6nemlidir. Terminalinizi veya komut istemcinizi a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">node -v\nnpm -v<\/code><\/pre>\n<p>Bu komutlar, kurulu Node.js ve npm&#8217;in versiyon numaralar\u0131n\u0131 d\u00f6nd\u00fcrmelidir. E\u011fer versiyon numaralar\u0131n\u0131 g\u00f6r\u00fcyorsan\u0131z, kurulum ba\u015far\u0131l\u0131 demektir.<\/p>\n<h4>Versiyon Y\u00f6neticileri (NVM &#8211; Node Version Manager)<\/h4>\n<p>Geli\u015ftirme s\u00fcrecinde farkl\u0131 Node.js projeleriyle \u00e7al\u0131\u015f\u0131rken, her projenin farkl\u0131 bir Node.js versiyonu gerektirdi\u011fini fark edebilirsiniz. Bu durumu y\u00f6netmek i\u00e7in NVM (Node Version Manager) gibi ara\u00e7lar olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. NVM, tek bir sistemde birden fazla Node.js versiyonunu kurman\u0131za, bunlar aras\u0131nda kolayca ge\u00e7i\u015f yapman\u0131za ve varsay\u0131lan versiyonu ayarlaman\u0131za olanak tan\u0131r.<br \/>\nNVM&#8217;i kurmak i\u00e7in resmi GitHub sayfas\u0131ndaki y\u00f6nergeleri takip edebilirsiniz. Kurulduktan sonra, a\u015fa\u011f\u0131daki gibi komutlarla farkl\u0131 Node.js versiyonlar\u0131n\u0131 y\u00f6netebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">nvm install 18 # Node.js 18.x s\u00fcr\u00fcm\u00fcn\u00fc kurar\nnvm use 18     # Node.js 18.x s\u00fcr\u00fcm\u00fcn\u00fc kullan\u0131r\nnvm install 20 # Node.js 20.x s\u00fcr\u00fcm\u00fcn\u00fc kurar\nnvm use 20     # Node.js 20.x s\u00fcr\u00fcm\u00fcn\u00fc kullan\u0131r\nnvm ls         # Kurulu t\u00fcm Node.js versiyonlar\u0131n\u0131 listeler<\/code><\/pre>\n<h3>Temel Node.js Kavramlar\u0131: JavaScript&#8217;in G\u00fcc\u00fc Sunucuda<\/h3>\n<p>Node.js ile etkili bir \u015fekilde \u00e7al\u0131\u015fmak i\u00e7in baz\u0131 temel kavramlar\u0131 anlamak kritik \u00f6neme sahiptir.<\/p>\n<h4>Mod\u00fcller<\/h4>\n<p>Node.js, uygulamalar\u0131 k\u00fc\u00e7\u00fck, yeniden kullan\u0131labilir par\u00e7alara b\u00f6lmek i\u00e7in mod\u00fcl sistemini kullan\u0131r. Bu, kodun d\u00fczenli, okunabilir ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. \u0130ki ana mod\u00fcl sistemi vard\u0131r:<\/p>\n<p>*   <strong>CommonJS (require\/module.exports):<\/strong> Node.js&#8217;in geleneksel mod\u00fcl sistemidir. Bir mod\u00fcl\u00fc d\u0131\u015fa aktarmak i\u00e7in <code>module.exports<\/code>, i\u00e7e aktarmak i\u00e7in ise <code>require()<\/code> kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ myModule.js\n    function greet(name) {\n        return <code>Hello, ${name}!<\/code>;\n    }\n    module.exports = greet;\n\n    \/\/ app.js\n    const greet = require('.\/myModule');\n    console.log(greet('Node.js')); \/\/ Hello, Node.js!<\/code><\/pre>\n<p>*   <strong>ES Modules (import\/export):<\/strong> ECMAScript 2015 (ES6) ile standartla\u015fan bu mod\u00fcl sistemi, taray\u0131c\u0131lar ve Node.js taraf\u0131ndan giderek daha fazla benimsenmektedir. <code>package.json<\/code> dosyan\u0131zda <code>\"type\": \"module\"<\/code> tan\u0131mlayarak veya <code>.mjs<\/code> uzant\u0131l\u0131 dosyalar kullanarak ES mod\u00fcllerini kullanabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ myModule.mjs\n    export function greet(name) {\n        return <code>Hello, ${name}!<\/code>;\n    }\n\n    \/\/ app.mjs\n    import { greet } from '.\/myModule.mjs';\n    console.log(greet('Node.js')); \/\/ Hello, Node.js!<\/code><\/pre>\n<h4>npm (Node Package Manager)<\/h4>\n<p>npm, Node.js ekosisteminin kalbinde yer alan bir paket y\u00f6neticisidir. Milyonlarca a\u00e7\u0131k kaynak k\u00fct\u00fcphane ve arac\u0131 bar\u0131nd\u0131ran npm kay\u0131t defterinden paketleri indirmenizi, projenize dahil etmenizi ve kendi projelerinizi yay\u0131nlaman\u0131z\u0131 sa\u011flar.<\/p>\n<p>*   <strong><code>npm init<\/code>:<\/strong> Yeni bir Node.js projesi ba\u015flatt\u0131\u011f\u0131n\u0131zda, bu komutu \u00e7al\u0131\u015ft\u0131rarak <code>package.json<\/code> dosyas\u0131n\u0131 olu\u015fturursunuz. Bu dosya, projenizin metadata&#8217;s\u0131n\u0131 (ad\u0131, versiyonu, a\u00e7\u0131klamas\u0131, ana giri\u015f noktas\u0131, ba\u011f\u0131ml\u0131l\u0131klar\u0131 vb.) tutar.<br \/>\n*   <strong><code>npm install <paket-ad\u0131><\/code>:<\/strong> Belirli bir paketi projenize ba\u011f\u0131ml\u0131l\u0131k olarak eklemek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, <code>npm install express<\/code>.<br \/>\n*   <strong><code>npm install<\/code>:<\/strong> <code>package.json<\/code> dosyas\u0131nda listelenen t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckler. Genellikle bir projeyi klonlad\u0131ktan sonra \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<br \/>\n*   <strong><code>npm uninstall <paket-ad\u0131><\/code>:<\/strong> Bir paketi projeden kald\u0131r\u0131r.<\/p>\n<h4><code>package.json<\/code><\/h4>\n<p>Bu dosya, her Node.js projesinin kimlik kart\u0131d\u0131r. Projenin ad\u0131, versiyonu, a\u00e7\u0131klamas\u0131, ana giri\u015f dosyas\u0131 (<code>main<\/code>), \u00e7al\u0131\u015ft\u0131r\u0131labilir komutlar (<code>scripts<\/code>) ve en \u00f6nemlisi, projenin ihtiya\u00e7 duydu\u011fu t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar (<code>dependencies<\/code> ve <code>devDependencies<\/code>) burada tan\u0131mlan\u0131r.<\/p>\n<pre><code class=\"language-json\">{\n  \"name\": \"my-node-app\",\n  \"version\": \"1.0.0\",\n  \"description\": \"My first Node.js and Express application.\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"start\": \"node app.js\",\n    \"dev\": \"nodemon app.js\"\n  },\n  \"keywords\": [],\n  \"author\": \"Your Name\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"express\": \"^4.18.2\"\n  },\n  \"devDependencies\": {\n    \"nodemon\": \"^3.0.1\"\n  }\n}<\/code><\/pre>\n<h4>Asenkron Programlama (Callbacks, Promises, Async\/Await)<\/h4>\n<p>Node.js&#8217;in en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri, engellemeyen (non-blocking) I\/O modelidir. Bu, Node.js&#8217;in bir i\u015flem tamamlan\u0131rken di\u011fer i\u015flemleri yapmaya devam edebilmesi anlam\u0131na gelir. Bu model, asenkron programlama ile y\u00f6netilir.<\/p>\n<p>*   <strong>Callbacks:<\/strong> Geleneksel olarak, Node.js&#8217;te asenkron i\u015flemleri y\u00f6netmek i\u00e7in callback fonksiyonlar\u0131 kullan\u0131l\u0131rd\u0131. Bir i\u015flem bitti\u011finde \u00e7a\u011fr\u0131lacak fonksiyonu parametre olarak ge\u00e7ersiniz.<\/p>\n<pre><code class=\"language-javascript\">fs.readFile('file.txt', 'utf8', (err, data) => {\n        if (err) {\n            console.error('Error reading file:', err);\n            return;\n        }\n        console.log('File content:', data);\n    });\n    console.log('Reading file...'); \/\/ Bu \u00f6nce \u00e7al\u0131\u015f\u0131r<\/code><\/pre>\n<p>*   <strong>Promises:<\/strong> Callback cehenneminden (callback hell) ka\u00e7\u0131nmak ve asenkron kodu daha okunabilir hale getirmek i\u00e7in Promises (Vaatler) ortaya \u00e7\u0131kt\u0131. Bir i\u015flem gelecekteki bir de\u011feri temsil eder ve ba\u015far\u0131l\u0131 olursa <code>.then()<\/code>, ba\u015far\u0131s\u0131z olursa <code>.catch()<\/code> ile i\u015flenir.<\/p>\n<pre><code class=\"language-javascript\">function readFilePromise(filePath) {\n        return new Promise((resolve, reject) => {\n            fs.readFile(filePath, 'utf8', (err, data) => {\n                if (err) reject(err);\n                else resolve(data);\n            });\n        });\n    }\n\n    readFilePromise('file.txt')\n        .then(data => console.log('File content:', data))\n        .catch(err => console.error('Error reading file:', err));<\/code><\/pre>\n<p>*   <strong>Async\/Await:<\/strong> ES2017 ile gelen <code>async\/await<\/code> sentaks\u0131, Promises&#8217;\u0131n \u00fczerine in\u015fa edilmi\u015ftir ve asenkron kodu senkron gibi yazman\u0131z\u0131 sa\u011flar, bu da okunabilirli\u011fi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<pre><code class=\"language-javascript\">async function processFile() {\n        try {\n            const data = await readFilePromise('file.txt');\n            console.log('File content:', data);\n        } catch (err) {\n            console.error('Error reading file:', err);\n        }\n    }\n    processFile();<\/code><\/pre>\n<h4>Olay D\u00f6ng\u00fcs\u00fc (Event Loop)<\/h4>\n<p>Node.js&#8217;in engellemeyen yap\u0131s\u0131n\u0131n temelinde Olay D\u00f6ng\u00fcs\u00fc yatar. Tek i\u015f par\u00e7ac\u0131kl\u0131 olmas\u0131na ra\u011fmen, I\/O i\u015flemleri gibi uzun s\u00fcren g\u00f6revleri arka planda y\u00fcr\u00fct\u00fcr ve tamamland\u0131klar\u0131nda bir callback&#8217;i olay kuyru\u011funa ekler. Olay d\u00f6ng\u00fcs\u00fc, \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131 bo\u015fald\u0131\u011f\u0131nda bu kuyruktaki callback&#8217;leri s\u0131rayla i\u015fler. Bu model, Node.js&#8217;in ayn\u0131 anda binlerce ba\u011flant\u0131y\u0131 verimli bir \u015fekilde y\u00f6netmesini sa\u011flar.<\/p>\n<h3>Express.js&#8217;e Giri\u015f: Web Uygulamalar\u0131 Olu\u015fturman\u0131n Kolay Yolu<\/h3>\n<p>Node.js&#8217;in g\u00fcc\u00fc tart\u0131\u015f\u0131lmaz olsa da, ham Node.js ile bir web sunucusu olu\u015fturmak ve karma\u015f\u0131k y\u00f6nlendirme, middleware y\u00f6netimi gibi g\u00f6revleri ele almak olduk\u00e7a zahmetli olabilir. \u0130\u015fte Express.js&#8217;in parlad\u0131\u011f\u0131 yer buras\u0131d\u0131r.<\/p>\n<h4>Express Nedir, Neden Kullan\u0131l\u0131r?<\/h4>\n<p>Express.js, Node.js i\u00e7in minimal ve esnek bir web uygulama \u00e7at\u0131s\u0131d\u0131r. Web uygulamalar\u0131 ve API&#8217;ler geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc bir dizi \u00f6zellik sunar:<br \/>\n*   <strong>Y\u00f6nlendirme (Routing):<\/strong> HTTP metotlar\u0131na (GET, POST, PUT, DELETE vb.) ve URL yollar\u0131na dayal\u0131 olarak sunucu isteklerine yan\u0131t verme mekanizmas\u0131.<br \/>\n*   <strong>Middleware:<\/strong> \u0130stek ve yan\u0131t d\u00f6ng\u00fcs\u00fc boyunca i\u015flevsellik eklemenizi sa\u011flayan ara yaz\u0131l\u0131m katmanlar\u0131.<br \/>\n*   <strong>\u015eablon Motoru Entegrasyonu:<\/strong> Dinamik HTML sayfalar\u0131 olu\u015fturmak i\u00e7in Pug (Jade), EJS, Handlebars gibi \u015fablon motorlar\u0131yla kolay entegrasyon.<br \/>\n*   <strong>Geni\u015fletilebilirlik:<\/strong> Binlerce \u00fc\u00e7\u00fcnc\u00fc taraf npm paketi ile kolayca geni\u015fletilebilir.<br \/>\n*   <strong>H\u0131zl\u0131 Geli\u015ftirme:<\/strong> Minimalist yap\u0131s\u0131 sayesinde h\u0131zl\u0131 prototipleme ve uygulama geli\u015ftirmeye olanak tan\u0131r.<\/p>\n<h4>Temel Bir Express Uygulamas\u0131 Olu\u015fturma<\/h4>\n<p>\u015eimdi, ilk Express uygulaman\u0131z\u0131 olu\u015ftural\u0131m.<\/p>\n<p>1.  <strong>Proje Dizini Olu\u015fturma:<\/strong><\/p>\n<pre><code class=\"language-bash\">mkdir my-express-app\n    cd my-express-app<\/code><\/pre>\n<p>2.  <strong><code>npm init<\/code> ile Projeyi Ba\u015flatma:<\/strong><\/p>\n<pre><code class=\"language-bash\">npm init -y<\/code><\/pre>\n<p>    <code>-y<\/code> bayra\u011f\u0131, t\u00fcm sorulara varsay\u0131lan cevaplar\u0131 vermenizi sa\u011flar ve h\u0131zl\u0131ca bir <code>package.json<\/code> dosyas\u0131 olu\u015fturur.<\/p>\n<p>3.  <strong>Express&#8217;i Kurma:<\/strong><\/p>\n<pre><code class=\"language-bash\">npm install express<\/code><\/pre>\n<p>    Bu komut, <code>express<\/code> paketini indirir ve <code>package.json<\/code> dosyan\u0131zdaki <code>dependencies<\/code> b\u00f6l\u00fcm\u00fcne ekler.<\/p>\n<p>4.  <strong>&#8220;Hello World&#8221; Express Uygulamas\u0131:<\/strong><br \/>\n    <code>app.js<\/code> ad\u0131nda yeni bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<pre><code class=\"language-javascript\">\/\/ app.js\n    const express = require('express'); \/\/ Express mod\u00fcl\u00fcn\u00fc i\u00e7e aktar\n    const app = express();              \/\/ Express uygulamas\u0131n\u0131 ba\u015flat\n    const port = 3000;                  \/\/ Uygulaman\u0131n dinleyece\u011fi port numaras\u0131\n\n    \/\/ Ana dizine (root URL) gelen GET isteklerini dinle\n    app.get('\/', (req, res) => {\n      res.send('Hello World from Express!'); \/\/ \u0130stemciye \"Hello World\" yan\u0131t\u0131 g\u00f6nder\n    });\n\n    \/\/ Uygulamay\u0131 belirtilen portta dinlemeye ba\u015fla\n    app.listen(port, () => {\n      console.log(<code>Express uygulamas\u0131 http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor<\/code>);\n    });<\/code><\/pre>\n<p>    Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalinizde:<\/p>\n<pre><code class=\"language-bash\">node app.js<\/code><\/pre>\n<p>    Komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:3000<\/code> adresine gitti\u011finizde &#8220;Hello World from Express!&#8221; mesaj\u0131n\u0131 g\u00f6rmelisiniz. Tebrikler, ilk Express uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131n\u0131z!<\/p>\n<h3>Express Temelleri: Middleware ve Y\u00f6nlendirme<\/h3>\n<p>Express&#8217;in g\u00fcc\u00fc, middleware ve y\u00f6nlendirme mekanizmalar\u0131nda yatar. Bu kavramlar\u0131 anlamak, karma\u015f\u0131k web uygulamalar\u0131 geli\u015ftirmenin anahtar\u0131d\u0131r.<\/p>\n<h4>Middleware Kavram\u0131<\/h4>\n<p>Middleware (ara yaz\u0131l\u0131m), Express uygulamas\u0131n\u0131n istek-yan\u0131t d\u00f6ng\u00fcs\u00fc s\u0131ras\u0131nda y\u00fcr\u00fct\u00fclen i\u015flevlerdir. Bu i\u015flevler, bir HTTP iste\u011fi sunucuya ula\u015ft\u0131\u011f\u0131nda, yan\u0131t g\u00f6nderilmeden \u00f6nce veya sonra \u00e7al\u0131\u015fabilir. Her middleware fonksiyonu, <code>req<\/code> (istek), <code>res<\/code> (yan\u0131t) nesnelerine ve bir sonraki middleware fonksiyonuna ge\u00e7mek i\u00e7in <code>next<\/code> adl\u0131 bir fonksiyona eri\u015febilir.<\/p>\n<p>*   <strong>Uygulama Seviyesi Middleware:<\/strong> <code>app.use()<\/code> ile t\u00fcm isteklere uygulanan middleware&#8217;lerdir.<\/p>\n<pre><code class=\"language-javascript\">app.use((req, res, next) => {\n      console.log('Bir istek geldi:', req.method, req.url);\n      next(); \/\/ Bir sonraki middleware'e veya rota i\u015fleyicisine ge\u00e7\n    });<\/code><\/pre>\n<p>*   <strong>Y\u00f6nlendirici Seviyesi Middleware:<\/strong> Belirli bir rota veya rota grubu i\u00e7in uygulanan middleware&#8217;lerdir.<\/p>\n<pre><code class=\"language-javascript\">app.get('\/users', (req, res, next) => {\n      console.log('Kullan\u0131c\u0131lar rotas\u0131na istek geldi.');\n      next();\n    }, (req, res) => {\n      res.send('Kullan\u0131c\u0131 listesi');\n    });<\/code><\/pre>\n<p>*   <strong>Hata \u0130\u015fleme Middleware:<\/strong> D\u00f6rt arg\u00fcman alan \u00f6zel bir middleware t\u00fcr\u00fcd\u00fcr: <code>(err, req, res, next)<\/code>. Uygulamada bir hata olu\u015ftu\u011funda tetiklenir. Her zaman di\u011fer <code>app.use()<\/code> \u00e7a\u011fr\u0131lar\u0131ndan sonra tan\u0131mlanmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-javascript\">app.use((err, req, res, next) => {\n      console.error(err.stack);\n      res.status(500).send('Sunucu Hatas\u0131!');\n    });<\/code><\/pre>\n<p>*   <strong>Yerle\u015fik Middleware:<\/strong> Express&#8217;in kendi i\u00e7inde gelen ve s\u0131kl\u0131kla kullan\u0131lan middleware&#8217;lerdir.<br \/>\n    *   <code>express.static('public')<\/code>: Statik dosyalar\u0131 (HTML, CSS, JavaScript, resimler) sunmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>express.json()<\/code>: Gelen istek g\u00f6vdesindeki JSON verilerini ayr\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>express.urlencoded({ extended: true })<\/code>: Gelen istek g\u00f6vdesindeki URL kodlu verileri (form verileri gibi) ayr\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong>\u00dc\u00e7\u00fcnc\u00fc Taraf Middleware:<\/strong> npm \u00fczerinden kurulan ve yayg\u0131n olarak kullan\u0131lan middleware&#8217;lerdir.<br \/>\n    *   <strong><code>morgan<\/code>:<\/strong> HTTP isteklerini loglamak i\u00e7in kullan\u0131l\u0131r. <code>npm install morgan<\/code> ile kurulur.<br \/>\n    *   <strong><code>body-parser<\/code>:<\/strong> Gelen istek g\u00f6vdesini ayr\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r (Express 4.16.0&#8217;dan itibaren <code>express.json()<\/code> ve <code>express.urlencoded()<\/code> ile entegre edilmi\u015ftir, bu y\u00fczden genellikle ayr\u0131 olarak kurulmas\u0131na gerek kalmam\u0131\u015ft\u0131r).<\/p>\n<h4>Y\u00f6nlendirme (Routing)<\/h4>\n<p>Y\u00f6nlendirme, bir uygulaman\u0131n istemci isteklerine nas\u0131l yan\u0131t verdi\u011fini tan\u0131mlar. Belirli bir URL yoluna ve HTTP metoduna (GET, POST, PUT, DELETE vb.) g\u00f6re farkl\u0131 i\u015flevsellikler tetikleyebilirsiniz.<\/p>\n<p>*   <strong>HTTP Metotlar\u0131:<\/strong><\/p>\n<pre><code class=\"language-javascript\">app.get('\/api\/data', (req, res) => {\n      res.json({ message: 'GET iste\u011fi' });\n    });\n\n    app.post('\/api\/data', (req, res) => {\n      res.json({ message: 'POST iste\u011fi', data: req.body });\n    });\n\n    app.put('\/api\/data\/:id', (req, res) => {\n      res.json({ message: <code>PUT iste\u011fi, ID: ${req.params.id}<\/code> });\n    });\n\n    app.delete('\/api\/data\/:id', (req, res) => {\n      res.json({ message: <code>DELETE iste\u011fi, ID: ${req.params.id}<\/code> });\n    });<\/code><\/pre>\n<p>*   <strong>Rota Parametreleri (<code>\/users\/:id<\/code>):<\/strong> URL&#8217;deki dinamik segmentleri yakalamak i\u00e7in kullan\u0131l\u0131r. <code>req.params<\/code> nesnesinde eri\u015filebilir.<\/p>\n<pre><code class=\"language-javascript\">app.get('\/users\/:userId\/books\/:bookId', (req, res) => {\n      console.log(req.params.userId); \/\/ 'req.params.userId' de\u011ferini verir\n      console.log(req.params.bookId); \/\/ 'req.params.bookId' de\u011ferini verir\n      res.send(<code>Kullan\u0131c\u0131 ID: ${req.params.userId}, Kitap ID: ${req.params.bookId}<\/code>);\n    });<\/code><\/pre>\n<p>*   <strong>Sorgu Parametreleri (<code>\/search?q=node<\/code>):<\/strong> URL&#8217;deki sorgu dizesi parametrelerini yakalamak i\u00e7in kullan\u0131l\u0131r. <code>req.query<\/code> nesnesinde eri\u015filebilir.<\/p>\n<pre><code class=\"language-javascript\">app.get('\/search', (req, res) => {\n      const searchTerm = req.query.q;\n      const category = req.query.category;\n      res.send(<code>Arama terimi: ${searchTerm}, Kategori: ${category}<\/code>);\n    });\n    \/\/ \u00d6rnek: \/search?q=express&category=web<\/code><\/pre>\n<p>*   <strong>Router S\u0131n\u0131f\u0131:<\/strong> B\u00fcy\u00fck uygulamalarda y\u00f6nlendirmeyi daha mod\u00fcler hale getirmek i\u00e7in <code>express.Router()<\/code> s\u0131n\u0131f\u0131 kullan\u0131l\u0131r. Bu, rotalar\u0131 ayr\u0131 dosyalarda tan\u0131mlaman\u0131za ve ana uygulamaya eklemenize olanak tan\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ routes\/userRoutes.js\n    const express = require('express');\n    const router = express.Router();\n\n    router.get('\/', (req, res) => {\n      res.send('T\u00fcm kullan\u0131c\u0131lar');\n    });\n\n    router.get('\/:id', (req, res) => {\n      res.send(<code>Kullan\u0131c\u0131 ID: ${req.params.id}<\/code>);\n    });\n\n    module.exports = router;\n\n    \/\/ app.js\n    const userRoutes = require('.\/routes\/userRoutes');\n    app.use('\/users', userRoutes); \/\/ '\/users' \u00f6n eki ile userRoutes'\u0131 kullan<\/code><\/pre>\n<h4>\u0130stek (Request) ve Yan\u0131t (Response) Nesneleri<\/h4>\n<p>Express&#8217;teki her rota i\u015fleyici fonksiyonu, iki ana nesne al\u0131r: <code>req<\/code> (request &#8211; istek) ve <code>res<\/code> (response &#8211; yan\u0131t).<\/p>\n<p>*   <strong><code>req<\/code> Nesnesi:<\/strong> \u0130stemciden gelen HTTP iste\u011fi hakk\u0131nda bilgiler i\u00e7erir.<br \/>\n    *   <code>req.params<\/code>: Rota parametreleri (<code>\/users\/:id<\/code> durumunda <code>id<\/code>).<br \/>\n    *   <code>req.query<\/code>: URL sorgu parametreleri (<code>\/search?q=node<\/code> durumunda <code>q<\/code>).<br \/>\n    *   <code>req.body<\/code>: POST\/PUT isteklerinde g\u00f6nderilen veri (JSON, form verileri vb.). Bu verilere eri\u015fmek i\u00e7in <code>express.json()<\/code> veya <code>express.urlencoded()<\/code> middleware&#8217;leri gereklidir.<br \/>\n    *   <code>req.headers<\/code>: \u0130stek ba\u015fl\u0131klar\u0131.<br \/>\n    *   <code>req.method<\/code>: \u0130stek metodu (GET, POST vb.).<br \/>\n    *   <code>req.url<\/code>: \u0130stek URL&#8217;si.<br \/>\n*   <strong><code>res<\/code> Nesnesi:<\/strong> Sunucunun istemciye g\u00f6nderece\u011fi HTTP yan\u0131t\u0131n\u0131 olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>res.send(body)<\/code>: \u00c7e\u015fitli t\u00fcrlerde yan\u0131tlar g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r (string, buffer, object, array). Content-Type ba\u015fl\u0131\u011f\u0131n\u0131 otomatik ayarlar.<br \/>\n    *   <code>res.json(obj)<\/code>: JSON format\u0131nda yan\u0131t g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r. <code>res.send()<\/code>&#8216;in JSON versiyonudur.<br \/>\n    *   <code>res.status(code)<\/code>: HTTP durum kodunu ayarlar (\u00f6rn. <code>res.status(404).send('Bulunamad\u0131')<\/code>).<br \/>\n    *   <code>res.render(viewName, data)<\/code>: \u015eablon motoru kullanarak dinamik HTML sayfalar\u0131 olu\u015fturmak ve g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>res.redirect(url)<\/code>: \u0130stemciyi ba\u015fka bir URL&#8217;ye y\u00f6nlendirir.<\/p>\n<h3>Ger\u00e7ek Bir Uygulama \u00d6rne\u011fi: Basit Bir REST API Olu\u015fturma<\/h3>\n<p>\u015eimdi \u00f6\u011frendiklerimizi birle\u015ftirerek, basit bir &#8220;G\u00f6rev Y\u00f6netimi&#8221; REST API&#8217;si olu\u015ftural\u0131m. Bu API, g\u00f6revleri (task) olu\u015fturma, okuma, g\u00fcncelleme ve silme (CRUD) i\u015flemlerini destekleyecek. Veritaban\u0131 yerine basit bir bellek i\u00e7i dizi kullanaca\u011f\u0131z.<\/p>\n<p>1.  <strong>Proje Yap\u0131s\u0131:<\/strong><\/p>\n<pre><code class=\"language-\">my-task-api\/\n    \u251c\u2500\u2500 node_modules\/\n    \u251c\u2500\u2500 package.json\n    \u251c\u2500\u2500 app.js\n    \u2514\u2500\u2500 tasks.js (veri depolama)<\/code><\/pre>\n<p>2.  <strong><code>app.js<\/code> dosyas\u0131n\u0131 g\u00fcncelleyin:<\/strong><\/p>\n<pre><code class=\"language-javascript\">const express = require('express');\n    const app = express();\n    const port = 3000;\n\n    \/\/ Middleware'ler\n    app.use(express.json()); \/\/ JSON istek g\u00f6vdelerini ayr\u0131\u015ft\u0131rmak i\u00e7in\n    app.use(express.urlencoded({ extended: true })); \/\/ URL-encoded istek g\u00f6vdelerini ayr\u0131\u015ft\u0131rmak i\u00e7in\n\n    \/\/ G\u00f6revlerimizi depolayaca\u011f\u0131m\u0131z basit bir dizi (veri taban\u0131 yerine)\n    let tasks = [\n      { id: 1, title: 'Node.js \u00d6\u011fren', completed: false },\n      { id: 2, title: 'Express.js \u0130ncele', completed: true },\n    ];\n    let nextId = 3; \/\/ Yeni g\u00f6revler i\u00e7in ID \u00fcretici\n\n    \/\/ --- CRUD Operasyonlar\u0131 ---\n\n    \/\/ 1. T\u00fcm G\u00f6revleri Getir (GET \/tasks)\n    app.get('\/tasks', (req, res) => {\n      res.json(tasks);\n    });\n\n    \/\/ 2. Belirli Bir G\u00f6revi Getir (GET \/tasks\/:id)\n    app.get('\/tasks\/:id', (req, res) => {\n      const taskId = parseInt(req.params.id);\n      const task = tasks.find(t => t.id === taskId);\n\n      if (!task) {\n        return res.status(404).json({ message: 'G\u00f6rev bulunamad\u0131' });\n      }\n      res.json(task);\n    });\n\n    \/\/ 3. Yeni Bir G\u00f6rev Olu\u015ftur (POST \/tasks)\n    app.post('\/tasks', (req, res) => {\n      const { title, completed } = req.body;\n\n      if (!title) {\n        return res.status(400).json({ message: 'Ba\u015fl\u0131k alan\u0131 zorunludur' });\n      }\n\n      const newTask = {\n        id: nextId++,\n        title,\n        completed: completed || false, \/\/ Varsay\u0131lan olarak false\n      };\n      tasks.push(newTask);\n      res.status(201).json(newTask); \/\/ 201 Created durumu ile yeni g\u00f6revi d\u00f6nd\u00fcr\n    });\n\n    \/\/ 4. Bir G\u00f6revi G\u00fcncelle (PUT \/tasks\/:id)\n    app.put('\/tasks\/:id', (req, res) => {\n      const taskId = parseInt(req.params.id);\n      const { title, completed } = req.body;\n\n      const taskIndex = tasks.findIndex(t => t.id === taskId);\n\n      if (taskIndex === -1) {\n        return res.status(404).json({ message: 'G\u00f6rev bulunamad\u0131' });\n      }\n\n      if (!title && completed === undefined) {\n          return res.status(400).json({ message: 'G\u00fcncellenecek veri sa\u011flanmad\u0131' });\n      }\n\n      \/\/ Mevcut g\u00f6revi g\u00fcncelle\n      if (title) tasks[taskIndex].title = title;\n      if (completed !== undefined) tasks[taskIndex].completed = completed;\n\n      res.json(tasks[taskIndex]);\n    });\n\n    \/\/ 5. Bir G\u00f6revi Sil (DELETE \/tasks\/:id)\n    app.delete('\/tasks\/:id', (req, res) => {\n      const taskId = parseInt(req.params.id);\n      const initialLength = tasks.length;\n      tasks = tasks.filter(t => t.id !== taskId);\n\n      if (tasks.length === initialLength) {\n        return res.status(404).json({ message: 'G\u00f6rev bulunamad\u0131' });\n      }\n      res.status(204).send(); \/\/ 204 No Content durumu ile yan\u0131t g\u00f6nder\n    });\n\n    \/\/ Hata i\u015fleme middleware'i (en sona eklenmeli)\n    app.use((err, req, res, next) => {\n        console.error(err.stack);\n        res.status(500).send('Sunucu taraf\u0131nda bir hata olu\u015ftu!');\n    });\n\n    \/\/ Sunucuyu ba\u015flat\n    app.listen(port, () => {\n      console.log(<code>G\u00f6rev API'si http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor<\/code>);\n    });<\/code><\/pre>\n<p>3.  <strong>\u00c7al\u0131\u015ft\u0131rma ve Test Etme:<\/strong><br \/>\n    Terminalde <code>node app.js<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n.<br \/>\n    Postman, Insomnia gibi bir API test arac\u0131 veya <code>curl<\/code> komut sat\u0131r\u0131 arac\u0131 ile API&#8217;nizi test edebilirsiniz:<\/p>\n<p>    *   <strong>GET<\/strong> <code>http:\/\/localhost:3000\/tasks<\/code> -> T\u00fcm g\u00f6revleri getirir.<br \/>\n    *   <strong>GET<\/strong> <code>http:\/\/localhost:3000\/tasks\/1<\/code> -> ID&#8217;si 1 olan g\u00f6revi getirir.<br \/>\n    *   <strong>POST<\/strong> <code>http:\/\/localhost:3000\/tasks<\/code><br \/>\n        *   Body (raw, JSON): <code>{\"title\": \"Yeni bir g\u00f6rev\", \"completed\": false}<\/code><br \/>\n    *   <strong>PUT<\/strong> <code>http:\/\/localhost:3000\/tasks\/1<\/code><br \/>\n        *   Body (raw, JSON): <code>{\"completed\": true}<\/code><br \/>\n    *   <strong>DELETE<\/strong> <code>http:\/\/localhost:3000\/tasks\/2<\/code><\/p>\n<p>Bu \u00f6rnek, Express ile temel bir REST API&#8217;nin nas\u0131l olu\u015fturuldu\u011funu g\u00f6stermektedir. Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda veriler bir veritaban\u0131nda saklan\u0131r ve daha geli\u015fmi\u015f hata y\u00f6netimi, do\u011frulama ve kimlik do\u011frulama mekanizmalar\u0131 kullan\u0131l\u0131r.<\/p>\n<h3>Hata Y\u00f6netimi: Uygulaman\u0131z\u0131 Sa\u011flam Hale Getirin<\/h3>\n<p>Her uygulaman\u0131n hata y\u00f6netimine ihtiyac\u0131 vard\u0131r. Express&#8217;te hatalar\u0131 do\u011fru bir \u015fekilde y\u00f6netmek, uygulaman\u0131z\u0131n beklenmedik durumlarda \u00e7\u00f6kmesini \u00f6nler ve kullan\u0131c\u0131ya anlaml\u0131 geri bildirimler sunar.<\/p>\n<h4>Senkron ve Asenkron Hatalar<\/h4>\n<p>*   <strong>Senkron Hatalar:<\/strong> Rota i\u015fleyici veya middleware i\u00e7inde senkron olarak olu\u015fan hatalard\u0131r. Bunlar otomatik olarak Express&#8217;in hata i\u015fleme middleware&#8217;ine iletilir.<\/p>\n<pre><code class=\"language-javascript\">app.get('\/sync-error', (req, res, next) => {\n        throw new Error('Bu senkron bir hata!'); \/\/ Otomatik olarak hata middleware'ine gider\n    });<\/code><\/pre>\n<p>*   <strong>Asenkron Hatalar:<\/strong> Promise&#8217;lar veya callback&#8217;ler i\u00e7inde olu\u015fan asenkron hatalard\u0131r. Bunlar\u0131 Express&#8217;in hata i\u015fleme mekanizmas\u0131na iletmek i\u00e7in <code>next(err)<\/code> kullanman\u0131z gerekir.<\/p>\n<pre><code class=\"language-javascript\">app.get('\/async-error', async (req, res, next) => {\n        try {\n            \/\/ await bir Promise'\u0131 reddederse, catch blo\u011fu tetiklenir\n            await Promise.reject(new Error('Bu asenkron bir hata!'));\n        } catch (err) {\n            next(err); \/\/ Hata i\u015fleme middleware'ine ilet\n        }\n    });<\/code><\/pre>\n<h4>Hata \u0130\u015fleme Middleware&#8217;i<\/h4>\n<p>Daha \u00f6nce bahsetti\u011fimiz gibi, Express&#8217;te \u00f6zel bir hata i\u015fleme middleware&#8217;i, d\u00f6rt arg\u00fcman alan bir fonksiyondur: <code>(err, req, res, next)<\/code>. Bu, t\u00fcm di\u011fer <code>app.use()<\/code> ve rota tan\u0131mlar\u0131ndan sonra en sonda tan\u0131mlanmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ app.js dosyas\u0131n\u0131n en sonunda\napp.use((err, req, res, next) => {\n    console.error(err.stack); \/\/ Hatay\u0131 konsola yazd\u0131r (geli\u015ftirme ortam\u0131nda faydal\u0131)\n\n    \/\/ Hata tipine g\u00f6re farkl\u0131 yan\u0131tlar g\u00f6nderebilirsiniz\n    if (err.name === 'ValidationError') {\n        return res.status(400).json({ message: err.message, errors: err.errors });\n    }\n\n    res.status(err.status || 500).json({\n        message: err.message || 'Beklenmedik bir sunucu hatas\u0131 olu\u015ftu.',\n        \/\/ \u00dcretim ortam\u0131nda stack trace g\u00f6ndermeyin!\n        \/\/ error: process.env.NODE_ENV === 'development' ? err : {}\n    });\n});<\/code><\/pre>\n<p>Bu middleware, uygulaman\u0131zdaki herhangi bir yerden <code>next(new Error('Hata mesaj\u0131'))<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda tetiklenir.<\/p>\n<h3>Proje Yap\u0131s\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, kodunuzu d\u00fczenli ve y\u00f6netilebilir tutmak i\u00e7in iyi bir proje yap\u0131s\u0131 benimsemek \u00f6nemlidir.<\/p>\n<p>*   <strong>Mod\u00fcler Yap\u0131:<\/strong> Uygulaman\u0131z\u0131 mant\u0131ksal katmanlara ay\u0131r\u0131n.<br \/>\n    *   <code>controllers\/<\/code>: \u0130stekleri i\u015fleyen ve yan\u0131tlar\u0131 olu\u015fturan i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7erir.<br \/>\n    *   <code>routes\/<\/code>: Y\u00f6nlendirme tan\u0131mlar\u0131n\u0131 i\u00e7erir. <code>express.Router()<\/code> kullanarak mod\u00fcler rotalar olu\u015fturulur.<br \/>\n    *   <code>models\/<\/code>: Veritaban\u0131 \u015femalar\u0131n\u0131 ve veri etkile\u015fim mant\u0131\u011f\u0131n\u0131 i\u00e7erir (veritaban\u0131 kullan\u0131l\u0131yorsa).<br \/>\n    *   <code>services\/<\/code> veya <code>utils\/<\/code>: Ortak yard\u0131mc\u0131 fonksiyonlar\u0131 veya i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7erir.<br \/>\n    *   <code>middleware\/<\/code>: \u00d6zel middleware fonksiyonlar\u0131n\u0131 i\u00e7erir.<br \/>\n*   <strong>Ortam De\u011fi\u015fkenleri (<code>dotenv<\/code>):<\/strong> Veritaban\u0131 ba\u011flant\u0131 dizeleri, API anahtarlar\u0131 gibi hassas bilgileri do\u011frudan kodunuza yazmak yerine ortam de\u011fi\u015fkenlerinde saklay\u0131n. <code>dotenv<\/code> paketi, <code>.env<\/code> dosyas\u0131ndaki de\u011fi\u015fkenleri <code>process.env<\/code> nesnesine y\u00fcklemenizi sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">npm install dotenv<\/code><\/pre>\n<pre><code class=\"language-javascript\">\/\/ app.js'in en ba\u015f\u0131nda\n    require('dotenv').config();\n    const port = process.env.PORT || 3000;\n    \/\/ ...<\/code><\/pre>\n<p>*   <strong>G\u00fcvenlik Temelleri:<\/strong><br \/>\n    *   <strong><code>helmet<\/code>:<\/strong> \u00c7e\u015fitli HTTP ba\u015fl\u0131klar\u0131n\u0131 ayarlayarak uygulaman\u0131z\u0131n g\u00fcvenli\u011fini art\u0131r\u0131r. <code>npm install helmet<\/code>.<br \/>\n    *   <strong><code>cors<\/code>:<\/strong> \u00c7apraz kaynakl\u0131 istekleri (Cross-Origin Resource Sharing &#8211; CORS) y\u00f6netmenizi sa\u011flar. <code>npm install cors<\/code>.<br \/>\n    *   Giri\u015f do\u011frulama (input validation), rate limiting gibi konular\u0131 da g\u00f6z \u00f6n\u00fcnde bulundurun.<\/p>\n<h3>Sonraki Ad\u0131mlar: Node.js ve Express ile S\u0131n\u0131rlar\u0131 Zorlay\u0131n<\/h3>\n<p>Node.js ve Express ile temel bir uygulama olu\u015fturmay\u0131 \u00f6\u011frendiniz. Ancak bu, sadece ba\u015flang\u0131\u00e7! \u0130\u015fte bu g\u00fc\u00e7l\u00fc ikiliyle yapabilece\u011finiz ve \u00f6\u011frenmeniz gereken baz\u0131 ileri d\u00fczey konular:<\/p>\n<p>*   <strong>Veritaban\u0131 Entegrasyonu:<\/strong><br \/>\n    *   <strong>NoSQL:<\/strong> MongoDB (Mongoose ORM ile), Redis<br \/>\n    *   <strong>SQL:<\/strong> PostgreSQL, MySQL, SQLite (Sequelize veya Knex.js ORM\/Query Builder ile)<br \/>\n*   <strong>Kimlik Do\u011frulama ve Yetkilendirme:<\/strong><br \/>\n    *   <strong>JWT (JSON Web Tokens):<\/strong> Kimlik do\u011frulama i\u00e7in yayg\u0131n bir standart.<br \/>\n    *   <strong>OAuth:<\/strong> \u00dc\u00e7\u00fcnc\u00fc taraf hizmetlerle (Google, Facebook vb.) entegrasyon.<br \/>\n    *   <strong>Passport.js:<\/strong> Kimlik do\u011frulama middleware&#8217;i.<br \/>\n*   <strong>Test Yazma:<\/strong> Uygulamalar\u0131n\u0131z\u0131n g\u00fcvenilirli\u011fini sa\u011flamak i\u00e7in birim testleri (Mocha, Jest), entegrasyon testleri (Supertest) yazmay\u0131 \u00f6\u011frenin.<br \/>\n*   <strong>Deployment (Da\u011f\u0131t\u0131m):<\/strong> Uygulaman\u0131z\u0131 bir sunucuya (Heroku, Vercel, AWS, DigitalOcean vb.) nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 \u00f6\u011frenin. PM2 gibi s\u00fcre\u00e7 y\u00f6neticileri, uygulaman\u0131z\u0131n s\u00fcrekli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Ger\u00e7ek Zamanl\u0131 Uygulamalar:<\/strong> WebSockets (Socket.IO k\u00fct\u00fcphanesi ile) kullanarak anl\u0131k sohbet uygulamalar\u0131, bildirim sistemleri gibi ger\u00e7ek zamanl\u0131 \u00f6zellikler ekleyin.<br \/>\n*   <strong>GraphQL:<\/strong> REST API&#8217;lerine alternatif olarak GraphQL ile daha esnek ve verimli API&#8217;ler olu\u015fturmay\u0131 ke\u015ffedin.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Node.js ve Express, modern web geli\u015ftirmenin vazge\u00e7ilmez ara\u00e7lar\u0131d\u0131r. Node.js&#8217;in engellemeyen, olay odakl\u0131 mimarisi, Express&#8217;in minimal ve g\u00fc\u00e7l\u00fc web \u00e7at\u0131s\u0131 ile birle\u015fti\u011finde, y\u00fcksek performansl\u0131, \u00f6l\u00e7eklenebilir ve esnek web uygulamalar\u0131 ve API&#8217;ler olu\u015fturmak i\u00e7in m\u00fckemmel bir ortam sunar. Bu makalede, kurulumdan ba\u015flayarak temel kavramlar\u0131, middleware ve y\u00f6nlendirme mekanizmalar\u0131n\u0131, basit bir REST API \u00f6rne\u011fini ve hata y\u00f6netimini ele ald\u0131k.<\/p>\n<p>Unutmay\u0131n, yaz\u0131l\u0131m geli\u015ftirme s\u00fcrekli bir \u00f6\u011frenme s\u00fcrecidir. Bu rehber size sa\u011flam bir temel sunsa da, pratik yaparak, farkl\u0131 projeler deneyerek ve Node.js\/Express toplulu\u011funun sundu\u011fu kaynaklar\u0131 ke\u015ffederek becerilerinizi geli\u015ftirmeye devam etmelisiniz. \u015eimdi klavyenizin ba\u015f\u0131na ge\u00e7in, kodlamaya ba\u015flay\u0131n ve Node.js ile Express&#8217;in g\u00fcc\u00fcn\u00fc kendi projelerinizde deneyimleyin!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi\nGiri\u015f: Web Geli\u015ftirmenin Kalbinde Node.js ve Express\nG\u00fcn\u00fcm\u00fcz\u00fcn modern web uygulamalar\u0131,","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":[136],"tags":[],"class_list":{"0":"post-33087","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","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>Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi - 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\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi\" \/>\n<meta property=\"og:description\" content=\"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi Giri\u015f: Web Geli\u015ftirmenin Kalbinde Node.js ve Express G\u00fcn\u00fcm\u00fcz\u00fcn modern web uygulamalar\u0131,\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-29T07:41:20+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi\",\"datePublished\":\"2025-10-29T07:41:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/\"},\"wordCount\":2832,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/\",\"name\":\"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-29T07:41:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi\"}]},{\"@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":"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi - 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\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi","og_description":"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi Giri\u015f: Web Geli\u015ftirmenin Kalbinde Node.js ve Express G\u00fcn\u00fcm\u00fcz\u00fcn modern web uygulamalar\u0131,","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-29T07:41:20+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi","datePublished":"2025-10-29T07:41:20+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/"},"wordCount":2832,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/","name":"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-29T07:41:20+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-gelisime-baslangic-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js ve Express ile Geli\u015fime Ba\u015flang\u0131\u00e7 Rehberi"}]},{"@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\/33087","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=33087"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33087\/revisions"}],"predecessor-version":[{"id":33088,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33087\/revisions\/33088"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33087"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33087"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}