Amazon Web Services (AWS) ile MongoDB bağlantısı ve ExpressJS API ile CRUD işlemleri – 2

Amazon Web Services makalemizin 2. kısmında MongoDB bağlantısı kuracağız ve ExpressJS ile API mizde create,read,update,delete işlemleri yapacağız. Eğer bu geliştirmenin ilk makalesini incelemediyseniz Amazon Web Services (AWS)’e GitHub taki Node.js’i AWS Pipeline ile Deploy edelim -1 bu makaleyi ilk önce incelemeniz de fayda var çünkü bu makalenin devamı olacak.

MongoDB Free hesapta 512 MB lık bir alanı ücretsiz olarak veriyor. Şimdilik örneklerimiz ve ilk çalışmalarımız için yeterli bir alan. Daha detaylı fiyatlandırma politikasına aşağıdaki linkten inceleyebilirsiniz.
https://www.mongodb.com/pricing

Geliştirmeye Başlayalım

1) MongoDB hesap oluşturma

a) https://www.mongodb.com/try adresinden free bir hesap oluşturun (Amazon Web Services ‘te kullandığınız mail adresi ile kayıt olmayı unutmayın.)

b) Shared Clusters ı seçip. Create Cluster oluşturun.

c) Cluster i oluşturmak için aws seçin, bölge istediğinizi seçebilirsiniz ben Ireland’ı seçtim ve Custer Name girebilirsiniz ben cihankarsak girdim ve Create Cluster butonuna tıklayın. (AWS de Ireland bölgesini seçmiştim, MongoDB de AWS de Ireland bölgesini seçmenin bazı free avantajları oluyor.)

d) Cluster’ın oluşması bir kaç dakika sürecektir.

Cluster’ımız oluştuktan sonra, Collections butonu yanındaki menüden Load Sample seçeneği ile 350MB lık örnek tablo ve datalar ile MongoDB database’imizi doldurabiliriz. Bununda doldurulması bir kaç dakika sürebilir.

e) Oluşturulduktan sonra Collections butonu tıklayarak Database içindeki kayıtlarımıza bakabiliriz.

Collections altında farklı özellikler de mevcut, RealTime,Metrics,Profiler vs. fakat bunların bazıları free kullanım için kapalıdır.

f) Şimdi soldaki menü de Security başlığı altındaki Database Access altında bir database erişimi için kullanıcı oluşturalım. Add New Database User butonu ile bir kullanıcı oluşturalım. Bizim Free MongoDB hesabımız M0 oldğu için sadece klasik şifre (Password ü seçin) yöntemini seçerek ilerleyeceğiz. Şifremizi ve tekrarını girdikten sonra okuma ve yazma özelliğini (Read and write to any database) de seçip Add User butonuna tıklayalım.


g) Local servisimizi ayağa kaldırdığımız da bilgisayarımızından Mongodb Cloud’a erişebilmek için izin yetkilerine bilgisayarımızın ip’sini eklemeliyiz. Soldaki menüde Security başlığı altındaki Network Access seçeneğini seçelim.


https://whatismyipaddress.com/ den internet çıkış ip adresimize öğrenip. ADD IP ADDRESS butonu ile ekleyiniz.(Localinizden test yaparken Static bir IP niz yok ise, Ip niz her değiştiğinde burayı güncellemeyi unutmayın.)

IP adresimizi eklememiz API mizi localimiz de ayağa kaldırdığımızda MongonDB ye erişebilmesi için. AWS için aynı mail adresi ile oluşturduğunuzda sorun olmayacaktır.


Farklı AWS ye veya Google Cloud, Azure gibi ortamlara erişim için ise yine aynı Network Access altında Preeing Connection oluşturabiliyorsunuz. Fakat Free hesapta bunların sınırlaması var. Örneğin Günlük connection sınırı veya Transfer edilen data sınırlaması gibi.

Peering Connection oluşturmayı https://www.cihankarsak.com/blog/2020/06/15/mongodb-aws-amazon-web-services-vpc-peering-baglanti/ makalesinde paylaştım, daha detayını burdan öğrenebilirsiniz.

2) Command Prompt’u administrator olarak çalıştırın. Daha sonra npm install body-parser komutunu Command Prompt da çalıştalım. (body-parser ile http isteklerini json halde kullanmamızı sağlayan yardımcı bir kütüphanedir.)

Örnek kullanımı;

var bodyparser = require('body-parser');

var urlencoded = bodyparser.urlencoded({extended:false}); -- form verisi false, true da json formatlı gönderebilirsiniz.

3) Command Prompt da npm install mongoose komutunu çalıştırarak mongoose’u ekleyelim. MongoDB connection’ımızı ve database deki data şemalarımızı mongoose ile yapacağız, yani bir Object Data Modeling (ODM) aracıdır. (mongoose kısaca node.js için mongodb nesne modellemesi için kullanılıyor https://mongoosejs.com/ ve Nick Karnik’in çok güzel detaylı anlattığı https://www.freecodecamp.org/news/introduction-to-mongoose-for-mongodb-d2a7aa593c57/ adresini inceleyebilirsiniz)

4) user.js isminde bir javascript dosyası oluşturalım.

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var userSchema = new Schema({
    name: String,
    email: String, 
    createDate: Date
});

/**
 * Save komutunda önce çalış ve create Date'i setle
 */
userSchema.pre('save',function (next){
    var cDate = new Date();
    this.createDate = cDate;
    next();
})

var User = mongoose.model('User',userSchema);

module.exports = User

5) app.js e aşağıdaki kodlarımızı ekleyelim.

//Mongoose 'ı ekledik
var mongoose = require('mongoose');


