Node.js ile İlk Programınızı Yazma ve Çalıştırma Rehberi
Node.js, modern web geliştirme dünyasında sunucu tarafı uygulamalar, API’ler, komut satırı araçları ve hatta masaüstü uygulamaları oluşturmak için kullanılan güçlü ve popüler bir JavaScript çalışma zamanı ortamıdır. Google Chrome’un V8 JavaScript motoru üzerine inşa edilen Node.js, asenkron ve olay tabanlı mimarisi sayesinde yüksek performanslı, ölçeklenebilir ağ uygulamaları geliştirmeye olanak tanır. Bu kapsamlı rehberde, Node.js’in temellerini öğrenecek, kurulumunu gerçekleştirecek, ilk “Merhaba Dünya” programınızı yazacak ve çalıştıracak, ardından Node.js ekosisteminin önemli bileşenlerini keşfedeceksiniz.
Node.js Nedir ve Neden Önemlidir?
Node.js, JavaScript’i tarayıcı dışında çalıştırmanıza olanak tanıyan açık kaynaklı, çapraz platform bir çalışma zamanı ortamıdır. Geleneksel olarak JavaScript yalnızca web tarayıcılarında istemci tarafı etkileşimler için kullanılırken, Node.js bu sınırı ortadan kaldırarak geliştiricilere tam yığın (full-stack) JavaScript deneyimi sunar.
Node.js’in öne çıkan bazı özellikleri ve avantajları şunlardır:
* Tek Dil: Hem ön uç (frontend) hem de arka uç (backend) geliştirme için tek bir programlama dili (JavaScript) kullanılması, geliştirme sürecini basitleştirir ve ekipler arası geçişi kolaylaştırır.
* Asenkron ve Olay Odaklı: Node.js, I/O (giriş/çıkış) işlemleri için engellemeyen (non-blocking) bir model kullanır. Bu sayede, bir işlem tamamlanmadan diğerine geçebilir ve aynı anda binlerce bağlantıyı işleyebilir, bu da yüksek performans ve ölçeklenebilirlik sağlar.
* Hızlı Çalışma Zamanı: Google’ın V8 motoru sayesinde JavaScript kodu makine koduna derlenir ve bu da Node.js uygulamalarının son derece hızlı çalışmasına olanak tanır.
* Geniş Ekosistem (NPM): Node Package Manager (NPM), dünyanın en büyük açık kaynak kütüphane ekosistemlerinden biridir. Binlerce hazır paket sayesinde geliştiriciler, tekerleği yeniden icat etmek zorunda kalmadan hızlıca uygulama geliştirebilirler.
* Çapraz Platform: Windows, macOS ve Linux gibi farklı işletim sistemlerinde sorunsuz bir şekilde çalışır.
Bu avantajlar sayesinde Node.js, Netflix, LinkedIn, PayPal gibi büyük şirketler tarafından kullanılmakta ve modern uygulama geliştirmede vazgeçilmez bir araç haline gelmiştir.
Node.js Kurulumu
Node.js ile çalışmaya başlamadan önce, sisteminize Node.js ve NPM’i (Node Package Manager) kurmanız gerekmektedir. NPM, Node.js ile birlikte gelir ve Node.js paketlerini yönetmek için kullanılır.
İşletim Sistemine Göre Kurulum
Node.js’i kurmanın birkaç yolu vardır. En yaygın ve önerilen yöntemleri aşağıda bulabilirsiniz:
Windows
1. Resmi Kurulumcu (Installer): Node.js’in resmi web sitesi olan [nodejs.org](https://nodejs.org/) adresine gidin. “LTS” (Long Term Support) sürümünü indirmeniz önerilir, çünkü bu sürüm daha kararlıdır ve uzun süreli destek alır. İndirilen .msi dosyasını çalıştırın ve kurulum adımlarını takip edin. Çoğu durumda varsayılan seçeneklerle ilerlemek yeterlidir.
2. Chocolatey (Paket Yöneticisi): Eğer Windows için bir paket yöneticisi kullanıyorsanız (örneğin Chocolatey), kurulumu daha kolay hale getirebilirsiniz. Bir yönetici olarak açtığınız PowerShell veya Komut İstemi’nde aşağıdaki komutu çalıştırın:
choco install nodejs-lts
macOS
1. Resmi Kurulumcu (Installer): Windows’a benzer şekilde, [nodejs.org](https://nodejs.org/) adresinden .pkg uzantılı LTS sürümünü indirip kurabilirsiniz.
2. Homebrew (Paket Yöneticisi): macOS kullanıcıları için Homebrew popüler bir paket yöneticisidir. Eğer Homebrew yüklü değilse, terminalinizde şu komutu çalıştırarak kurabilirsiniz:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Homebrew yüklendikten sonra Node.js’i kurmak için:
brew install node
Linux (Ubuntu/Debian)
1. Resmi Depodan Kurulum: Node.js’in resmi depolarını ekleyerek en güncel LTS sürümünü kurmak en iyi yoldur:
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
sudo apt update
sudo apt install nodejs -y
(Yukarıdaki örnekte node_20.x yerine güncel LTS sürümünü kullanabilirsiniz.)
2. NVM (Node Version Manager): NVM, birden fazla Node.js sürümünü aynı anda yönetmenizi sağlayan harika bir araçtır. Özellikle farklı projeler farklı Node.js sürümleri gerektirdiğinde çok kullanışlıdır.
* NVM’yi kurmak için terminalinizde aşağıdaki komutu çalıştırın:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
(Sürüm numarasını kontrol etmek için NVM GitHub sayfasını ziyaret edebilirsiniz.)
* Kurulumdan sonra terminalinizi kapatıp yeniden açın veya .bashrc, .zshrc dosyanızı kaynaklayın (source ~/.bashrc).
* NVM ile Node.js’in en son LTS sürümünü kurmak için:
nvm install --lts
nvm use --lts
* Belirli bir sürümü kurmak için:
nvm install 18
nvm use 18
Kurulumu Doğrulama
Node.js ve NPM’in başarıyla kurulduğunu doğrulamak için terminalinizde aşağıdaki komutları çalıştırın:
node -v
npm -v
Bu komutlar, kurulu Node.js ve NPM sürümlerini göstermelidir (örneğin, v20.11.0 ve 10.2.4). Eğer sürüm numaralarını görüyorsanız, her şey yolunda demektir!
İlk Node.js Programınızı Yazmaya Hazırlık
Artık Node.js kurulu olduğuna göre, ilk programınızı yazmaya başlayabiliriz.
Çalışma Dizini Oluşturma
Programlarınız için düzenli bir yapıya sahip olmak iyi bir alışkanlıktır. Masaüstünüzde veya belgelerinizde “nodejs-projelerim” gibi bir klasör oluşturun. İlk programımız için bu klasörün içinde “ilk-program” adında yeni bir klasör oluşturalım.
mkdir nodejs-projelerim
cd nodejs-projelerim
mkdir ilk-program
cd ilk-program
Metin Düzenleyici Seçimi
Kod yazmak için bir metin düzenleyiciye ihtiyacınız olacak. Piyasada birçok seçenek olsa da, Node.js geliştiricileri arasında en popüler olanlardan biri Visual Studio Code (VS Code)‘dur. Ücretsizdir, hafif ve Node.js geliştirmeyi kolaylaştıran birçok uzantıya sahiptir. Eğer yüklü değilse, [code.visualstudio.com](https://code.visualstudio.com/) adresinden indirip kurmanızı şiddetle tavsiye ederiz.
“Merhaba, Dünya!” Programı
Her programlama dilinde olduğu gibi, Node.js’e de “Merhaba, Dünya!” programı ile giriş yapalım.
Kodunuzu Yazma
1. ilk-program klasöründe app.js adında yeni bir dosya oluşturun.
2. VS Code’u açın ve bu dosyayı düzenlemeye başlayın. İçine aşağıdaki kodu yazın:
// app.js
console.log("Merhaba, Dünya! Node.js'e Hoş Geldiniz!");
Bu kod oldukça basittir: console.log() fonksiyonu, parantez içindeki metni terminale (konsola) yazdırır.
Programı Çalıştırma
1. Terminalinizi açın ve ilk-program klasörüne gidin:
cd nodejs-projelerim/ilk-program
2. Programınızı çalıştırmak için node komutunu ve dosya adını kullanın:
node app.js
Eğer her şeyi doğru yaptıysanız, terminalinizde aşağıdaki çıktıyı görmelisiniz:
Merhaba, Dünya! Node.js'e Hoş Geldiniz!
Tebrikler! İlk Node.js programınızı başarıyla yazdınız ve çalıştırdınız. Bu basit adım, Node.js ile yapabileceğiniz her şeyin başlangıcıdır.
Node.js’in Temel Modülleri ve Özellikleri
Node.js, uygulamanızı geliştirmek için kullanabileceğiniz güçlü yerleşik modüller ve özelliklerle birlikte gelir.
Global Nesneler
Node.js’te, tarayıcıdaki window nesnesine benzer şekilde çalışan global adında bir global nesne bulunur. Ancak, tarayıcıdan farklı olarak, Node.js’te global kapsamda tanımlanan değişkenler otomatik olarak global nesnesine eklenmez. Yine de bazı global nesneler her zaman erişilebilirdir:
* process: Mevcut Node.js sürecini (process) kontrol etmek ve bilgiler almak için kullanılır. Örneğin, process.argv komut satırı argümanlarına, process.env ortam değişkenlerine erişim sağlar.
* __dirname: Mevcut modülün (dosyanın) bulunduğu dizinin tam yolunu döndürür.
* __filename: Mevcut modülün (dosyanın) tam dosya yolunu döndürür.
* setTimeout(), setInterval(): Tarayıcıdaki karşılıklarına benzer şekilde zamanlayıcı fonksiyonlarıdır.
Örnek kullanım:
console.log('Bu dosyanın dizini:', __dirname);
console.log('Bu dosyanın tam yolu:', __filename);
console.log('Node.js sürümü:', process.version);
Modül Sistemi: require() ve module.exports
Node.js’in en temel ve güçlü özelliklerinden biri modül sistemidir. Bu sistem, kodunuzu küçük, yönetilebilir ve yeniden kullanılabilir parçalara (modüllere) ayırmanıza olanak tanır. Her JavaScript dosyası Node.js’te bir modül olarak kabul edilir.
* module.exports: Bir modülden dışarıya açmak (export etmek) istediğiniz verileri, fonksiyonları veya nesneleri tanımlamak için kullanılır.
* require(): Başka bir modül tarafından dışarıya açılmış (export edilmiş) içeriği mevcut modülünüze dahil etmek (import etmek) için kullanılır.
Örnek Modül Oluşturma:
utils.js adında bir dosya oluşturalım:
// utils.js
function toUpperCase(text) {
return text.toUpperCase();
}
const PI = 3.14159;
module.exports = {
toUpperCaseFunction: toUpperCase,
PI_VALUE: PI
};
Burada toUpperCase fonksiyonunu ve PI sabitini dışarıya açıyoruz.
Modülü Kullanma:
app.js dosyanızda bu modülü kullanmak için:
// app.js
const myUtils = require('./utils'); // './' mevcut dizindeki bir dosyayı belirtir
console.log(myUtils.toUpperCaseFunction("merhaba nodejs")); // MERHABA NODEJS
console.log("Pi değeri:", myUtils.PI_VALUE); // Pi değeri: 3.14159
Bu modül sistemi, kodunuzu düzenli tutmanıza ve karmaşıklığı azaltmanıza yardımcı olur.
Asenkron Programlama
Node.js’in temelinde asenkron (eşzamansız) programlama yatar. Bu, bir işlemin (örneğin, bir veritabanı sorgusu veya dosya okuma) tamamlanmasını beklerken uygulamanızın diğer işlemleri yapmaya devam edebilmesi anlamına gelir. Bu, özellikle I/O yoğun uygulamalarda performansı artırır.
Node.js’te asenkron işlemleri yönetmek için başlıca üç yöntem vardır:
Callbacks (Geri Çağırmalar)
Bir fonksiyonun tamamlanmasından sonra çağrılacak başka bir fonksiyonu parametre olarak geçmektir. Node.js’in ilk zamanlarında yaygın olarak kullanılırdı.
const fs = require('fs'); // Dosya sistemi modülü
fs.readFile('ornek.txt', 'utf8', (err, data) => {
if (err) {
console.error('Dosya okuma hatası:', err);
return;
}
console.log('Dosya içeriği:', data);
});
console.log('Dosya okuma işlemi başlatıldı, ben beklemeyeceğim!');
ornek.txt dosyası yoksa veya okunamıyorsa err nesnesi hata bilgisini içerir. Aksi takdirde, data dosyanın içeriğini tutar. Callback’lerin dezavantajı, çok fazla iç içe callback olduğunda “callback cehennemi” (callback hell) denilen okunaksız kod yapısına yol açabilmesidir.
Promises (Sözler)
Callback cehennemini çözmek ve asenkron kodları daha okunaklı hale getirmek için Promises ortaya çıktı. Bir Promise, asenkron bir işlemin gelecekteki bir sonucunu (başarı veya hata) temsil eden bir nesnedir.
const fs = require('fs/promises'); // fs modülünün Promise tabanlı versiyonu
async function readMyFile() {
try {
const data = await fs.readFile('ornek.txt', 'utf8');
console.log('Dosya içeriği (Promise):', data);
} catch (err) {
console.error('Dosya okuma hatası (Promise):', err);
}
}
readMyFile();
console.log('Dosya okuma işlemi başlatıldı (Promise), ben beklemeyeceğim!');
Yukarıdaki örnekte fs/promises modülü, readFile fonksiyonunun Promise tabanlı bir versiyonunu sunar.
Async/Await
Promises’ların üzerine inşa edilen async/await, asenkron kodları senkron kod gibi yazmayı sağlayan daha modern ve okunabilir bir yaklaşımdır. Bir fonksiyonu async olarak işaretlemek, içinde await anahtar kelimesini kullanmanıza olanak tanır. await, bir Promise’ın çözülmesini (tamamlanmasını) bekler ve sonucunu döndürür.
const fs = require('fs/promises');
async function readMyFileAsyncAwait() {
try {
const data = await fs.readFile('ornek.txt', 'utf8');
console.log('Dosya içeriği (Async/Await):', data);
} catch (err) {
console.error('Dosya okuma hatası (Async/Await):', err);
}
}
readMyFileAsyncAwait();
console.log('Dosya okuma işlemi başlatıldı (Async/Await), ben beklemeyeceğim!');
async/await modern Node.js uygulamalarında asenkron kod yazmak için tercih edilen yöntemdir.
NPM (Node Package Manager) Kullanımı
NPM, Node.js ekosisteminin kalbidir. Binlerce açık kaynak paketi (kütüphaneyi) indirmenizi, yönetmenizi ve kendi projelerinizde kullanmanızı sağlar.
package.json Oluşturma: npm init
Her Node.js projesi, projenin meta verilerini (adı, sürümü, açıklaması, ana betikler, bağımlılıklar vb.) içeren bir package.json dosyasına sahip olmalıdır. Bu dosyayı oluşturmak için projenizin kök dizininde aşağıdaki komutu çalıştırın:
npm init
Bu komut size projenizle ilgili bazı sorular soracaktır (proje adı, sürümü, açıklaması, giriş noktası vb.). Varsayılan değerleri kabul etmek için Enter tuşuna basmaya devam edebilirsiniz. İşlem bittiğinde, package.json adında bir dosya oluştuğunu göreceksiniz.
// package.json örneği
{
"name": "ilk-node-projem",
"version": "1.0.0",
"description": "Node.js ile ilk projem",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Bağımlılık Yükleme: npm install
Bir projede dış bir paketi kullanmak istediğinizde, NPM’i kullanarak onu projenize eklemeniz gerekir. Örneğin, HTTP istekleri yapmak için popüler axios kütüphanesini kuralım:
npm install axios
Bu komut, axios paketini indirir ve projenizin node_modules klasörüne yerleştirir. Ayrıca, package.json dosyanızdaki dependencies bölümüne axios bağımlılığını ekler.
// package.json (npm install axios sonrası)
{
"name": "ilk-node-projem",
"version": "1.0.0",
"description": "Node.js ile ilk projem",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^1.6.7" // axios buraya eklendi
}
}
devDependencies ve dependencies:
* dependencies: Uygulamanızın üretim ortamında çalışması için gerekli olan paketlerdir (örneğin, axios, express). Bunları npm install ile eklersiniz.
* devDependencies: Yalnızca geliştirme aşamasında ihtiyaç duyulan paketlerdir (örneğin, test kütüphaneleri, kod biçimlendiriciler). Bunları npm install --save-dev veya npm install -D ile eklersiniz.
Yüklü Bağımlılıkları Kullanma
axios paketini app.js dosyanızda kullanabilirsiniz:
// app.js
const axios = require('axios');
async function fetchData() {
try {
const response = await axios.get('https://jsonplaceholder.typicode.com/todos/1');
console.log('API\'den gelen veri:', response.data);
} catch (error) {
console.error('API isteği hatası:', error.message);
}
}
fetchData();
Bu kodu çalıştırdığınızda (node app.js), uzak bir API’den veri çekecek ve terminale yazdıracaktır.
Tüm Bağımlılıkları Yükleme: npm install
Bir projeyi GitHub’dan veya başka bir yerden klonladığınızda, node_modules klasörü genellikle dahil edilmez. Sadece package.json dosyası bulunur. Bu durumda, projenin tüm bağımlılıklarını yüklemek için projenin kök dizininde aşağıdaki komutu çalıştırmanız yeterlidir:
npm install
Bu komut, package.json dosyasındaki dependencies ve devDependencies bölümlerinde listelenen tüm paketleri indirip kuracaktır.
Betikleri Çalıştırma: npm run
package.json dosyasındaki scripts bölümü, sıkça kullanılan komutları veya karmaşık betikleri kısayollarla çalıştırmanıza olanak tanır. Örneğin, uygulamanızı başlatmak için bir betik tanımlayabiliriz:
// package.json
{
"name": "ilk-node-projem",
// ... diğer alanlar
"main": "app.js",
"scripts": {
"start": "node app.js",
"dev": "node --watch app.js", // Node.js 18+ ile dosya değişikliklerini izler
"test": "echo \"Error: no test specified\" && exit 1"
},
// ... diğer alanlar
}
Şimdi app.js dosyanızı çalıştırmak için node app.js yerine npm run start veya kısaca npm start (eğer betik adı “start” ise) kullanabilirsiniz. Geliştirme için npm run dev komutu, dosya değişikliklerinde uygulamanızı otomatik olarak yeniden başlatacaktır (Node.js 18 ve üzeri için).
Basit Bir Web Sunucusu Oluşturma (http modülü)
Node.js’in en yaygın kullanım alanlarından biri web sunucuları oluşturmaktır. Node.js, yerleşik http modülü sayesinde bunu kolayca yapmanıza olanak tanır.
server.js adında yeni bir dosya oluşturalım:
// server.js
const http = require('http'); // Node.js'in yerleşik http modülünü dahil et
const hostname = '127.0.0.1'; // Sunucunun dinleyeceği IP adresi (localhost)
const port = 3000; // Sunucunun dinleyeceği port numarası
// Bir HTTP sunucusu oluştur
const server = http.createServer((req, res) => {
// Gelen her istek için bu fonksiyon çalışır
// HTTP yanıt başlığını ayarla
// 200 OK durum kodu ve Content-Type olarak düz metin (text/plain)
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain; charset=utf-8'); // Türkçe karakterler için charset ekledik
// Yanıt gövdesini gönder ve bağlantıyı kapat
res.end('Merhaba Dünya! Node.js Sunucusu Çalışıyor!\n');
});
// Sunucuyu belirtilen IP ve port üzerinde dinlemeye başla
server.listen(port, hostname, () => {
console.log(Sunucu http://${hostname}:${port}/ adresinde çalışıyor.);
console.log('Tarayıcınızda bu adresi ziyaret edebilirsiniz.');
});
Bu kodu çalıştırdığınızda (node server.js):
1. Terminalinizde Sunucu http://127.0.0.1:3000/ adresinde çalışıyor. mesajını göreceksiniz.
2. Web tarayıcınızı açın ve adres çubuğuna http://127.0.0.1:3000/ yazıp Enter tuşuna basın.
3. Tarayıcınızda “Merhaba Dünya! Node.js Sunucusu Çalışıyor!” mesajını görmelisiniz.
Bu, Node.js ile oluşturulmuş en basit web sunucusudur. http.createServer() metodu, her gelen HTTP isteği için bir fonksiyonu çağırır. Bu fonksiyonda, req (request – istek) ve res (response – yanıt) nesnelerini kullanarak gelen isteği işleyebilir ve bir yanıt gönderebilirsiniz.
Gelişmiş Konulara Kısa Bir Bakış
Node.js ile ilk adımlarınızı attınız. Ancak Node.js ekosistemi çok daha fazlasını sunar. İşte ileride keşfedebileceğiniz bazı önemli konular:
* Express.js: Node.js için en popüler ve esnek web uygulama çerçevesidir. Routing (yönlendirme), middleware (ara katman yazılımları) ve daha fazlasını kolayca yönetmenizi sağlar. Çoğu Node.js tabanlı web projesi Express.js kullanır.
* Veritabanı Bağlantıları: Node.js, MongoDB (Mongoose ile), PostgreSQL (Sequelize veya Knex.js ile), MySQL ve diğer birçok veritabanı ile etkileşim kurmak için güçlü kütüphanelere sahiptir.
* Ortam Değişkenleri (dotenv): Hassas bilgileri (veritabanı şifreleri, API anahtarları) doğrudan kodda tutmak yerine ortam değişkenleri olarak yönetmek en iyi uygulamadır. dotenv paketi, .env dosyasındaki değişkenleri uygulamanıza yüklemenizi sağlar.
* Hata Yönetimi: Uygulamalarınızda sağlam hata yönetimi stratejileri oluşturmak, beklenmedik durumları ele almak ve uygulamanızın çökmesini önlemek için kritik öneme sahiptir.
* Test Yazma (Jest, Mocha): Uygulamalarınızın doğru çalıştığından emin olmak için birim testleri ve entegrasyon testleri yazmak önemlidir. Jest ve Mocha gibi popüler test çerçeveleri Node.js için yaygın olarak kullanılır.
* Deployment (Dağıtım): Uygulamanızı geliştirmenin yanı sıra, onu canlı bir sunucuda nasıl çalıştıracağınızı (örneğin Heroku, AWS, DigitalOcean) öğrenmeniz gerekecektir.
Sonuç
Bu rehberde, Node.js’in ne olduğunu, neden önemli olduğunu, nasıl kurulacağını ve ilk programınızı nasıl yazıp çalıştıracağınızı öğrendiniz. Ayrıca Node.js’in temel modül sistemi, asenkron programlama yaklaşımları ve NPM’in gücünü keşfettiniz. Basit bir web sunucusu oluşturarak Node.js’in web geliştirme yeteneklerine de ilk bakışınızı attınız.
Node.js, geniş yetenekleri ve aktif topluluğu sayesinde modern web geliştiricileri için vazgeçilmez bir araçtır. Bu ilk adımlar, Node.js ile daha karmaşık ve güçlü uygulamalar geliştirmek için sağlam bir temel oluşturmaktadır. Öğrenmeye devam edin, pratik yapın ve Node.js’in sunduğu sınırsız olanakları keşfetmekten çekinmeyin! Yolculuğunuz şimdi başlıyor.
