Node.js connect Modülü ve Middleware

Yazıda Node.js ile HTTP sunucu işlemlerini kolaylaştırmak için kullanılan connect modülü ve middleware kavramı ile ilgili bilgiler yer almaktadır.

Node.js içerisinde bulunan http modülü ile HTTP isteklerini yönetmek işlemler çoğaldığında daha karmaşık hale gelebilmektedir.

Bu karmaşıklığı çözmek için çeşitli üçüncü parti modüller kullanılır.

Bu modüllerden en çok bilinen ve kullanılan modül express modülüdür.

Ancak express modülünü öğrenmeden önce middleware (orta katman) yapısını öğrenmek için daha basit bir modül olan connect modülünü öğrenmek faydalı olacaktır.

NPM üzerinden connect modülünü indirmek için uygulama klasöründe işletim sisteminize ait komut yorumlayıcısına

npm install connect

veya

npm install connect --save

komutlarından birini yazmak yeterli olacaktır.

Gerekli kurulum yapıldıktan sonra modülü kullanabilmek için

const connect = require('connect');
const app = connect();

komutlarının yazılması gerekir.

HTTP sunucusu oluşturmak

NPM içerisinde bulunan modüllerin çoğu Node.js içerisinde yer alan çekirdek modülleri kullanarak çekirdek modüllerin kullanımını daha esnek hale getirir.

Modül dosyaları incelendiğinde http modülünün kullanıldığı kolayca anlaşılabilir.

Modül içerisinde Node.js http modülünü kullanarak http sunucusu oluşturduğu için sadece http sunucu port numarasını yazmak yeterli olacaktır.

'use strict';

const connect = require('connect');
const app = connect();

app.listen(1453);

İstekleri yönetmek

Modülün diğer önemli bir özelliği gelen farklı sayfa isteklerine daha kolay ve anlaşılır bir cevap mekanizmasına sahip olmasıdır.

Node.js http modülü yazısında /anasayfa ve /iletisim isteklerini koşul ile belirliyorduk.

connect modülü ile bu işlemi daha kolay bir şekilde aşağıdaki gibi yapabiliriz.

'use strict';

const connect = require('connect');
const app = connect();

app.use('/anasayfa', function (request, response, next) {

  response.write('Burası anasayfa');
  response.end();

});

app.use('/iletisim', function (request, response, next) {

  response.write('Burası iletişim sayfası');
  response.end();

});

app.listen(1453);

Ancak sayfa için üst bilgi eklenmediğinden sayfadaki Türkçe yazılarda karakter hatası verecektir.

Sorunu çözmek için her sayfaya üst bilgi eklenebilir.

Her sayfa için üst bilgi eklemek kod tekrarı ve karmaşıklığına neden olur.

Orta katman – Middleware

Web sayfasına erişildiğinde sürekli tekrar eden işlemler yapılır.

Bu işlemler üst bilgi ekleme, çerez (cookie) kontrolü, oturum (session) kontrolü, giriş (log) kaydı tutma vb. olabilir.

Böyle bir durumda her bir sayfa için benzer kodların yazılması yerine orta katman (middleware) denilen bir yapı kullanılarak her bir işlemin bir defa yazılması yeterli olacaktır.

Orta katman yapısında yazılan fonksiyonlar yığına atılarak gelen isteğe göre sırayla çalıştırılır.

Orta katman işlemlerinde her bir fonksiyona istek (request) ve cevap (response) parametreleri geçirilir.

Fonksiyonlar bu parametre içerisinde ihtiyacı olduğu değerleri kullanarak işlem yapar.

İşlemi bittiğinde varsa bir sonraki orta katman fonksiyonunu çalıştırılır.

Orta katman fonksiyonu http modülündeki gibi istek ve cevap parametresine ek olarak sonraki orta katman fonksiyonun çağırmak için ek bir parametre alır.

Orta katman fonksiyon örneği

function birIslem(request, response, next) {
  /**
   * Orta katman işlemleri
   */
  next();
}

Bir önceki istekleri yönetmek başlıklı yazıda sayfaya üst bilgi ekleme işlemini orta katman kullanarak yapalım.

'use strict';

const connect = require('connect');
const app = connect();

function ustBilgi(request, response, next) {

  response.writeHead(200, {
    "Content-Type": 'text/html; charset=utf-8'
  });

  next();

}

app.use(ustBilgi);

app.use('/anasayfa', function (request, response, next) {

  response.write('Burası anasayfa');
  response.end();

});

app.use('/iletisim', function (request, response, next) {

  response.write('Burası iletişim sayfası');
  response.end();

});

app.listen(1453);

Üst bilgi ekleme işlemi için örnekteki gibi bir fonksiyon yazacağımız gibi anonim bir fonksiyonda yazabiliriz.

'use strict';

const connect = require('connect');
const app = connect();

app.use(function (request, response, next) {

  response.writeHead(200, {
    'Content-Type': 'text/html; charset=utf-8'
  });

  next();

});

app.use('/anasayfa', function (request, response, next) {

  response.write('Burası anasayfa');
  response.end();

});

app.use('/iletisim', function (request, response, next) {

  response.write('Burası iletişim sayfası');
  response.end();

});

app.listen(1453);

Örnekte /anasayfa isteği için iki fonksiyon yazılmıştır.

İlk olarak üsteki fonksiyon işlemi çalıştırılmış daha sonra next ile sonraki orta katman fonksiyonu çalıştırılmıştır.

Örneklerden de görüldüğü üzere orta katman yapısı kodların anlaşılır ve bakımının kolay olmasını sağlamıştır.

Orta katman modülü yazmak

Node.js Dersleri bölümündeki modül yazmak ve module.exports yazılarındaki bilgileri kullanarak bir giriş kaydı modülü (log) yazalım.

'use strict';

module.exports = function () {

  return function (request, response, next) {

    request.zaman = Date.now();

    console.log('Giriş algılandı - ' + new Date(request.zaman).toLocaleString());

    next();

  }
}

Yazılan modülü log.js olarak kaydedip projeye dahil edelim.

'use strict';

const connect = require('connect');
const log = require('./log');
const app = connect();

Modül proje dahil edildikten sonra yazılan modülü connect modülünün orta katmanına ekleyelim.

app.use(log());

Artık herhangi bir http isteği geldiğinde yazılan modül çalışacaktır.

'use strict';

const connect = require('connect');
const log = require('./log');
const app = connect();

app.use(log());

app.use(function (request, response, next) {

  response.writeHead(200, {
    'Content-Type': 'text/html; charset=utf-8'
  });

  next();

});

app.use(function (request, response, next) {

  response.write('Hoşgeldiniz <br/ >');

  response.write('Sistem saati : ' + new Date(request.zaman).toLocaleTimeString());

  response.end();

});

app.listen(1453);

İyi hazırlanmış orta katman yapısı kodlardaki karmaşıklık ve bakım süresini en aza indirecektir.

Node.js Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!