Node.js Nasıl Yapılır?

Node.js Nasıl Yapılır?
Node.js Nasıl Yapılır?

Node.js Nedir ve Neden Kullanılır?

Modern web geliştirme ekosisteminde, sunucu tarafı (backend) uygulamaları inşa etmek için en çok tercih edilen teknolojilerin başında Node.js gelmektedir. Node.js, Google Chrome'un yüksek performanslı V8 JavaScript motoru üzerine inşa edilmiş, olay güdümlü (event-driven) ve asenkron (asynchronous) bir çalışma ortamıdır. Bu rehberde, sıfırdan başlayarak profesyonel düzeyde bir projenin nasıl ayağa kaldırılacağını ve Node.js nasıl yapılır sorusunun tüm teknik detaylarını adım adım inceleyeceğiz.

Geleneksel sunucu teknolojileri her yeni istek için yeni bir iş parçacığı (thread) oluştururken, Node.js tek bir iş parçacığı üzerinde bloke olmayan (non-blocking) I/O modeliyle çalışır. Bu mimari yapı, özellikle gerçek zamanlı (real-time) sohbet uygulamaları, mikro servisler, veri akışı (streaming) platformları ve yoğun trafik altındaki REST API'ler için Node.js'i benzersiz bir seçenek haline getirmektedir. Bu eğitim, temel JavaScript bilgisine sahip olan ve sunucu tarafında güvenli, hızlı ve ölçeklenebilir uygulamalar geliştirmek isteyen yazılımcılar için hazırlanmıştır.

Bu makale boyunca, Node.js geliştirme ortamının kurulmasından başlayarak, yerleşik (native) modüllerle çalışmayı, Express.js çerçevesi (framework) ile modern bir REST API tasarlamayı, asenkron dosya işlemlerini yönetmeyi ve endüstri standardı güvenlik önlemlerini uygulamayı öğreneceksiniz. Her adımda yazacağımız kodlar, 2026 yılı standartlarına uygun, modern ES Modülleri (ESM) yapısında ve temiz kod (clean code) prensiplerine sadık kalınarak hazırlanmıştır.

Node.js Geliştirme Ortamı İçin Ön Hazırlık ve Kurulum

Node.js ile kod geliştirmeye başlamadan önce, yerel bilgisayarımızda kararlı ve güncel bir çalışma ortamı hazırlamamız gerekmektedir. Projelerimizde modern JavaScript özelliklerini sorunsuz kullanabilmek için Node.js'in LTS (Uzun Süreli Destek) sürümünü tercih etmeliyiz. Kurulum adımlarını sırasıyla uygulayarak ilk projemizin temelini atalım.

Adım 1: Node.js ve NPM Kurulumu

Node.js resmi web sitesinden işletim sisteminize uygun olan güncel LTS sürümünü indirin ve kurun. Kurulum sihirbazı, paket yönetimi işlemlerimizi gerçekleştireceğimiz NPM (Node Package Manager) aracını da otomatik olarak bilgisayarınıza yükleyecektir. Kurulumun başarıyla tamamlandığını doğrulamak için terminal veya komut satırını açarak aşağıdaki komutları çalıştırın:

node --version
npm --version

Bu komutlar terminal ekranında kurulu olan Node.js ve NPM sürümlerini gösterecektir. Eğer sürüm numaralarını görüyorsanız, kurulum başarıyla tamamlanmış demektir.

Adım 2: Proje Klasörünün Oluşturulması ve Yapılandırılması

Projelerimizi düzenli tutmak adına yeni bir çalışma dizini oluşturalım ve bu dizin içerisinde terminalimizi açalım. Ardından, projenin bağımlılıklarını ve meta verilerini yöneteceğimiz package.json dosyasını oluşturmak için NPM başlatma komutunu çalıştıralım:

mkdir nodejs-egitim-projesi
cd nodejs-egitim-projesi
npm init -y