const uri = 'mongodb+srv://testUser:Test1234@cihankarsak.exgxd.mongodb.net/';

mongoose.connect(uri, {dbName: 'testDB'}).then( () => {
  console.log('Atlas Cluster a baglantimiz basarili!')
})
.catch( (err) => console.error(err));

6) Ayrıca app.js e aşağıdaki CRUD methodlarımızı da ekleyelim.

/**
 * Body Parser
 */

/* BodyPaser*/
var bodyparser = require('body-parser');
var urlencoded = bodyparser.urlencoded({extended: false});

/* CRUD Fonksiyon Örneklerimiz */
/**
 * User Create edelim
 */
app.post('/create_user',urlencoded,(req,res) => {
  var user = new User({
    name: req.body.name,
    email:req.body.email
  });
  
  user.save().then(() => {
    console.log('kayit başarili');
    res.send(req.body.name + " isimli User kayit edildi");
  })
  .catch( (err) => res.send(error + " hatası alındı") );
})

/**
 * Read : İsme göre kayıtları listeleyelim
 */
app.post('/getUserList',urlencoded,(req,res) => {
  User.find({},(err,user) => {
    if (err){  
      throw err;
    }
    res.send(user);
  }).sort('name');
})

/**
 * Read : İsme göre kayıt getir
 */
app.post('/getUserByName',urlencoded,(req,res) => {
  User.find({name:req.body.name},(err,user) => {
    if (err){  
      throw err;
    }
    res.send(user);
  }).sort('name');
})


/**
 * Read : Id ye göre getir
 */
app.post('/getUserById',urlencoded,(req,res) => {
  User.findById(req.body.id,(err,user) => {
    if (err){  
      throw err;
    }
    res.send(user);
  })
})

/**
 * Read : Email adresine göre kayıt getir
 */
app.post('/getUserByWhereEmail',urlencoded,(req,res) => {
  User.find({},(err,user) => {
    if (err){  
      throw err;
    }
    res.send(user);
  }).where('email').equals(req.body.email);
})

/**
 * Read : Email adresi aynı olan kayıtlardan sadece bir tane kayıt getir
 */
app.post('/getUserByWhereEmailLimit',urlencoded,(req,res) => {
  User.find({},(err,user) => {
    if (err){  
      throw err;
    }
    res.send(user);
  }).where('email').equals(req.body.email).limit(1);
})

/**
 * UPDATE: Email adresi aynı olan kayıtlardan sadece bir tane kayıt getir
 */
app.post('/updateUser',urlencoded,(req,res) => {
  User.findById(req.body.id,(err,data) => {
    if (err){  
      throw err;
    }
    var oldName = data.name;
    data.name=req.body.updateName
   
    data.save((error) => {
      if (error){  
        throw error;
      }
      res.send(oldName + " isimli User ismi, " + req.body.updateName + " ismi ile güncellendi");
    });
  });
})


/**
 * DELETE: Email adresi aynı olan kayıtlardan sadece bir tane kayıt getir
 */
app.post('/deleteUser',urlencoded,(req,res) => {
  User.findById(req.body.id,(err,data) => {
    if (err){  
      throw err;
    }
    var deletedData = data;
    data.remove((error) => {
      if (error){  
        throw error;
      }
      res.send(deletedData.name + " isimli User silindi");
    });
  });
})

7) Command Prompt’ta nodemon app.js komutu ile uygulamamızı local de ayağa kaldıralım. MongoDB ye bağlanti başarili yazısını Command Prompt gördükten sonra Postman üzerinden örnek testler yapalım ve MongoDB collection üzerindenki testDB mizde kayıtlarımızı gözlemleyelim.

Tabi bu makale çok uzun olmaması için tüm örneklemeleri yapamıyoruz, diğer mongoose methodları için bu linkten faydalanabilirsiniz. https://mongoosejs.com/docs/middleware.html

8) Şimdi AWS’e publish ederek servisimizin nasıl çalıştığını kontrol edelim.

  • package.json içerisindeki “version”: “1.0.0” değerini artır
  • npm install
  • git add .
  • git commit -m “comment’i gir”
  • git push origin master

Health’ile AWS üzerinde geliştirmemiz başarılı olduktan sonra artık localhost:8081 yerine http://nodejsv1-env.eba-iv7ar4xf.eu-west-1.elasticbeanstalk.com/  adresimizi kullanarak Postman deki testlerimizi yapabiliriz.

Umarım yararlı olmuştur. Github taki https://github.com/cihankarsak/nodejs_v1.git adresinden örneği inceleyebilirsiniz. DB kullanıcısını ben güvenlik için sileceğim 😀

Not:

Eğer aşağıdaki hataları alıyorsanız, altındaki çözümleri uygulayınız

1. Hata: MongoNetworkError: failed to connect to server [xxxxx.mongodb.net:27017] on first connect [MongoNetworkError: connection 5 to xxxxxxx.mongodb.net:27017 closed

1. Çözüm :

https://cloud.mongodb.com/ de, Network Access mensune IP adresinizin doğru eklendiğini kontrol edin. (https://whatismyipaddress.com/ den dışarı çıkış IP ni görebilirsin.)

2. Hata:

504 Gateway Time-out mongodb nginx/1.16.1 hatası alıyorsanız

2. Çözüm : Amazon VPC ve MongoDB Peering Connection ekleyebilirsiniz. Detaylı anlatımını https://www.cihankarsak.com/blog/2020/06/15/mongodb-aws-amazon-web-services-vpc-peering-baglanti/ makalesini inceleyerek uygulayabilirsiniz.

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir