Node.js Express ile HTTP Request (İstek) ve Response (Cevap) Mantığı

  • 25
  • (1)
  • (5)
  • 29 Ağu 2024

NodeJS Projesi Oluşturma

Visual Studio 2022 üzerinde NodeJS projeleri oluşturabileceğiniz çok sayıda şablon mevcuttur. NodeJS console projeleri, web projeleri oluşturabilirsiniz. Bu yazı içerisinde web projesi oluşturulup, express eklentisi kurularak, değişik web metotların nasıl uygulanabildiği incelenecektir.

nodejs project javascript

Proje adını girip projeyi oluşturduktan sonra tamamen boş bir web projesi karşınıza gelecektir. Express kurmak için Visual Studio 2022 üzerinde Tools menüsü Command Line içinde bulunan, Developer Powershell tuşuna tıklayın.

nodejs project javascript

Açılan Developer Powershell ekranında karşınıza projenin bulunduğu dizinde yer alan bir komut satırı penceresi gelecektir.

nodejs powershell javascript

Buradaki komut satırına Express kütüphanesini kurmak için npm install express yazıp Enter tuşuna basın. Express kütüphanesi ile beraber gerekli olan bütün eklentiler projeye eklenecektir.

Bunun yerine Windows üzerinde açabileceğiniz cmd komut ekranında projenin bulunduğu dizine cd komutu ile gidip, aynı npm install express komutunu yazabilirsiniz. Tamamen aynı işlem gerçekleşecektir.

Ya da Visual Studio 2022 ekranındaki Solution Explorer alt penceresinde npm öğesine sağ tıklayıp, Install New npm Packages penceresini açın. Search for packages yazan arama kutusuna express yazarak, TJ Holowaychuk isimli yayıncıya ait olan paketi projeye doğrudan kurabilirsiniz.

nodejs powershell javascript

Tabii ki bütün bunları yapmak için de, sisteminizde NodeJS'in kurulu olması gereklidir. (NodeJS web sitesi)

Express ile Web Request Oluşturma

Visual Studio 2022 ile oluşturulan boş bir NodeJS web projesinde karşınıza gelecek ilk kod server.js içerisinde şu olacaktır.


'use strict';
var http = require('http');
var port = process.env.PORT || 1337;

http.createServer(function (req, res) {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World\n');
}).listen(port);

Express olmadan otomatik oluşturulmuş bu kodu aşağıdaki şekilde Express kütüphanesinin kullanıldığı hale dönüştürebilirsiniz.


'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;

app.listen(port, function () {
    console.log('NodeJS ile Express uygulaması çalışıyor...');
});

Javascript dilinde function tanımlarken aşağıdaki syntax yapısını da kullanabilirsiniz.


'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;

app.listen(port, () => {
    console.log('NodeJS ile Express uygulaması çalışıyor...');
});

Mevcut uygulama içerisinde herhangi bir şekilde Request yani istek gönderilebilecek bir link mevcut değildir. İstek gönderilebilecek bir link oluşturmak için aşağıdaki kodu inceleyip uygulayabilirsiniz.


'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;

app.get('/ana-ekran', (req, res) => {
    res.send('Ana ekran linki çağırıldı');
});

app.listen(port, () => {
    console.log('NodeJS ile Express uygulaması çalışıyor...');
});

Visual Studio 2022 üzerinden çalıştırma butonu ile veya komut satırından server.js dosyasını node [dosya yolu]/server.js komutu ile çalıştırdığınızda uygulama başlayacaktır. Uygulama 1337 nolu portu kullanacağı için http://localhost:1337/ana-ekran linkine tarayıcınız üzerinden girebilirsiniz.

nodejs express javascript

Eğer Türkçe karakterler karşınıza bozuk bir şekilde gelirse, server.js dosyasını File menüsünden aynı konumuna farklı kaydederek, Encoding ayarını Unicode (UTF-8 with signature) olarak belirleyebilirsiniz.

nodejs encoding javascript

Türkçe karakterler düzgün bir şekilde gelecektir.

nodejs express javascript

/ana-ekran yolu dışında / link için aşağıdaki kodu uygulayın


'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;

app.get('/', (req, res) => {
    // İçerik türünü html olarak belirlemek için
    res.setHeader('Content-Type', 'text/html');
    res.send(`
        <html>
            <head>
                <title>Ana Sayfa</title>
            </head>
            <body>
                <h1>Ana Sayfa</h1>
                <div>
                    <p>NodeJS ile html sayfası görüntülerken:</p>
                    <ul>
                        <li>Html içeriğini res.send ile yollayabilirsiniz</li>
                        <li>html dosyasını açıp response olarak yollayabilirsiniz</li>
                        <li>pug yapısını kullanabilirsiniz</li>
                    <ul>
                </div>
            </body>
        </html>
    `);
});

app.get('/ana-ekran', (req, res) => {
    res.send('Ana ekran linki çağırıldı');
});

