Node.js express route Yönetimi

Yazıda Node.js ile web sunucusuna gelen istekleri yönetmek için kullanılan express modülü route yönetimi ile ilgili bilgiler yer almaktadır.

Express içerisinde yer alan route web sunucusuna gelen istekleri yönetmek için express modülü ile birlikte gelen static gibi orta katmandır.

Express gelen isteklerin esnek ve düzenli bir şekilde yönetilmesi için Router özelliğini kullanılır.

Router özelliği için aşağıdaki kodlar kullanılabilir.

'use strict';

const express = require('express');
const app = express();
const router = express.Router();

Router özelliği parametre olarak caseSensitive, mergeParams ve strict özelliklerini içeren bir nesne alır.

caseSensitive parametresi büyük küçük harfe duyarlılığı yani /Anasayfa ve /anasayfa adreslerinin aynı olduğunu ifade eder.

mergeParams parametresi birden fazla adres yönetiminden / route’tan gelen parametre çakışmalarını önlemek için kullanılır.

strict parametresi katı kurallı adres yönetimini yani /anasayfa ve /anasayfa/ adreslerinin aynı olmasını sağlar.

Router ile istekleri yönetmek

'use strict';

const express = require('express');
const app = express();
const router = express.Router();

router.get('/', function (req, res) {

  res.send('Merhaba Express');
  //res.send('<h1>Merhaba Express</h1>');

});

router.post('/', function (req, res) {
  res.send('Merhaba Express');
});

app.use('/', router);

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Burada dikkat edilmesi gereken use metodu ile Router’ın hangi dizinde etkin olacağının belirlenmesidir.

Metodun ilk parametresi /kullanici olarak değiştirilirse Router artık /kullanici dizinine gelen istekler için çalışacaktır.

Express modülü get, post, put, head, delete, options, trace, copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, m-search, notify, subscribe, unsubscribe, patch, search ve connect yöntemlerini destekler.

'use strict';

const express = require('express');
const app = express();
const router = express.Router();

router.get('/', function (req, res) {
  res.send('Kullanıcı işlemleri');
});

router.post('/', function (req, res) {
  res.send('Kullanıcı işlemleri POST isteği');
});

router.put('/', function (req, res) {
  res.send('Kullanıcı işlemleri PUT isteği');
});

router.delete('/', function (req, res) {
  res.send('Kullanıcı işlemleri DELETE isteği');
});

app.use('/kullanici', router);

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Örnekte /kullanici dizine gelen get isteklerine Kullanıcı işlemleri, post isteklerine Kullanıcı işlemleri POST isteği, put isteklerine Kullanıcı işlemleri PUT isteği ve delete isteklerine Kullanıcı işlemleri DELETE isteği olarak cevap verecektir.

NOT: HTTP yöntemleri (get, post, put, delete vb.) farklı işlemler için kullanılır.

GET yöntemi sayfanın çağrılması, POST yöntemi verinin kayıt edilmesi, PUT yöntemi verinin güncellenmesi, DELETE yöntemi ise verinin silinmesi için kullanılır.

Ayrıca Router içerisinde yer alan route metodu ile birden fazla yöntem sırasıyla yazılarak karmaşıklık azaltılabilir.

'use strict';

const express = require('express');
const app = express();
const router = express.Router();

router.route('/')
  .get(function (req, res) {
    res.send('Kullanıcı işlemleri');
  })
  .post(function (req, res) {
    res.send('Kullanıcı işlemleri POST isteği');
  })
  .put(function (req, res) {
    res.send('Kullanıcı işlemleri PUT isteği');
  })
  .delete(function (req, res) {
    res.send('Kullanıcı işlemleri DELETE isteği');
  });

app.use('/kullanici', router);

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Router içerisinde yer alan all metodu ile gelen tüm HTTP yöntemlerinde çalışacak işlev yazılabilir.

'use strict';

const express = require('express');
const app = express();
const router = express.Router();

router.route('/')
  .all(function (req, res, next) {
    console.log('Yeni giriş algılandı');
    next();
  })
  .get(function (req, res) {
    res.send('Kullanıcı işlemleri');
  })
  .post(function (req, res) {
    res.send('Kullanıcı işlemleri POST isteği');
  })
  .put(function (req, res) {
    res.send('Kullanıcı işlemleri PUT isteği');
  })
  .delete(function (req, res) {
    res.send('Kullanıcı işlemleri DELETE isteği');
  });

app.use('/kullanici', router);

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Web sayfaları genellikle birden fazla bölümden oluşur.

Birden fazla Router oluşturarak farklı bölümler için farklı cevaplar verilebilir.

'use strict';

const express = require('express');
const app = express();
const kullanici = express.Router();
const site = express.Router();

kullanici.get('/', function (req, res) {
  res.send('Kullanıcılar');
});

kullanici.get('/giris', function (req, res) {
  res.send('Giriş alanı');
});

kullanici.get('/kayit', function (req, res) {
  res.send('Kayıt alanı');
});

site.get('/', function (req, res) {
  res.send('Anasayfa');
});

site.get('/iletisim', function (req, res) {
  res.send('İletişm');
});

app.use('/', site);
app.use('/kullanici', kullanici);

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Sunucu / ve /iletisim için site Router’ına, /kullanici, /kullanici/giris ve /kullanici/kayit için kullanıcı Router’ına yazılan kuralları çalıştıracaktır.

