Adım Adım Nodejs yazı dizimizin bir önceki bölümünde HttpClient oluşturmayı yani bir web sayfasına bağlanmayı ve nodejs üzerinde olay(event) kullanmayı gördük. Bu bölümdede tam tersi Http server oluşturmayı göreceğiz. Yani bilgi alan değil bilgi veren olacağız, bağlanan değil bağlanılan olacağız.
Server oluşturmak için yine nodejs’in http modülünü kullanacağız. İlk örneğimizde server’ımıza bağlananlara o anki saati gösteren bir uygulama yapacağız. Kodlarımıza geçelim:
var http = require("http") var server = http.createServer(function (request, response) { var tarih = new Date(); var formatliTarih = tarih.getDate() + "." + (tarih.getMonth() + 1) + "." + tarih.getFullYear(); formatliTarih += " " + tarih.getHours() + ":" + tarih.getMinutes(); console.log(formatliTarih) response.end(formatliTarih) }) server.listen(8080) console.log("Server Başlatıldı. Tarayıcı üzerinden http://localhost:8080" +" adresinden ulaşabilirsiniz.")
Yukarıdaki kodda çok basit bir server örneği var. Adım adım açıklayalım. İlk satırda http modülünü çağarıyoruz. Bir sonraki satırda http.createServer(…) fonksiyonu ile yeni bir server oluşturuyoruz ve bunu server değişkenine atıyoruz. createServer fonksiyonuna callback fonksiyonu olarak verdiğimiz fonksiyonu inceleyelim. Bu fonksiyon server’a her çağrı yapıldığında çalışır. request ve response olmak üzere iki parametre alıyor. request server’a yapılan istek hakkında bilgi almak için kullanılıyor, response ise yapılan isteğe cevap döndürmek için kullanılıyor. Fonksiyonun ilk satırında bir tarih nesnesi oluşturuluyor. Daha sonraki iki satırda ekrana formatlı olarak tarih yazdırmak için formatliTarih değişkeni oluşturup değerini atıyoruz. Daha sonraki satırda konsol ekranına formatliTarih nesnesini yazdırıyoruz. Bir sonraki satırda response nesnesini kullanarak yapılan isteğe cevap döndüriyoruz. Sonraki satırda yani server.listen(8080) kodu ile oluşturmuş olduğumuz serverı 8080 portu üzerinden başlatıyoruz. Sonraki satırda da konsola serverımızın başladığını haber veren bir yazı yazıyoruz. Bu kadar. Bu kodu çalıştırdığımızda server nesnesi başlamış ve kendisine yapılan her isteğe cevap verebilir halde olacak. Her yapılan istekte callback fonksiyonu çalışacak ve geriye o anki tarih saati bizim belirlediğimiz formatta geri dönderecek. Servera ulaşmak için herhangi bir tarayıcı üzerinden http://localhost:8080 yada 127.0.0.1:8080 yazmamız yeterlidir.
NOT: Konsolda programı çalıştırdığınızda server sürekli çalışacaktır. Kapatmak için CTRL + C tuşlarını kullanabilirsiniz.
Gelelim diğer örneğimize. Bu örneğimizde de geriye bir html dosya içeriğini döndereceğiz. Kodlarımız şu şekilde:
program.js dosya içeriği:
var http = require("http") var fs=require("fs") var server = http.createServer(function (request, response) { fs.createReadStream("ornek.html").pipe(response) }) server.listen(8080) console.log("Server Başlatıldı. Tarayıcı üzerinden http://localhost:8080" +" adresinden ulaşabilirsiniz.")
ornek.html dosya içeriği:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Örnek Html Dosyası</title> </head> <body> <h1>Örnek Html Dosyası</h1> </body> </html>
İki dosya içeriğimizde yukarıdaki gibi. Html dosyasının içeriği basit zaten. Açıklamaya gerek yok. program.js dosyasının içerisine bakacak olursak bir önceki örnekten ilk farklı ikinci satırda fs modülümüzü çağırıyor olmamız. Diğer farklı ise calback fonksiyonu. Callback fonksiyonunda fs modülünün createReadStream fonksiyonunu kullanıyoruz. Bu fonksiyon parametre olarak okuyacağı dosyanın adını alıyor ve bir okuma işlemi başlatıyor. Fonksiyonun devamındaki pipe fonksiyonu ise şu demek. İlk işlemin çıktısını al ikinci işleme ver. İlk işlem yani ornek.html dosyasının okunma işleminin çıktısı yani ornek.html dosyasını al sonraki işlem yani pipe fonksiyonuna parametre olarak verilen response nesnesine ver. Tabi response nesneside dosyayı alıp cevap olarak gönderecek. Cevabı yani html dosyasını alan tarayıcıda html içeriğini işleyip ekranda gösterecek. Kodlarımız bu kadar. Sonuçta yukarıdaki gifte görüldüğü gibi.
Bir sonraki örneğimizde gelen URL’e göre dosya göndereceğiz. Örnek kodlarımız şu şekilde:
var http = require("http") var url = require("url") var fs = require("fs") var server = http.createServer(function (request, response) { var urlObject = url.parse(request.url) if (urlObject.pathname == '/ornek1') { fs.createReadStream('ornek1.html').pipe(response) } else if (urlObject.pathname == '/ornek2') { fs.createReadStream('ornek2.html').pipe(response) } else { fs.createReadStream('ornek.html').pipe(response) } }) server.listen(8080) console.log("Server Başlatıldı. Tarayıcı üzerinden http://localhost:8080" +" adresinden ulaşabilirsiniz.")
Kodlarımıza bakacak olursak kullandığımız 3 tane modülümüz var: http, url ve fs. Sonrasında daha önce öğrendiğimiz server oluşturma işlemini yapıyoruz. Asıl incelememiz gereken yer callback fonksiyonunun içerisi. Callback fonksiyonunun ilk satırında bize gönderilen yani kullanıcının tarayıcıya yazmış olduğu urli parse(ayrıştırma) işlemine alıyoruz ve urlObject değişkenine atıyoruz. Böylece url hakkında herşeye daha sade olarak erişebiliriz. Daha sonrasında basit if deyimleriyle url’ye yazılan değerleri kontrol ediyoruz. Ben burada sadece iki tanesini kontrol ettim. İsterseniz daha fazlada yapabilirsiniz. Hatta isterseniz gelen değerle aynı isimde dosyaları döndürebilirsiniz. Ben basit olması açısından o konulara girmeyeceğim. Bu if ifadelerinin içerisinde de url değerine göre daha önce gördüğümüz gibi kullanıcıya dosya gönderiyoruz. En son else kısmında da geriye kalan her ihtimal için ornek.html dosyasını gönderiyoruz. Bu kadar. Html ve css biliyorsanız artık nodejs ile basit bir site yapabilirsiniz 🙂
Gelelim diğer ve bölümün son örneğine. Bu örnekte bir önceki bölümde kullandığımız hava durumu servisi gibi bir servis yazacağız. Tabi biz hava durumunu bilemeyeceğimiz için daha basit bir servis yazacağız. Bildiğimiz en basit şey tarih/saat. Servisimize /tarih yazınca gün, ay, yıl , /saat yazında saat, dakika, saniye döndüren bir servis yazacağız. Kodlarımız şu şekilde:
var http = require("http") var url = require("url") var server = http.createServer(function (request, response) { var urlObject = url.parse(request.url) var zaman=new Date() if (urlObject.pathname == '/tarih') { var tarih={ yil:zaman.getFullYear(), ay:zaman.getMonth()+1, gun:zaman.getDate() }; response.end(JSON.stringify(tarih)) } else if (urlObject.pathname == '/saat') { var saat={ saat:zaman.getHours(), dakika:zaman.getMinutes(), saniye:zaman.getSeconds() }; response.end(JSON.stringify(saat)) } else { response.writeHead(200, {"Content-Type": "text/html; charset=utf-8"}); response.write("Lütfen saati öğrenmek için /saat ,") response.write("tarihi öğrenmek için /tarih adreslerini kullanınız.") response.end() } }) server.listen(8080) console.log("Server Başlatıldı. Tarayıcı üzerinden http://localhost:8080" +" adresinden ulaşabilirsiniz.")
Kodlarımızı incelediğimiz zaman genel olarak bir önceki örnek ile aynı. Farklı tarafı callback fonksiyonu içerisindeki if yapısı. Bir önceki örnekteki gibi gelen url bilgisini kontrol ederek işlem yapıyoruz. Eğer url /tarih ise tarih adında bir nesne oluşturuyoruz. İçerisine yil, ay, gun değişkenlerini ve değerlerini giriyoruz. Daha sonra JSON.stringify(…) ile nesnemizi json’a çeviriyoruz ve response.end(…) ile dönüştürmüş olduğumuz değişkeni geri döndürüyoruz. Sonraki else if kod bloğunda url /saat ise yeni bir saat değişkeni oluşturup içerisine saat, dakika, saniye değişkenleri ve değerlerini yerleştiriyoruz. Ve json nesnesine çevirip kullanıcıya döndürüyoruz. Ve son else bloğunda ise kullanıcı bu iki url dışında herhangi birşey yazmışsa veya boş bırakmışsa kullanıcıya bilgilendirme metni yolluyoruz. İlk olarak response.writeHead(…) fonksiyonu ile yollayacağımız metnin türünü ve kodlama standardını belirtiyoruz. Bu kodları eklemez isek Türkçe karakter problemi yaşayabiliriz. Daha sonraki iki satırda response.write(…) fonksiyonu ile kullanıcıya bilgilendirme yazısı yolluyoruz. İstersek bunu tek satırda da yollayabiliriz. Son olarakta response.end() ile işlemlerimizi bitirip kullanıcıya yaptığımız işlemleri döndürüyoruz. İşte bu kadar. Artık önceki bölümdeki gibi başkalarının kullanabileceği bilgilendirici API servisleri yapabiliriz.
Bir sonraki bölümde express framework kullanımına başlayacağız.
Makalede kullanılan kodlara buradan ulaşabilirsiniz.