MongoDB, NodeJs ve ExpressJs ile API Yazma Part 1

Emre Can Erol, Web Development
Back

Merhabalar. Bugün Sizlere MongoDB ve bir NodeJs frameworkü olan ExpressJs ile nasıl GET/POST/DELETE içeren bir API yazacabileceğinizi göstereceğim. PUT komutu bir sonraki yazımda olacak. Bunun sebebiyse bu yazının 2. partını spesifik bir özellik baz alacak işlemlere ayırmamdır. Dilerseniz başlayalım.

Bu projede kullandığım araçlar

  1. Postman
  2. Robo3T (MongoDB GUI)
  3. Visual Studio Code
  4. Hyper Terminal

İlk önce terminalimi açarak masaüstümde bir klasör açıyorum ve ardından o klasöre geçiş yapıyorum

Image description

Ardından touch app.js komutuyla kodlarımı yazacağım js dosyasını oluşturuyorum. Daha sonra ise npm init -y yazarak soracağı tüm sorulara "yes" diyerek hızlı bir kurulum gerçekleştiriyorum

Image description

Sırada gerekli paketleri indirmek ve bunları app.js'te import etmek var:

Image description

Image description

Ardından Robo3T GUI çalıştırıyorum. Burada bağlantınız yoksa sol üstte create ile oluşturabilirsiniz. Ben var olan connection ile devam edeceğim ve database'imi burada oluşturacağım.

Image description Image description

Database adını movieDB olarak verdim. Ardından hazır dataları bulunduracak bir collection oluşturuyorum ve Insert Document ile datalarımı giriyorum

Image description

Image description

Image description

Daha sonra terminalimde yeni bir sekme açıyorum. Buraya ise mongod yazarak çalıştırıyorum.

Image description

Image description

Bu komutla bağlantımı terminal üzerinden aktif hale getirdim. Şekilde de görebileceğiniz gibi bağlantım 27017 portunda aktif halde.

Image description

Bu sefer de app.js'i server üzerinde ayağa kaldıracak fonkisyonu yazıyoruz. app.listen() bizden uygulamanın çalıştırılacağı portu istiyor. Bunun yanında konsola çalıştığını belirten bir mesaj yazdıracak bir fonksiyon ekliyoruz. Dilerseniz doğrudan 3000 yerine process.env.PORT || 3000 yazarak sistemin belirleyeceği portu, aksi halde 3000'i kullanacak şekilde de yazabilirsiniz bu fonksiyonu

app.listen(3000, ()=> {
    console.log("Server started on port 3000");
})

Şimdi database bağlantımızı kod üzerinde oluşturalım.

mongoose.connect("mongodb://localhost:27011/movieDB") 

Şimdi ise db üzerinde oluşturduğumuz yapıyı koda döküyoruz. Bu sayede yeni bir data göndermek istediğimizde bu yapı referans alınacak.

const movieSchema = new mongoose.Schema({
    name:String,
    rate: Number
})
const Movie = mongoose.model("Movie", movieSchema);

Bu kod ne işe yarar? Burada Movie ile database modeli oluşturuyoruz. Bu da database'de movies'e denk geliyor. MongoDB Movie => movies çevrimini yapıyor. Bu model ikinci bir parametre olarak Schema alıyor. Bu ise modele gidecek objenin özelliklerini belirtir. Bunu POST metodunda göreceğiz..

Artık GET fonksiyonunu ve diğer fonksiyonları yazabiliriz.

GET

app.get("/movies", function getAllMovies(request,response){
    Movie.find(function(err, allMovies){
        if(!err){
            response.send(allMovies)
        } else {
            console.log(err);
        }
    })
})

app.get() metodu iki parametre almakta. Bunlardan ilki bizim endpointimiz. Yani biz uygulamayı ayağa kaldırdığımızda localhost:3000/movies adresine gittiğimizde bu fonksiyonun yaptığı işlemi görüntüleyeceğiz. Bir diğer parametre ise fonksiyonumuz. Bu fonksiyon bir request = istek, response = yanıt parametreler alıyor. Bu getAllMovies fonksiyonu biz endpointe gittiğimizde bir işlem gerçekleştirecek ve bunun sonucunu app.get() aracılığı ile göreceğiz.