Ancak çoğalan kurallar kodların karmaşıklaşmasına neden olur.

Bu durumda farklı bölümler için farklı Router modülü yazmak kodun düzenlemesini kolaylaştıracaktır.

Aşağıdaki kodları kullanici.js olarak kaydedin.

'use strict';

const express = require('express');
const app = express();
const kullanici = express.Router();

kullanici.get('/', function (req, res) {
    res.send('Kullanıcılar');
});

kullanici.get('/giris', function (req, res) {
    res.send('Giriş alanı');
});

kullanici.get('/kayit', function (req, res) {
    res.send('Kayıt alanı');
});

module.exports = kullanici;

Aşağıdaki kodları site.js olarak kaydedin.

'use strict';

const express = require('express');
const app = express();
const site = express.Router();

site.get('/', function (req, res) {
  res.send('Anasayfa');
});

site.get('/iletisim', function (req, res) {
  res.send('İletişm');
});

module.exports = site;

Aşağıdaki kodları kullanici.js ve site.js ile aynı klasörde bir dosyaya yazıp çalıştırın.

'use strict';

const express = require('express');
const app = express();
const kullanici = require('./kullanici');
const site = require('./site');

app.use('/', site);
app.use('/kullanici', kullanici);

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Yazılan kodları azaltmak için aşağıdaki kodlarda kullanılabilir.

'use strict';

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

app.use('/', require('./site'));
app.use('/kullanici', require('./kullanici'));

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Yazılan kodları azaltmak, daha anlaşılır bir kod düzeni için kodları kendinize göre düzenleyebilir ve kullanabilirsiniz.

Web sayfalarındaki kullanıcı bilgilerinin bulunduğu adresler genellikle özel numara veya kullanıcı adı ile belirtilir.

Her kullanıcı için farklı bir kural tanımlamak yerine express modülü içerisinde yer alan düzenli ifade özelliğini kullanabiliriz.

'use strict';

const express = require('express');
const app = express();
const kullanici = express.Router();

kullanici.get('/:adi', function (req, res) {
  res.send('Merhaba ' + req.params.adi);
});

app.use('/kullanici', kullanici);

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Yazılan /:adi kuralı ile sunucu /kullanici/**adi** isteklerine cevap verecek hale geldi.

Buradaki **adi** alanına herhangi birşey (/kullanici/yusuf, /kullanici/sefa, /kullanici/sezer vb.) yazılabilir.

Gönderilen kullanıcı bilgileri (yusuf, sefa, sezer vb.) parametre olarak isimlendirilir.

Parametreler gönderildikten sonra express içerisinde yer alan param isimli metot çalışır.

Bu metodu kullanarak gönderilen parametreye ait bilginin veritabanında aranması veya farklı işlemler yapılabilir.

'use strict';

const express = require('express');
const app = express();
const kullanici = express.Router();
const kullanicilar = [
  {
    kullanici_adi: 'yusuf',
    adi: 'Yusuf',
    soyadi: 'SEZER'
  },
  {
    kullanici_adi: 'ramazan',
    adi: 'Ramazan',
    soyadi: 'SEZER'
  },
  {
    kullanici_adi: 'sinan',
    adi: 'Sinan',
    soyadi: 'SEZER'
  },
  {
    kullanici_adi: 'mehmet',
    adi: 'Mehmet',
    soyadi: 'SEZER'
  }
];

let varmi = false;

kullanici.param('adi', function (req, res, next, adi) {

  kullanicilar.forEach(function (mevcut) {

    if (mevcut.kullanici_adi == adi) varmi = true;

  }, this);

  next();

});

kullanici.get('/:adi', function (req, res) {

  if (varmi) res.send('Böyle bir kullanıcı var');

  res.end('Böyle bir kullanıcı yok');

  varmi = false;

});

app.use('/kullanici', kullanici);

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Bazen gönderilen parametrelerin sadece sayı olması istenebilir bu durumda sadece sayıların kabul edildiği düzenli ifadenin yazılması gerekir.

'use strict';

const express = require('express');
const app = express();
const kullanici = express.Router();

kullanici.get('/:id(\\d+)', function (req, res) {
  res.send('Merhaba');
});

app.use('/kullanici', kullanici);

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Örnekte; /kullanici/**id** olarak belirtilen ifadedeki **id** değeri yalnızca sayı alacaktır.

Örneğin; /kullanici/yusuf veya /kullanici/1yusuf gibi bir değer için çalışmayacak ancak /kullanici/123456 gibi bir değer için çalışacaktır.

Benzer şekilde özel istekler için özel bir düzenli ifade yazarak sadece istenen durum için çalışan kurallar yazılabilir.

Bazı bölümlere gelen tüm isteklere aynı cevabın/sayfanın verilmesi istenebilir.

Böyle bir işlem için ilgili http yöntemi (get, post vb.) metodunun ilk parametresine yıldız (*) eklenmesi yeterli olacaktır.

'use strict';

const express = require('express');
const app = express();
const kullanici = express.Router();

kullanici.get('*', function (req, res) {
  res.send('Lütfen giriş yapın !');
});

app.use('/kullanici', kullanici);

app.listen(1453, function () {
  console.log('Sunucu çalışıyor...');
});

Örnekte /kullanici, /kullanici/giris, /kullanici/bilgi/giris/12 vb. isteklere aynı cevap/sayfa verilecektir.

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!