Bu makalemizde, Node.JS'in en çok kullanılan modüllerinden biri olan Express'e giriş yapacağız ve bir sonraki makalemize baz teşkil edecek bilgileri öğreneceğiz.

Şimdiye kadarki makalelerde, Node hakkında güzel şeyler söyledim. Aslında JavaScript ile sunucu tarafında da kod yazabilmemize imkan sağladığı için Node gerçekten bir nimet. Ancak bu nimetin tüm kullanım alanlarını tahmin etmek oldukça güç. Geçen gün forumlardan birinde, çıktısı PNG formatında imaj olan 3D bir grafiğin değerlerini Node ile Parse edip API olarak dışarı açmaya çalışan biri ile karşılaştım. Kendisine evlenmesini tavsiye ettim.



Tamam, sonuçta fantezinin sınırı yok ama Node'un yaygın olarak kullanıldığı yerleri belki de aşağıdaki şekilde gruplamamız mümkün olabilir.
  • Belirli periyotlarda veya zamanlarda önceden planlanan işlerin yerine getirilmesi (Örneğin kuyrukta bekleyen maillerin gönderilmesi veya DB Backup alınması)
  • Dış istemcilerin isteklerine Web Service/API gibi cevap verebilen yapıların kurulması
  • RIA/SPA türünde yazdığımız uygulamaların sunucu tarafında haberleşebileceği REST türünde uç birimlerin yazılması
  • Multiplayer oyunlar gibi full duplex veri iletişimine ihtiyaç duyan sistemlere sunucu tarafında hizmet verebilecek uç birimlerin yazılması

Buradaki ilk madde için dışarıdan gelecek bir tetikleyiciye ihtiyacımız yok. Sunucunun saatini kontrol ederek vakti geldiğinde veya belirli periyotlarda gerekli görevleri yerine getirebiliriz.

Sondaki madde için ise WebSocket/Socket.IO tarzında bir çözüme ihtiyacımız olacaktır ki, bunu ilerleyen makalelerde göreceğiz inşallah.

Arada kalan diğer iki madde için dışarıdan HTTP protokolü ile bir talep gelmesi ve bizim de buna karşılık uygun bir cevap dönmemiz gerekir. Şimdiye kadar gördüğümüz birkaç küçük örnekte, basit bir Web Server'ın nasıl yazılacağını görmüştük. İşin aslı, sadece bu kadar bilgi, bol miktarda "if" ve bir o kadar da sabırla bu işi yapmamız mümkün. Ama Node ile olmasa da programcılıkta o kadar yıllık tecrübemiz var. Şu işi biraz daha profesyonel ele almaya çalışalım bakalım.

Bir kere dışarıdan HTTP protokolü ile talepler gelecek dedik. MVC mimarisini de (en azından Can.JS kategorisinden) biliyoruz. Dışarıdan gelen talepleri dinleyip, istek yapılan URL'lere göre yapılmak istenen işlemleri anlayan bir bölümümüz olsun. Bu bölümde talebi, işlem ile ilgili Business'ı içeren asıl kod bloğuna yönlendirelim. Burada gerekli işlemleri yaptıktan sonra da, uygun cevabı üreterek geri dönelim. Geri dönüş sırasında da EJS ve View Sınıfları makalesinde gördüğümüz JavaScript Template'leri kullanabiliriz mesela. Böylece kompleks çıktıları da daha rahat organize edebiliriz, hatta çıktı olarak HTML sayfa bile üretebiliriz.

İyi de, bir HTML sayfa üzerinde 20 tane resim, 3 tane CSS, 20 tane JavaScript dosyası olsa, tarayıcı bunların her biri için ayrı ayrı HTTP GET Request'te bulunacaktır. Ne yani, bunların her biri için ayrı ayrı karşılayıcı fonksiyon mu yazacağız? Bunun yerine Apache'deki www veya IIS'deki wwwroot klasörü gibi bir klasörümüz olsa, bunun içerisine konulan tüm dosyaları, node uygulamamız ayağa kalktığı anda tarayıp erişime hazır hale getirse. Böylece buradaki dosyalar için de ayrıca yönlendirme ve karşılama kodları yazmak zorunda kalmasak.

