Node.js — Bölüm 2 : Basit Yönlendirmeler

Emeltemakcay
riseconsulting
Published in
3 min readSep 18, 2023

By Volkan Suner, Burak Karayakalı, Kazım Fırat Sucuk, Nuri Kon, Hidayet Can Özcan

Node.js’in saf potansiyeline daldığımızda, istemciden talepleri alabilecek, bu isteklerin başlık, yöntem, yol, sorgu dizeleri ve yük verilerini okuyabilecek, belirtilen bir port aracılığıyla istemciye bir yanıt dönebilecek bir temel sunucu tasarladık. Bu oluşturulan sunucuyu tümüyle orijinal Node.js ile gerçekleştirdik. Vanilla Node.js ile ilerlememizdeki esas motivasyon, bu yaklaşımın bize konseptleri daha derinlemesine kavrama ve şeylerin nasıl çalıştığını daha keskin bir şekilde gözlemleme olanağı sağlamasıdır. Örneğin, express.js, sunucu oluşturma ve yönlendirme görevlerini oldukça etkili bir şekilde ele alan harika bir araçtır. Ancak Vanilla Node.js ile işin temel taşlarını daha yakından tanıma şansına sahip oluyoruz.

Bu bilgiden hareketle, sunucumuzu daha fonksiyonel kılmak adına kodumuzda birtakım yeniden yapılandırmalara girişelim. İlk adım olarak, kullanıcıları farklı işlevlere yönlendirebilmek için yol verisini nasıl kullanabileceğimize odaklanalım. Bu, sunucumuzun istemcinin girdisine göre değişiklik göstermesini sağlar; örneğin: localhost:5000/test. Bu amaçla, yollar için kontrolcüler içeren şu yapıyı inceleyelim:

const controllers = {
test: (data) => {
const payload = JSON.stringify({ message: "Merhaba dostum, orada mısın?" });
return {
statusCode: 200,
contentType: "application/json",
payload,
};
},
notFound: () => {
const payload = JSON.stringify({ message: "Kaynak bulunamadı." });
return {
statusCode: 404,
contentType: "application/json",
payload,
};
},
};

Bu yapıda, şu an için ‘test’ ve ‘notFound’ olmak üzere iki ana rota üzerinde durmaktayız. ‘Test’ rotası, spesifik bir mesaj oluşturmak, bu mesajı JSON nesnesine dönüştürmek ve ardından belirli anahtar değerlere sahip bir nesne döndürmek için kullanılan veri argümanını alır. Öte yandan ‘notFound’, kaynak bulunamadığında döndürülecek olan bilgilendirici bir mesajı temsil eder.

Kontrolcüleri, sunucu talepleri ile etkileşimde bulunan ana yapıya entegre ederken şu şekilde bir yaklaşım benimsedik:

server.on("request", (req, res) => {
req.on("end", () => {
...
const requestedController = controllers[path] === undefined ?
controllers["notFound"] : controllers[path];
const data = { path, queryString, method, headers, buffer };
const respondFromController = requestedController(data);
const { contentType, statusCode, payload } = respondFromController;

Bu koda baktığımızda, yolun kontrolcü nesnesi içinde var olup olmadığını kontrol ettiğimizi görmekteyiz. Eğer belirtilen bir yol anahtarı olarak bulunuyorsa, bu yola ait kontrolcüyü; bulunmuyorsa, ‘notFound’ kontrolcüsünü kullanmaktayız. Ardından, seçilen kontrolcüye gönderilecek olan veriyi oluşturmak için talepten elde edilen tüm özellikleri bir araya getiriyoruz. Ancak bu aşamada, bu veriyi henüz aktif bir şekilde kullanmıyoruz.

Son olarak, istemciye geri dönüş yapacak olan yanıtın yapısı şu şekildedir:

const requestedController = controllers[path] === undefined ?
controllers["notFound"] : controllers[path];
const data = { path, queryString, method, headers, buffer };
const respondFromController = requestedController(data);
const { contentType, statusCode, payload } = respondFromController;
res.setHeader("Content-Type", contentType);
res.writeHead(statusCode);
res.end(payload);

Burada, JSON türünde bir yük gönderiyoruz. Bu nedenle, ilgili başlıkları ayarlamamız gerekmekte. Bu bilgiler seçilen kontrolcüden elde edilmekte olup, sonrasında durum kodu yazılarak yanıt istemciye iletilmektedir.

Özetle, saf Node.js kullanarak, istemcilere uygun işlevlere veya hatta HTML sayfalarına yönlendirmek için ne kadar esnek ve kontrollü bir yapı kurabileceğimizi görmekteyiz. En önemlisi, bu süreç boyunca Node.js sunucusunun temel çalışma prensiplerini daha derinlemesine kavramış oluyoruz.

Bu yazı Rise Technology Orion Team tarafından hazırlanmıştır.

--

--