401: Node.js Web programlama eğitimimizin ileri seviyesinde, Node.js öğreniyoruz.

Tüm Eğitimleri Aldın mı? Kendini sınamanın tam zamanı

Node.js Yazılımına Giriş

Node.js, asenkron çalışan, açık kaynaklı, işlem bazlı (event based), ölçeklenebilir bir uygulama geliştirme çatısıdır. Uygulamaların sunucu (server) tarafında kullanılır ve JavaScript tabanlıdır. İlerleyen eğitimlerimizde uygulamalı olarak Node.js'in kullanım alanlarını ve özelliklerini göreceğiz.

Bir sonraki dersimizde Node.js ile çalışmaya başlamak için kurulum işlemlerini yapacağız. İyi eğlenceler!

İlk Node.js Programının Çalıştırılması

Bu eğitim içeriğimizde basit bir Node.js programının farklı işletim sistemleri (Linux, Mac OS X, Windows) üzerinde nasıl çalıştırılacağını göreceğiz.

Basit Bir HTTP Sunucusu (Server) Oluşturmak

Bir önceki dersimizde, bir Node.js programını çok basit de olsa komut satırında nano editor ile oluşturup node programı yardımıyla çalıştırdık. Bu, yeni başlayanlar için şüphesiz önemli bir adım; ama elbette yeterli değil. Önemli olan, gerçek bir İnternet sunucusu üzerinde bir Node.js programının nasıl çalışabileceğini öğrenmek. Bu bölümde bu konuyu anlatacağız.

Node.js'nin Bazı Temel Özellikleri

Node.js, daha önce de belirtildiği gibi, sunucu (server) tarafında kullanılan JavaScript'tir. Aşağıdaki şekil Node.js'in genel çalışma prensibini veriyor:

Node.js'in geliştirilmesi ve kullanılması şu temel soru çerçevesinde olmuştur: JavaScript'in istemci (client) tarafında mevcut olan ve kullanılan olaya dayalı icra modeli (event based execution) sunucu tarafında kullanılamaz mı?

Node.js Kullanmanın Yararları ve Zararları

Node.js'in pek çok faydası vardır. Bunlardan en temel olanları şu şekildedir:

  • Olay tarafından yönlendirilen (event driven) ve bloke olmayan (non-blocking) özellikleri nedeni ile eşzamanlı bağlantıları rakiplerine göre çok daha hızlı ve etkin şekilde işler.
  • Hem istemci (client) hem de sunucu (server) tarafında aynı dili (JavaScript) kullanmanın büyük kolaylığına sahiptir.
  • MongoDB gibi veritabanları kullanıldığı zaman, hem istemci hem de sunucu tarafında %100 JavaScript kullanır.
  • Açık, etkin API kullanma olanağı sağlar.

 

Senkron İşlem

Aşağıda bir dosyayı senkron çalışma modunda okuyan bir Node.js kodu vereceğiz. Burada kullandığımız, fs.readFileSync() fonksiyonu, fs.readFile() fonksiyonunun senkronize sürümüdür. Bir dosyayı okuyarak içeriğini göndermektedir.

Aşağıdaki Node.js kodu senkron işlem gerçekleştiriyor. readFileSync() fonksiyonu, tüm dosyayı okuyor ve bellekte depoluyor; daha sonra veriyi yazdırıyor ve konsola bir mesaj gönderiyor. Dosyanın okunması işlemi bitene kadar diğer bütün işlemlere ara verilecektir; çünkü bu bir senkron işlemdir.

Asenkron İşlem

Aşağıdaki kod, senkron dosya okuma işleminin asenkron sürümüdür. Callback fonksiyonu okumanın bittiği konusunda bir mesaj vermeden, sistem başka bir işlemi gerçekleştirmeye hazırdır.

Callback (Geri çağırma)

Bir geri çağırma fonksiyonu, başka bir fonksiyona geçirilen bir parametre şeklindeki fonksiyondur. Geri çağırma fonksiyonu, ikinci fonksiyonun içinde çağrılır ya da icra edilir. Geri çağırma fonksiyonları, asenkron olarak icra edilirler.

Node.js REPL (Read-Eval-Print Loop)

Read - Eval - Print Loop (REPL - Oku - Değerlendir - Yaz Döngüsü), etkileşimli bir bilgisayar programlama ortamıdır. Burada REPL'i, Node.js çerçevesinde inceleyeceğiz. Bir REPL ortamında, kullanıcı bir ya da daha fazla ifade ya da komut girebilir. Bunlar hesaplanır (derleme aşaması atlanır) ve sonuç görüntülenir. Bir REPL ortamında dört temel özellik vardır:

Sistemdeki Mevcut Komutların Listesi

Komut satırındayken "Tab" tuşuna basarsanız, komut listesi görüntülenir:

REPL Komutları

Bu bölümde REPL ortamında özellikle faydalı olabilecek bazı komutları vereceğiz.

 

.help komutu

İsminden de anlaşıldığı gibi kullanıcıya bilgi yardımında bulunur, kullanılabilecek REPL komutlarının bir listesini verir:

> .help

.break    
.clear
.exit 
.help 
.load 
.save 
>

 

.break komutu

.break komutu çok satırdan oluşan komuttan çıkma olanağı sağlar. Aşağıdaki örnekte, birden çok satırdan oluşan while komutundan .break komutu ile çıkış gösterilmektedir:

Node.js Global Nesneler

Node.js, yapısal olarak içine yerleştirilmiş bir grup global belirticiye (identifier) sahiptir. Bu nesneler tüm modüllerde kullanılabilir. Bunlardan bazıları gerçekten global nesnelerdir ve herhangi bir yerden erişilebilirler; diğerleri ise modül düzeyinde her modülde mevcutturlar. Aşağıda bunların bir listesi verilmiştir:

Node.js: Konsoldan Giriş

Node.js'i herhangi bir argüman kullanmadan başlatırsanız, REPL komut satırını göreceksiniz.

 

Örnek

gy:bin gy$ node 
>

Burada JavaScript kodlarını çalıştırabilirsiniz ancak tarayıcı tarafındaki geliştiriciler, büyük ihtimalle konsola bilgi yazma ya da hata ayıklama (debug) işlemleriyle ilgili olarak console.log komutu ile ilgilenecektir. Aşağıda console nesnesi metotları listelenmiştir:

Node.js'te Kullanılan Kodlama Sistemleri

Buffer'daki veriyle JavaScript stringleri arasında dönüşüm açıkça bazı kodlama metotları gerektirir. Aşağıdaki tabloda, JavaScript string'lerinin buffer'da saklanması için kullanılan çeşitli kodlama sistemleri hakkında bilgi verilmektedir:

Node.js'te Tampon Alan (Buffer) Kullanımı

JavaScript, unicode ile barışık olmasına rağmen, ikili (binary) veriyi işlemekte çok iyi özellikler göstermez. Oysa TCP akımları (streams) söz konusu olduğunda ya da dosyalardan bilgi okuma ya da dosyalara bilgi yazma yapılacaksa, saf ikili verilerle işlem yapmak zorunludur.

HTTP - Hypertext Transfer Protocol

HTTP, Web'i güçlendiren bir haberleşme protokolüdür. Ayrıca TCP yığınının (stack) da en tepesindedir.

 

HTTP'nin yapısı

Modül, içinde protokol, talepler (requests) ve cevaplar (responses) barındırır. Aslında JavaScript, http.ServerRequest ve http.ServerResponse yapıcılarının (constructors) nesnelerinden ibarettir.

 

Node.js'te Dosya Yönetimi (File Management)

JavaScript, yıllar boyunca dosya sistemine erişim bakımından çok sınırlı olanaklar sağlıyordu. JavaScript büyük çoğunlukla, web tarayıcıyla ilişkili diğer işlemlere konsantre olmuştu. Aslına bakılırsa, dosyalara erişim ve dosya işlemleri, bir web betik dili için (JavaScript gibi) en büyük risk alanını oluşturmaktaydı. Node.js'in gelişimiyle durum biraz farklılaşmıştır.

Node.js'te Connect ile Web Sunucuya Bağlanma

Node.js, ortak ağ uygulamaları için, temel API'ler (Application Program Interface - Uygulama Programı Arayüzü) sağlar. Bunlar arasında en çok ihtiyaç duyacaklarınız, HTTP ve TCP ile ilgili API'lerdir. 

Oysa, gerçek dünya uygulamalarında peş peşe API'ler kullanmak yerine, bazen daha basit metotlar tercih edilir. Connect bu anlamda bir araç kutusudur. İstemler (requests) ve cevaplar (responses) arasındaki arayüzü organize etmekte yeni bir yol sunmaktadır. Orta katman ürünü (Middleware) olarak da anılır.

İstemci - Sunucu (Client - Server) Mimarisi

İstemci - sunucu mimarisi, ağ içindeki her bilgisayar ya da işlemin (process); ya istemci (client) ya da sunucu (server) olduğu mimaridir.

İstemci - sunucu mimarisinde 3 önemli bileşen mevcuttur:

Node.js İçinde Modül Tanımlama ve Kullanma

Node.js içinde de diğer dillerde olduğu gibi başka bir dosya içinde tanımlanmış olan fonksiyonları başka bir dosyadan çağırmak mümkündür. Şimdi basit bir örnekle bunun nasıl gerçekleştirilebileceğini anlatacağız.

node_modules/test yolunu oluşturun. Bunu gerçekleştirmek için node.js'in yüklenmiş olduğu bin dizininin altında önce node_modules dizinini onun altında da test dizinini oluşturun. Bunu, mkdir komutları ile gerçekleştirebileceğinizi biliyorsunuz.

test dizini içine index.js'i aşağıdaki içerikle yerleştiriniz:

Disk Üzerinde Değişik Dizinlerde Dolaşarak Dizin ve Dosyaları Listelemek

Aşağıdaki örnek kodla değişik dizinlerde dolaşarak listeleme gerçekleştiriliyor.