Bir de REST API yazabilmek için hazır olanaklar sunsak. Dur dur, güzel olacak gibi. Neredeyse kendi Web Server'ımızı yazdık sayılır. Bir de bunu modül haline getirip diğer programcıların da kullanımına açtık, tamamdır bu iş.

Hmm. İyi de...

Node ne zaman çıkmıştı yav? 2009. Eee? 4 yıldır bir akıllı çıkıp da bunları düşünemedi mi yani?

İlk başta kaç akıllı vardı tam bilemiyorum ama bu adreste host edilen Express isimli projeyi an itibariyle 115 kişi geliştiriyor/destek veriyor. Express aynı zamanda Node'un en çok kullanılan modüllerinden bir tanesi. Örneğin ben bu makaleyi yazdığım sırada sadece geçen ayki indirilme sayısı 752.766'ydı.



Dikkat  : Express modülü Node'un Stable olmayan versiyonu ile Linux üzerinde sorun yaşıyor. Linux üzerinde çalışacakların, ben bu makaleyi yazarken stable olmayan v0.11.7-pre versiyonu yerine, yine ben bu makaleyi yazarken stable olan v0.10.20 versiyonunu kullanmasını tavsiye ediyorum. Stable versiyonun kaynak kodlarını Node official download sayfasından indirebilir, ardından sıkıştırılmış dosyayı açarak, kurulum makalesindeki adımları izleyebilirsin (./configure > make > sudo make install).

Haydi, bir örnek üzerinde görelim bakalım, amcalar bizim için neler yapmışlar. Öncelikle Express modülünü indirmemiz gerekiyor. Bunun için masaüstünde "Express" isimli bir klasör açalım. Ardından terminal (Linux veya Mac OS) veya command prompt (Windows) ile bu klasörün içine girelim ve aşağıdaki komutu çalıştıralım.

npm install express

Not  : Global modül yüklemeleri hakkındaki düşüncemi npm (Node Package Manager) isimli makalenin sonunda belirtmiştim. Bu yüzden Express'in global değil lokal şekilde kurulumunu anlatıyorum. İsteyen "npm install -g express" komutuyla Express'i global olarak kurabilir ve "express" komutuna tam yolunu yazmadan da ulaşabilir.

Bu komut ile Express modülü için gerekli dosyalar, az önce oluşturduğumuz "Express" klasörüne indirilecektir. Biz bu modülü, yeni bir proje oluşturmak için kullanacağız. Yani asıl örnek projemiz bu klasör içerisinde olmayacak.

Şimdi sıra geldi Express ile ilk örnek projemizi oluşturmaya. Eğer ki Express'i "npm install -g express" komutuyla Global olarak indirseydik, direk "express" komutu ile çalıştırmamız mümkün olabilirdi. Ancak lokal olarak indirdiğimizden, kullanmak için tam yolunu yazmamız gerekiyor.

Yine bir terminal (Linux veya Mac OS) veya command prompt (Windows) penceresi açarak, bu kez masaüstüne kadar gelelim (Ama Express klasörünün içerisine girmeyelim) ve sonrasında Linux ve Mac OS için;

Express/node_modules/express/bin/express ExpressSample

komutunu, Windows için;

Express\node_modules\.bin\express ExpressSample

komutunu çalıştıralım. Bu komut vasıtasıyla, masaüstünde "ExpressSample" isimli bir klasör içerisinde örnek projemiz oluşturulacaktır. Ancak projemizin çalışmak için ihtiyaç duyduğu bazı modüller var. Neyse ki bu modüller "package.json" dosyasında yazıyor. Bu yüzden terminal (Linux veya Mac OS) veya command prompt (Windows) penceresinde ilk olarak "ExpressSample" isimli klasörün içine girip aşağıdaki komutu çalıştırmamız, ihtiyaç duyulan modülleri indirmek için yeterli olacaktır.

