Örnek Uygulama – Servisler

Daha önce hazırlığını yaptığımız ve modellerini oluşturduğumuz Profile.me projesinin bu sefer servislerini yazacağız ve route işlemlerini gerçekleştireceğiz. Anlayacağınız yavaş yavaş backend tarafından kurtulup frontend tarafına doğru ilerleyeceğiz. Bu kısımda express framework’une giriş yapmaya başlıyoruz.node_js_full_servisler

Örnek Uygulama: Profile.me

  1. Hazırlık
  2. Modellerin oluşturulması ve MongoDB Bağlantılarının yapılması
  3. Servislerin yazılması
  4. Serverside rendering ile sayfaların oluşturulması

3. Servislerin Yazılması

Bildiğiniz üzere veritabanı işlemlerini halledeceğimiz modelimizi oluşturduk. Fakat dikkatinizi çektiyse bu model yapısıyla Java ya da başka nesneye yönelik dillerdeki model yapısı farklı. Ben iş yerimde kurumsal java geliştiren biri olarak, servislerin yazılmasına geçmeden önce, Java’da alışık olduğumu model ve servis yapısıyıla node.js üzeirndeki servis yapısını karşılaştırmak istiyorum.

3.1 Servis Katmanı: Java vs Node.js

Java uygulamasında veritabanı ya da başka veri alış verişi işlemleri için katmanlı yapılar kullanılır. İster JSF uygulaması geliştirin ister Web Servis uygulaması veritabanı erişimlerinde hemen hemen aynı katman yapısı kullanılır. Model’lerimiz (ki kurumsal java dilinde entity olarak geçmektedir) en temel yapımızdır. Doğrudan veritabanı tablolarının nesne olarak gösterildiği hali olarak düşünebiliriz. Bunların hemen sonrasında CRUD ya da listeleme işlemlerinin yapıldığı DAO katmanı yer almaktadır. Bu katmandan sonra uygulama mantığının yerleştirildiği, kontrollerin yapıldığı katman yani servis katmanı gelemektedir. Veriler servis katmanı üzerinen okunur ya da yazılır. Ama verinin ne şekilde gösterileceğine karışılmaz. İster web servislerde kullanılar ister ara yüzde hatta isterseniz masaüstü uygulamanız da.

Node.js’e baktığımda ne yazık ki bu katmanlı yapı Java’daki kadar net değil. Hatta iç içe geçmiş durumda. Örneğin DAO katmanı ile Model katmanı Node.js’de bir arada bulunmakta. Bir önceki adımdan hatırlayın, model nesnemizi aynı sınıf üzerinden oluşturuyor, aynı sınıf üzerinden kaydediyor ve aynı sınıf üzerinden okuyoruz. Yine aynı şekilde Servis katmanıda verinin ne şekilde gösterileceği ile iç içe geçmiş durumda. Yine web servis ya da ara yüz olarak göstereceğiniz tam olarak belirlenmiş değil, esas belirlenmiş olan bu isteğin daima web üzerinden geldiği.  Express’in de web uygulaması geliştirmek için kullanıldığı düşünülecek olursa bu gayet mantıklı bir yaklaşım oluyor. Bir sonraki bölümde göreceğiz, jade uygulamamıza girdiğimizde, servis katmanı, sayfalarımızın render edilmesinden de sorumlu hale gelecek.

Ayrıca servisler java da olduğu gibi context içerisinde tanımlanmamaktadır. Node.js’de servisler web istekleri gibi davrandıklarından hepsinin kendine ait bir URL biçimi bulunmaktadır. Parametrelerini methodlar gibi değil bu URL’ler üzeirnden almaktadırlar. Bu sebepten bu sınıflar node.js ve diğer çoğu sciprt dilinde, servis olarak değil route olarak isimlendirilmiştir.

Bu kadar ön bilgi ve karşılaştırmadan sonra artık servislerimizi tasarlayabiliriz.

3.2 ilk Servisin yazılması

Servislerin URL tabanlı olduklarından ve scipt dillerinde route olarak isimlendirildiğinden bahsettik. Önceki yazımızda kaydetme işlemini yapan fonksiyonumuzu ayrı bir servis sınıfına çıkaralım ve route tanımlamalarını yapalım.