Oluşan package.json dosyası projemizin kimlik kartıdır. Modern JavaScript import/export (ESM) sözdizimini kullanabilmek için bu dosyaya "type": "module" özelliğini eklememiz gerekir. Düzenlenmiş package.json dosyanızın içeriği şu şekilde olmalıdır:

{
  "name": "nodejs-egitim-projesi",
  "version": "1.0.0",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {}
}

Önemli Güvenlik Uyarısı: Projenizin kök dizininde (root) hassas bilgileri (veritabanı şifreleri, API anahtarları vb.) barındıracak olan .env dosyalarını asla Git gibi versiyon kontrol sistemlerine göndermeyin. Bunun için projenize hemen bir .gitignore dosyası ekleyin ve içerisine node_modules ve .env satırlarını yazın.

Node.js ile İlk Sunucu Nasıl Yapılır? (Yerleşik HTTP Modülü)

Node.js, harici hiçbir kütüphaneye ihtiyaç duymadan kendi içerisinde güçlü bir HTTP sunucusu oluşturmanıza imkan tanır. Bu işlem için Node.js'in yerleşik node:http modülünü kullanırız. Yerleşik modülleri çağırırken node: ön ekini kullanmak, 2026 standartlarında çakışmaları önlemek ve performansı artırmak için önerilen modern bir yaklaşımdır.

Aşağıdaki kod örneğinde, istemciden (tarayıcı veya API test araçları) gelen istekleri dinleyen, gelen isteğin URL yolunu kontrol eden ve uygun HTTP durum kodları (status codes) ile yanıt dönen basit bir sunucu oluşturuyoruz.

import http from 'node:http';

const PORT = 3000;
const HOST = '127.0.0.1';

const server = http.createServer((req, res) => {
  // Gelen isteğin URL ve HTTP metodunu alıyoruz
  const { url, method } = req;

  // Yanıt başlığını (header) UTF-8 karakter desteği ve JSON formatı için ayarlıyoruz
  res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });

  if (url === '/' && method === 'GET') {
    res.end(JSON.stringify({ mesaj: 'Node.js Sunucusuna Hoş Geldiniz!' }));
  } else if (url === '/hakkimizda' && method === 'GET') {
    res.end(JSON.stringify({ bilgi: 'Bu sunucu yerleşik node:http modülü ile oluşturulmuştur.' }));
  } else {
    res.writeHead(404, { 'Content-Type': 'application/json; charset=utf-8' });
    res.end(JSON.stringify({ hata: 'Aradığınız sayfa bulunamadı.' }));
  }
});

server.listen(PORT, HOST, () => {
  console.log(`Sunucu http://${HOST}:${PORT} adresinde aktif olarak çalışıyor.`);
});

Yazdığımız bu kodu çalıştırmak için terminale node index.js veya npm start komutunu yazın. Tarayıcınızdan http://localhost:3000 adresine gittiğinizde JSON formatındaki selamlama mesajını göreceksiniz. Olmayan bir adrese (örneğin /iletisim) gittiğinizde ise sunucumuzun doğru bir şekilde 404 hata kodu ve hata mesajı döndüğünü test edebilirsiniz.

Express.js ile REST API Projesi Nasıl Yapılır?

Yerleşik HTTP modülü küçük işler için harika olsa da, büyük ve karmaşık projelerde yönlendirme (routing), ara yazılımlar (middleware) ve istek gövdesi (request body) analizi gibi işlemleri yönetmek zorlaşır. Bu noktada devreye Node.js ekosisteminin en popüler web çatısı olan Express.js girmektedir.

Express.js kullanarak temiz, okunabilir ve genişletilebilir bir REST API oluşturmak için öncelikle terminal aracılığıyla ilgili paketi projemize dahil etmeliyiz. Ardından, istemcilerden gelen JSON verilerini işleyebilen bir yapı kuracağız.

npm install express

Paket kurulumu tamamlandıktan sonra, projemizde app.js adında yeni bir dosya oluşturalım. Bu dosyada Express.js uygulamasını başlatacak, JSON verilerini ayrıştırmak için gerekli ara yazılımları tanımlayacak ve GET ile POST isteklerini işleyecek rotaları (routes) kurgulayacağız.