app.listen(port, () => {
    console.log('NodeJS ile Express uygulaması çalışıyor...');
});

Uygulamayı çalıştırıp http://localhost:1337/ linkine giriş yaptığınızda karşınıza gelecek olan görüntü

nodejs express html request

Request (İstek) Yolu İçerisinde Parametre Kullanımı

Uygulama içerisinde http://localhost:1337/kitap/anna-karenina, http://localhost:1337/kitap/savas-ve-baris, http://localhost:1337/kitap/suc-ve-ceza gibi parametre içeren istek yollarını kullanabilmek mümkündür.


'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;

app.get('/kitap/:name', (req, res) => {
    let bookLink = req.params.name;
    let bookName = 'Kitap Bulunamadı';
    let authorName = 'Yazar Bulunamadı';
    let year = 0;
    switch (bookLink) {
        case 'anna-karenina':
            bookName = 'Anna Karenina';
            authorName = 'Lev Nikolayeviç Tolstoy';
            year = 1877;
            break;
        case 'savas-ve-baris':
            bookName = 'Savaş ve Barış';
            authorName = 'Lev Nikolayeviç Tolstoy';
            year = 1869;
            break;
        case 'karamazov-kardesler':
            bookName = 'Karamazov Kardeşler';
            authorName = 'Fyodor Mihayloviç Dostoyevski';
            year = 1881;
            break;
        case 'suc-ve-ceza':
            bookName = 'Suç ve Ceza';
            authorName = 'Fyodor Mihayloviç Dostoyevski';
            year = 1866;
            break;
        case 'sefiller':
            bookName = 'Sefiller';
            authorName = 'Victor Marie Hugo';
            year = 1862;
            break;
    }
    res.setHeader('Content-Type', 'text/html');
    res.send(`
        <html>
            <head>
                <title>Kitap - ${bookName}</title>
            </head>
            <body>
                <h1>${bookName}</h1>
                <div>
                    <p>Yazar: ${authorName}</p>
                    <p>Yıl: ${year}</p>
                </div>
            </body>
        </html>
    `);
});

app.listen(port, () => {
    console.log('NodeJS ile Express uygulaması çalışıyor...');
});

Girilen her uygun link için switch koşullamasında var olan değerler ile bir sayfa oluşturulur.

nodejs parameter html request

Linkten alınacak değerler, bir veritabanı ya da bir json dosyasındaki verilerle sorgulanarak da response verisi elde edilebilir.


'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;

var jsonBooks = [
    {
        'bookLink': 'anna-karenina',
        'bookName': 'Anna Karenina',
        'authorName': 'Lev Nikolayeviç Tolstoy',
        'year': 1877
    },
    {
        'bookLink': 'savas-ve-baris',
        'bookName': 'Savaş ve Barış',
        'authorName': 'Lev Nikolayeviç Tolstoy',
        'year': 1869
    },
    {
        'bookLink': 'karamazov-kardesler',
        'bookName': 'Karamazov Kardeşler',
        'authorName': 'Fyodor Mihayloviç Dostoyevski',
        'year': 1881
    },
    {
        'bookLink': 'suc-ve-ceza',
        'bookName': 'Suç ve Ceza',
        'authorName': 'Fyodor Mihayloviç Dostoyevski',
        'year': 1866
    },
    {
        'bookLink': 'sefiller',
        'bookName': 'Sefiller',
        'authorName': 'Victor Marie Hugo',
        'year': 1862
    },
    {
        'bookLink': 'deniz-iscileri',
        'bookName': 'Deniz İşçileri',
        'authorName': 'Victor Marie Hugo',
        'year': 1866
    }
];

app.get('/kitap/:name', (req, res) => {
    let bookLink = req.params.name;
    let bookName = 'Kitap Bulunamadı';
    let authorName = 'Yazar Bulunamadı';
    let year = 0;
    // istek parametresinin eşitlendiği bookLink ile aynı olan json dizisindeki eleman filtrelenir
    let filtered = jsonBooks.filter((book) => book.bookLink === bookLink);
    // eğer filtreleme sonucu oluşan dizinin uzunluğu sıfırdan büyükse link dizide mevcuttur
    if (filtered.length > 0) {
        bookName = filtered[0].bookName;
        authorName = filtered[0].authorName;
        year = filtered[0].year;
    }
    res.setHeader('Content-Type', 'text/html');
    res.send(`
        <html>
            <head>
                <title>Kitap - ${bookName}</title>
            </head>
            <body>
                <h1>${bookName}</h1>
                <div>
                    <p>Yazar: ${authorName}</p>
                    <p>Yıl: ${year}</p>
                </div>
            </body>
        </html>
    `);
});

app.listen(port, () => {
    console.log('NodeJS ile Express uygulaması çalışıyor...');
});