Bunun için öncelikle projemizin ana dizininde ki routes klasörüne gelip, içerisini boşaltıyoruz. Tüm bu sınıflar, ilk bölümde, projemizi oluştururken WebStorm tarafından bizim için oluşturulmuştu. Daha sonra bu klasörde, portfolioRoute.js dosyasını oluşturuyoruz. Sonra içerisine ilk servis fonksiyonumuzu saveExampleData’yı oluşturuyoruz. Son olarak bir önceki bölümde yazdığımız kaydetme fonksiyonumuzu kopyalıyoruz.

portfolioRoute.js

Daha sonra app.js içerisinde “/” olarak atadığımız fonskyionu silip yerine portfolioRoute.js içerisinde tanımladığımız saveExampleData fonksiyonunu atıyoruz.

app.js

Şimdi app.js dosyasını çalıştırıp, uygulamamızı http://localhost:3000 adresinden test edebiliriz. Adrese gittiğimzide beklediğimiz gibi veritabanına kaydetmeye çalışırken hata verecektir. Hatanın sebebi bizim modelimizi tanımlarken username kısmını tekil olarak tanımlamamızdı. Veritabanı temizleyip tekrar denerseniz hata vermediğini görürsünüz.

İlk servisimizi başarıyla oluşturduk. Umarım servis oluşturmanın ve route tanımlamanın ne kadar kolay olduğu dikkatinizi çekmiştir. Bir post metoduyla JSON nesnesi alıp veritabanına kaydederken çok zorlanacağınızı düşünmüyorum.

3.3. Servislerin Gelistirilmesi

Bizim amacımız kişiye özgü, kullanıcıların portfoliolarının da gösterileceği bir profil sayfası geliştirmek. Bunu için kullanıcıların portfoliolarına kullanıcı adı üzerinden erişilmesi mantıklı olacaktır. Bu durumda tahmin edebileceğiniz gibi aşağıdakine benzer bir url kullanılması mantıklı olacaktır.

  • http://localhost:3000/jdCruz yani http://localhost:3000/username

Arayüz kısmına bir sonraki bölümde geçtiğimizde, bu url’in sonuna başka eklentiler getirerek hangi sayfanın render olacağına da karar vereceğiz. Fakat şimdilik sadece veritabanından ilgili json nesnemizi çekip ekrana basacağız.

Bunu yapmak için yine portfolioRoute.js dosyamıza gidiyoruz ve yeni bir method tanımlıyoruz.

portfolioRoute.js

Burada dikkat çekmek istediğim bir iki yer olacak.

  • Öncelikle username parametresini nasıl aldığımıza dikkat etmenizi istiyorum. Bu tip fonksiyonların parametrelerini almak bu kadar basit. Fakat parametrenin ne tür olacağına burada değil route tanımını yaparken karar veriyoruz. Yani ister query parametresi olarak ister url parametresi olarak verilebilir. Fakat biz route tanımını yaparken yukarıda belirttiğimiz gibi yani URL parametresi olarak vereceğiz.
  • Ayrıca gördüğünüz gibi JSON ve nesne dönüşümleri çok kolay. Normal Javascript içerisinde olan bu tip fonksiyonları node.js içerisinde de rahatlıkla kullanabiliyoruz.
  • Tüm veritabanı işlemlerini Model üzerinden yaptığımızı giriş kısmında söylemiştiki. Node.js ve diğer script dillerinde genelde Model ve DAO katmanı iç içe bulunmaktadır.

Servis fonksiyonumuzu tanımladıktan sonra bu fonksiyonun route atamasını yapabiliriz. Bunun için tek yapmamız gereken  app.js dosyasını aşağıdaki şekilde güncellemek.

app.js

Bunu ekledikten sonra, uygulamamızı başlatıp http://localhost:3000/jdCruz adresine gittiğimizde verimizi JSON formatında görebileceğiz.

Son

Servislerin tanımlanması bölümümüzün de sonuna geldik. Bir sonraki bölümde, Jade kullanarak sayfalarımızı nasıl oluşturacağımıza bakacağız. Bunu yaparken yeni servisler ve route’lar tanımlayacağız.

End Of Line