import express from 'express';

const app = express();
const PORT = 3000;

// Gelen POST/PUT isteklerindeki JSON gövdelerini okuyabilmek için yerleşik ara yazılımı aktif ediyoruz
app.use(express.json());

// Geçici bir veri deposu (Mock Database) oluşturuyoruz
const urunler = [
  { id: 1, ad: 'Kablosuz Klavye', fiyat: 1250 },
  { id: 2, ad: 'Oyuncu Faresi', fiyat: 850 }
];

// Tüm ürünleri listeleyen GET rotası
app.get('/api/urunler', (req, res) => {
  res.status(200).json({
    basari: true,
    data: urunler
  });
});

// Yeni ürün ekleyen POST rotası
app.post('/api/urunler', (req, res) => {
  const { ad, fiyat } = req.body;

  // Basit veri doğrulama (Validation)
  if (!ad || !fiyat) {
    return res.status(400).json({
      basari: false,
      hata: 'Lütfen ürün adı (ad) ve fiyatı (fiyat) alanlarını doldurun.'
    });
  }

  const yeniUrun = {
    id: urunler.length + 1,
    ad,
    fiyat: Number(fiyat)
  };

  urunler.push(yeniUrun);

  res.status(201).json({
    basari: true,
    mesaj: 'Ürün başarıyla eklendi.',
    data: yeniUrun
  });
});

app.listen(PORT, () => {
  console.log(`Express API sunucusu http://localhost:${PORT} üzerinde çalışıyor.`);
});

Bu uygulamayı test etmek için terminalde node app.js komutunu çalıştırın. Postman, Thunder Client veya cURL kullanarak http://localhost:3000/api/urunler adresine bir GET isteği gönderdiğinizde mevcut ürün listesini alırsınız. Aynı adrese JSON gövdesiyle (örneğin {"ad": "Monitör", "fiyat": 4500}) bir POST isteği gönderdiğinizde ise yeni ürünün listeye eklendiğini görebilirsiniz.

Node.js Asenkron Programlama ve Dosya İşlemleri Nasıl Yapılır?

Node.js'in en güçlü yönlerinden biri, dosya sistemi (File System) işlemlerini asenkron olarak, ana iş parçacığını bloke etmeden gerçekleştirebilmesidir. Eski Node.js projelerinde kullanılan callback fonksiyonları yerine, günümüzde node:fs/promises modülü ve async/await yapısı standart hale gelmiştir.

Bu bölümde, sunucumuzda asenkron olarak bir JSON dosyasına veri yazma ve bu dosyadan veri okuma işlemlerini gerçekleştiren güvenli bir mekanizma kuracağız. Bu yöntem, veritabanı bağlantısı olmayan küçük projelerde veri saklamak için de sıklıkla tercih edilir.

import fs from 'node:fs/promises';
import path from 'node:path';

const dosyaYolu = path.resolve('veri.json');

// Dosyaya asenkron veri yazma fonksiyonu
async function veriKaydet(veri) {
  try {
    const jsonString = JSON.stringify(veri, null, 2);
    // Dosyayı UTF-8 formatında yazar, yoksa oluşturur
    await fs.writeFile(dosyaYolu, jsonString, 'utf-8');
    console.log('Veriler başarıyla dosyaya yazıldı.');
  } catch (hata) {
    console.error('Dosya yazma hatası:', hata.message);
    throw hata;
  }
}

// Dosyadan asenkron veri okuma fonksiyonu
async function veriOku() {
  try {
    // Önce dosyanın var olup olmadığını kontrol ediyoruz
    await fs.access(dosyaYolu);
    const dosyaIcerigi = await fs.readFile(dosyaYolu, 'utf-8');
    return JSON.parse(dosyaIcerigi);
  } catch (hata) {
    // Dosya yoksa boş bir dizi döndürüyoruz
    if (hata.code === 'ENOENT') {
      console.log('Dosya bulunamadı, yeni bir veri yapısı başlatılıyor.');
      return [];
    }
    console.error('Dosya okuma hatası:', hata.message);
    throw hata;
  }
}

