MongoDB, NodeJs ve ExpressJs ile API Yazma Part 1
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
- Postman
- Robo3T (MongoDB GUI)
- Visual Studio Code
- 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
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
Sırada gerekli paketleri indirmek ve bunları app.js'te import etmek var:
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.
Database adını movieDB olarak verdim. Ardından hazır dataları bulunduracak bir collection oluşturuyorum ve Insert Document ile datalarımı giriyorum
Daha sonra terminalimde yeni bir sekme açıyorum. Buraya ise mongod yazarak çalıştırıyorum.
Bu komutla bağlantımı terminal üzerinden aktif hale getirdim. Şekilde de görebileceğiniz gibi bağlantım 27017 portunda aktif halde.
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
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
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
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.
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.
Ş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
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
Deleted response'unu aldık
Database'imizi tekrar yeniler ve view documents seçeneğini seçersek herhangi bir data bulamayacağız.
Vakit ayırıp okuduğunuz için teşekkürler. Umarım faydalı olmuştur
© Emre Can Erol.