Movie.find bir mongodb sorgusudur. Mongoose ise bize Schema yapısı oluşturarak modelleme noktasında yardımcı olur. Bu içerisine parametre olarak fonksiyon aldı ve bu fonksiyon 2 parametre içeriyor: err, allMovies. Bu fonksiyonun içerisinde ise öncelikle bir error kontrolü yapıyoruz. Eğer hata yoksa response.send(allMovies) ile bulduğumuz dataları ekrana döndürüyoruz. Yani err bizim hata kontrol parametremizken ikinci parametre olan allMovies Movie.find() ile databaseden çekilen tüm data oluyor.

Gelin bu metodu test edelim. Terminal aracılığıyla serverımı ayağa kaldırıyorum

Image description

Ardından Postman ile API testlerime başlıyorum. Önce metot olarak GET metodunu seçiyor ve URL kısmına serverımın localhostta ayağa kalktığı portu yazıyorum ki bu da localhost:3000. Peşine de GET metodumun istek yapacağı endpointi yazıyorum ve Send butonuna tıklıyorum

Image description

Dönen sonucumda status:200 ibaresini ve dataları görüyorum. Status 200 yanıtın başarılı şekilde gerçekleştiğini gösterir. Bu sayede ben dönen datalarımı da görüyorum

Image description Image description

POST

app.post("/movies", function postMovie(request,response){
    const newName = request.body.name;
    const newRate= request.body.rate;

    const newMovie = new Movie({
        name:newName,
        rate: newRate
    })

    newMovie.save(function errorHandling(err){
        if(!err){
            response.send("Added")
        } else {console.log(err);}
    })
})

POST metodunun da istediği parametreler GET ile aynı. Fakat burada biz database'imize yeni bir movie objesi yollayacağımız için yapmamız gereken bir kaç işlem dizisi var. Öncelikle biz herhangi bir UI'a sahip olmadığımız için gireceğimiz dataları yakalamamız için farklı bir yol izlemeliyiz.

 const newName = request.body.name;
  const newRate= request.body.rate;

Bu kod parçası yollanan istekteki name ve rate propertyl'erini yakalayarak değişkenlere kaydediyor. Bu sayede biz Movie modelimize yeni bir obje oluştururken objemizin istediği name ve rate property'lerine, istek üzerinden yakaladığımız değerleri verebiliyoruz.

newMovie adında yeni bir objeyi, Movie modelimi baz alarak oluşturuyorum. Bu sayede benim objem iki property'e sahip oluyor: name ve rate. Hatırlarsanız database'e elle girdiğimiz veriler de bu şekildeydi. Daha sonra bu objemizi save() metodu ile database'e ekleyebiliyoruz. Eğer bir hata yoksa response.send("Added") ile mesajı döndürüyoruz. Gelin kontrol edelim.

Image description

Metot olarak POST seçiyorum. Ardından Body sekmesine tıklıyorum ve x-www-form-urlencoded seçeneğini işaretliyorum. Burada database'e göndereceğim yeni objemin name ve rate propertileri key, bu propertylerin içeriği ise value oluyor. Ardından Send butonuna tıklıyoruz ve karşımıza Added mesajı geliyor.

Image description

Şimdi kontrol vakti. Database'imizdeki modelimizi yeniliyoruz ve movies collectionuma sağ tıklayarak show documents seçeneğini seçiyorum. Bu da bize var olan tüm dataları getirecek. İlk başta 3 data eklemiştik ve yeni eklediğimiz data ile beraber 4 data görmemiz gerekiyor

Image description

Image description

Gördüğünüz gibi başarıyla ekledik.

DELETE

Peki gelelim tüm dataları nasıl silebileceğimize

app.delete("/movies",function deleteAllMovies(request,response){
    Movie.deleteMany(function errorHandling(err) {
        if(!err) {
            response.send("Deleted")
        } else {console.log(err);}
    })
})

deleteMany() o modele denk gelen collectiondaki tüm dataları silmemizi sağlıyor.

Postmande DELETE metodunu seçerek Send butonuna tıklıyorum

Image description

Deleted response'unu aldık Image description

Database'imizi tekrar yeniler ve view documents seçeneğini seçersek herhangi bir data bulamayacağız.

Image description

Vakit ayırıp okuduğunuz için teşekkürler. Umarım faydalı olmuştur

© Emre Can Erol.