npm install

Hepsi bu kadar. Örnek projemiz için gerekli tüm dosyaların inmiş ve çalışmaya hazır şekilde bizi bekliyor olması lazım.

Not  : Bu noktadan itibaren, masaüstündeki "Express" klasörüne ihtiyacımız kalmadı. İstersen bu klasörü daha sonra kullanmak üzere başka bir yere taşıyabilirsin ya da en güzeli, ihtiyaç olduğunda güncel versiyonunu tekrar indirmek üzere silebilirsin.

Gelelim projeyi ayağa kaldırıp test etmeye. Bunun için aşağıdaki komutu kullanabiliriz.

node app.js

Bunun üzerine ekranda aşağıdaki gibi bir görüntünün oluşması gerekiyor.



Buradan da anlaşıldığı üzere, uygulama 3000 portunu dinlemeye başlamış. Test etmek için bir internet tarayıcısı üzerinden http://localhost:3000 adresini ziyaret edebiliriz. Bu durumda karşına aşağıdaki gibi sayfanın gelmesi gerekiyor.



Bunu bir Hello World projesi olarak düşünebilirsin. Express bizim için gerekli olan temel yapıyı, örnek bir sayfa ile birlikte oluşturdu. Hatta karşılığı yazılmayan adresler için bir de 404 sayfası oluşturdu. Test etmek için http://localhost:3000/1.html adresini ziyaret edebilirsin. Bu durumda karşına aşağıdaki gibi bir sayfanın gelmesi gerekiyor.



Bu hatayı almamızın sebebi, 1.html için henüz karşılayıcı bir kod yazmamamızdan kaynaklanıyor. Makalenin üst kısmında, Apache'deki www veya IIS'deki wwwroot klasörü gibi bir klasörden bahsetmiştim. Öyle ki, bu klasörün içerisine koyduğumuz dosyalar için karşılamalar otomatik yapılacaktı. Bunu da deneyelim. Aşağıdaki kodu, masaüstündeki "ExpressSample" klasörü içerisindeki "public" klasörüne "1.html" ismi ile kaydedelim.

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
Test
</body>
</html>

Şimdi tekrar http://localhost:3000/1.html adresini ziyaret edelim. Bu sefer karşına aşağıdaki gibi bir sayfanın gelmesi gerekiyor.



Gördüğün gibi herhangi bir karşılama kodu yazmaya gerek kalmadan sayfa direk kullanıma açıldı. Benzer şekilde "public" klasörü altına koyduğumuz jpeg, css ve js gibi dosyalara da direk ulaşmamız mümkün olacaktır.

Her ne kadar bu şekilde Node'u bir Web Server gibi kullanmamız mümkün olsa da, bizim asıl amacımız gelen taleplere karşılık dinamik cevaplar üretmek olacağı için, bizi daha çok karşılama kodlarının nasıl yazıldığı ilgilendiriyor.

Bunun için "routes" klasörünü kullanırız. Normalde yazacağımız her bir karşılama kodu için "routes" klasörüne bir adet dosya yerleştirerek, ilgili kodu bunun içerisine yazarız. Ardından bu dosyaları da, hangi adreslerle ilişkilendirmek istediğimizi kök dizindeki "app.js" dosyasında belirtiriz. Bunun haricinde eğer bir JavaScript Template View yapısını kullanmak istersek, bu Template dosyalarını da "views" klasörüne koyarız.

Bundan sonraki makalede zaten kendi örneğimizi yaparken işin içine daha derinlemesine dalacağız ama bu makalede, hazır gelen örneğin nasıl çalıştığına biraz daha yakından bakalım.

İlk olarak "routes" klasörüne girelim. Karşına aşağıdaki gibi bir görüntünün çıkması gerekiyor.