// İşlemleri sırayla test ediyoruz
async function calistir() {
  const testVerisi = [
    { id: 101, kullanıcı: 'Ahmet', rol: 'Yönetici' },
    { id: 102, kullanıcı: 'Ayşe', rol: 'Editör' }
  ];

  await veriKaydet(testVerisi);
  const okunanVeri = await veriOku();
  console.log('Dosyadan Okunan Güncel Veri:', okunanVeri);
}

calistir();

Yukarıdaki kod bloğu çalıştırıldığında, projenizin kök dizininde otomatik olarak veri.json adında bir dosya oluşturulacak ve içerisine asenkron olarak veriler yazılacaktır. Hemen ardından bu dosya okunarak terminal ekranına yazdırılacaktır. try-catch blokları sayesinde süreç esnasında oluşabilecek tüm sistem hataları güvenli bir şekilde yakalanır ve uygulamanın çökmesi engellenir.

Node.js Güvenlik ve Veri Doğrulama Adımları Nasıl Yapılır?

Üretim (production) ortamına alınacak bir Node.js uygulamasında güvenlik en kritik unsurdur. İstemciden gelen her veri potansiyel bir tehdit olarak kabul edilmeli ve işlenmeden önce mutlaka doğrulanmalıdır. Ayrıca, kullanıcı şifreleri asla veritabanında açık metin (plain text) olarak saklanmamalı, güçlü bir algoritma ile hash'lenmelidir.

Bu adımda, şifre hash'leme işlemleri için endüstri standardı olan bcrypt kütüphanesini kullanacağız. Öncelikle gerekli paketi yükleyelim:

npm install bcrypt

Aşağıdaki kod örneğinde, yeni bir kullanıcının kayıt olma (register) sürecini simüle ediyoruz. Gelen e-posta adresinin geçerliliğini kontrol ediyor, şifreyi güvenli bir şekilde hash'liyor ve olası güvenlik açıklarına karşı veriyi nasıl filtreleyeceğimizi gösteriyoruz.

import bcrypt from 'bcrypt';

// Şifreleme zorluk derecesi (Salt Rounds)
const SALT_ROUNDS = 12;

// E-posta formatı doğrulama fonksiyonu (Regex)
function epostaGecerliMi(eposta) {
  const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return regex.test(eposta);
}

// Güvenli kullanıcı oluşturma fonksiyonu
async function kullaniciKayit(eposta, acikSifre) {
  try {
    // 1. Veri Doğrulama (Validation)
    if (!eposta || !acikSifre) {
      throw new Error('E-posta ve şifre alanları zorunludur.');
    }

    if (!epostaGecerliMi(eposta)) {
      throw new Error('Geçersiz e-posta formatı.');
    }

    if (acikSifre.length < 8) {
      throw new Error('Şifre en az 8 karakter uzunluğunda olmalıdır.');
    }

    // 2. Şifreyi Güvenli Bir Şekilde Hash'leme (Bcrypt)
    // Salt oluşturma ve hash'leme işlemini tek adımda yapıyoruz
    const hashlenmisSifre = await bcrypt.hash(acikSifre, SALT_ROUNDS);

    // 3. Güvenli veri objesini hazırlıyoruz (Açık şifreyi siliyoruz)
    const yeniKullanici = {
      id: Date.now(),
      eposta: eposta.toLowerCase().trim(),
      sifre: hashlenmisSifre,
      olusturulmaTarihi: new Date()
    };

    console.log('Kullanıcı başarıyla kaydedildi.');
    return yeniKullanici;

  } catch (


Node.js Uygulamalarında Gelişmiş Hata Yönetimi ve Loglama

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kişisel gelişim ve zaman yönetimi odaklı pratik teknikler üzerine çalışıyorum. Günlük rutinleri iyileştiren, zaman kazandıran yöntemleri bilimsel temellere dayandırarak editöryal bir dille paylaşıyorum.

Yorumlar (0)

Yorum Yaz