Response içerik türünün html sayfası değil de, json türünde dönmesini istiyorsanız, Content-Type isimli header değerini application/json yapmalısınız.


'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;

var jsonBooks = [
    {
        'bookLink': 'anna-karenina',
        'bookName': 'Anna Karenina',
        'authorName': 'Lev Nikolayeviç Tolstoy',
        'year': 1877
    },
    {
        'bookLink': 'savas-ve-baris',
        'bookName': 'Savaş ve Barış',
        'authorName': 'Lev Nikolayeviç Tolstoy',
        'year': 1869
    },
    {
        'bookLink': 'karamazov-kardesler',
        'bookName': 'Karamazov Kardeşler',
        'authorName': 'Fyodor Mihayloviç Dostoyevski',
        'year': 1881
    },
    {
        'bookLink': 'suc-ve-ceza',
        'bookName': 'Suç ve Ceza',
        'authorName': 'Fyodor Mihayloviç Dostoyevski',
        'year': 1866
    },
    {
        'bookLink': 'sefiller',
        'bookName': 'Sefiller',
        'authorName': 'Victor Marie Hugo',
        'year': 1862
    },
    {
        'bookLink': 'deniz-iscileri',
        'bookName': 'Deniz İşçileri',
        'authorName': 'Victor Marie Hugo',
        'year': 1866
    }
];

app.get('/kitap/:name', (req, res) => {
    let bookLink = req.params.name;
    let bookName = 'Kitap Bulunamadı';
    let authorName = 'Yazar Bulunamadı';
    let year = 0;
    // istek parametresinin eşitlendiği bookLink ile aynı olan json dizisindeki eleman filtrelenir
    let filtered = jsonBooks.filter((book) => book.bookLink === bookLink);
    // eğer filtreleme sonucu oluşan dizinin uzunluğu sıfırdan büyükse link dizide mevcuttur
    if (filtered.length > 0) {
        bookName = filtered[0].bookName;
        authorName = filtered[0].authorName;
        year = filtered[0].year;
    }
    res.setHeader('Content-Type', 'application/json');
    res.send({
        kitapAdi: bookName,
        yazarAdi: authorName,
        yil: year
    });
});

app.listen(port, () => {
    console.log('NodeJS ile Express uygulaması çalışıyor...');
});

NodeJS ile Restful API yapmak için json içerik türünde response oluşturabilir, request (istek) içeriğini de json olarak alabilirsiniz.

Request (İstek) Yolu İçerisinde Sorgu Kullanımı

İstek linklerinde sorgu ve parametre arasındaki fark, parametre değerlerinin her zaman olmak zorunda olması, ancak sorgu değerlerinin opsiyonel olmasıdır.

Mesela example.com/url/:param1/:param2 linkinde param1 ve param2 olmak zorundadır.

Ancak example.com/url?param1=val1&param2=val2 linkindeki param1 ve param2 opsiyoneldir. Biri ya da ikisi birden de olmayabilir. Her halükarda example.com/url için bir request çalışacaktır.

Yukarıdaki jsonBooks dizisi içerisinde yazar adına ve kitap adına göre filtreleme yapan bir request oluşturulabilir. Bu sefer bookLink değerleri dizi içerisindeki elemanlarada olmayacaktır.


'use strict';
const express = require('express');
const app = express();
var port = process.env.PORT || 1337;

var jsonBooks = [
    {
        'bookName': 'Anna Karenina',
        'authorName': 'Lev Nikolayeviç Tolstoy',
        'year': 1877
    },
    {
        'bookName': 'Savaş ve Barış',
        'authorName': 'Lev Nikolayeviç Tolstoy',
        'year': 1869
    },
    {
        'bookName': 'Karamazov Kardeşler',
        'authorName': 'Fyodor Mihayloviç Dostoyevski',
        'year': 1881
    },
    {
        'bookName': 'Suç ve Ceza',
        'authorName': 'Fyodor Mihayloviç Dostoyevski',
        'year': 1866
    },
    {
        'bookName': 'Sefiller',
        'authorName': 'Victor Marie Hugo',
        'year': 1862
    },
    {
        'bookName': 'Deniz İşçileri',
        'authorName': 'Victor Marie Hugo',
        'year': 1866
    }
];

app.get('/kitaplar', (req, res) => {
    let queryBook = req.query.kitap;
    let queryAuthor = req.query.yazar;
    // Kitap adı veya yazar adı eşleşen öğeler filtrelenecektir
    let filtered = jsonBooks.filter((book) => book.bookName === queryBook || book.authorName === queryAuthor);
    res.setHeader('Content-Type', 'application/json');
    // Doğrudan filtrelenen değerleri dizi halinde json olarak döndürecektir
    res.send(filtered);
});

app.listen(port, () => {
    console.log('NodeJS ile Express uygulaması çalışıyor...');
});

Sonuç aşağıdaki gibi bir json dizisi olacaktır.

nodejs parameter html request