Hazır örnekte iki adet route yazılmış durumda. "index.js" dosyası, az önceki denemede ilk açılan sayfaya karşılık geliyordu. "user.js" dosyasını ise henüz denemedik.

"user.js" dosyasına bir bakalım. Karşına aşağıdaki gibi bir kodun gelmesi gerekiyor.

/*
 * GET users listing.
 */

exports.list = function(req, res){
  res.send("respond with a resource");
};

Gördüğün gibi burada "exports.list" adında bir fonksiyon tanımlanmış ve Response olarak "respond with a resource" metnini dönüyor. Bu kod, daha önceki örneklerimizde bizim yazdığımız HTTP Listener kodlarına benziyor.

Şimdi de kök dizindeki "app.js" dosyasına bakalım. Karşına aşağıdaki gibi bir kodun gelmesi gerekiyor.

/**
 * Module dependencies.
 */

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

Burada dikkat etmemiz gereken iki satır var. İlki 7. satırdaki aşağıdaki kod.

var user = require('./routes/user');

Burada, "routes" klasörü içerisindeki "user.js" dosyasını "user" nesnesine atıyoruz.

İkinci ise 30. satırdaki aşağıdaki kod.

app.get('/users', user.list);

Burada http://localhost:3000/users adresine gelen taleplerin, "user.js" dosyasındaki "list" fonksiyonuna iletilmesini söylüyoruz. Eğer bu adresi ziyaret edersen, aşağıdaki gibi bir görüntü ile karşılaşacaksın.



Gördüğün gibi, bu şekilde istediğimiz kadar route kodunu "routes" klasörü içerisine yerleştirip, ardından bunları istediğimiz adreslerle "app.js" dosyası altında eşleştirebilir ve kompleks uygulamaları iyice çorbaya çevirmeden üstesinden gelebiliriz.

Elbette Express hakkında söylenebilecek çok şey var ama bu şekilde Express'e bir giriş yapmış olduk. İnşallah bir sonraki makalede kendi örneğimizi hazırladığımızda, konuya olan hakimiyetimiz biraz daha artacaktır.

Şimdilik makalemizi burada tamamlayalım ve öğrendiklerimizi özetleyelim.
  • Express, kompleks HTTP Server uygulamalarını yazmamıza imkan sağlayan altyapıyı sunan, Node'un en çok kullanılan modüllerinden biridir.
  • Express ile oluşturduğumuz projelerde, "public" klasörü altına konulan dosyalar, doğrudan erişime açılırlar ve bunlar için herhangi bir karşılama kodu yazmamıza gerek kalmaz.
  • Karşılama kodu olarak, her bir adrese karşılık işletilmesi gereken kodları, "routes" klasörü altındaki dosyalara yazarız.
  • "routes" klasörü altındaki dosyaları URL adresleri ile eşleştirme işini de kök dizindeki "app.js" dosyası içerisinde yaparız.
  • Uygulamamızda JavaScript Template kullanmak istersek, bunları "views" klasörü içerisine koyabiliriz.


Yorum Gönder

  1. node_modules/express/bin/ dizini altında express dosyası yok. "mime" ve "mime.cmd" dosyaları var sadece. haliyle
    Express/node_modules/express/bin/express ExpressSample
    komutu çalışmıyor ve devamı gelmiyor. yardımcı olabilir misin.
    Bu durum windows ve linux için aynı bende.

    YanıtlaSil
    Yanıtlar
    1. bende ayni durumla karsilastim. 2013 yilindan beri haliyle isler degismis. biraz arastirinca
      nmp install express-generator
      ile generator kurup
      Express/node_modules/express-generator/bin/express test1

      Sil
  2. Global olarak yüklemeden 'express' komutu çalışmıyor.
    Ben ancak "npm install express-generator -g" ile çalıştırabildim.

    Devamı ve en son hali şurada ;
    https://expressjs.com/en/starter/generator.html

    YanıtlaSil

 
Top