Membangun Microservices sederhana dengan PHP, NodeJS dan Docker – Bagian 3 (Product Service)

Membangun Microservice Sederhana dengan PHP NodeJS dan Docker

Assalamu’alaikum Wr, Wb. Pada artikel ini kita akan fokus membuat Product Service, Service ini akan Menggunakan NodeJS dan MongoDB sebagai database nya. Alasan admin menggunakan NodeJS dan mongoDB yaitu admin ingin menunjukan keberagaman dalam membangun suatu microservices. Tidak ada aturan yang baku mengenai bahasa pemrograman maupun database yang akan kalian pakai. Pilih lah bahasa pemrograman dan database yang cocok untuk mengandle logic yang ada pada Service yang akan dibuat.

Installasi

Kali ini kita akan menggunakan Framework nodejs yang cukup populer yaitu ExpressJS, Pastikan kalian sudah menginstall NodeJS dan MongoDB ya.

Seperti yang kita bahas pada artikel sebelumnya bahwa struktur folder yang kita buat seperti ini :

~/Documents/code/microservices/
- authentication
- products

untuk memulai installasi kalian tinggal pindah ke folder ~/Documents/code/microservices/ kemudian ketik command dibawah ini :

npx express-generator products

Maka folder products akan terbuat beserta file – file yang dibutuhkan untuk membuat service products, jika kalian menemukan masalah pada saat installasi, silakan buka dokumentasi resmi disini.

Ketik perintah ini untuk memastikan aplikasi Express kalian berjalan

npm run start

Membuat Endpoint

PENTING : Perlu kalian ketahui bahwa beberapa service harus memiliki middleware untuk menghandle JWT Token, simple nya setiap service harus bisa memvalidasi apakah token yang dikirimkan dari User masih berlaku atau tidak, ini berlaku pada setiap service yang akan di diakses oleh user. Dan juga setiap service yang memakai middleware JWT diharuskan memakai JWT_SECRET key yang sama.

Kita akan mengambil contoh kasus dimana pada service ini terdapat dua endpoint yaitu, seperti pada artikel sebelumnya bahwa /products akan diarahkan ke Service Products jadi kita buat nya / dan /seeder saja.

# End Point ini akan dibuat public
/products
# End Point berfungsi sebagai seeder yang nantinya akan mengisi data products di database dan endpoint ini akan dibuat secure
/products/seed

Supaya service kita dapat menghandle token dan juga supaya service kita dapat terkoneksi dengan mongodb, tentunya kita butuh yang namanya packages untuk mempermudah. Sisipkan packages berikut di packages.json

"dependencies": {
    ....
    "jsonwebtoken": "^8.5.1",
    "mongoose": "^5.7.13",
    ....
  }

Setelah itu tentunya kita membutuhkan namanya file konfigurasi untuk menyimpan variable seperti konfigurasi database, dan JWT_SECRET. Buat file di config/keys.js kemudian sisipkan script berikut :

module.exports = {
    mongoURI: process.env.MONGO_URL || "mongodb://root:[email protected]:27017/data?authSource=admin",
    jwtSecret: process.env.JWT_SECRET || "SuperSecretKey**2019"
};

Selanjutnya kita akan membuat model untuk data Product kita, buat file models/Product.js dan sisipkan script berikut :

const mongoose = require("mongoose");
const schema = mongoose.Schema;

const ProductSchema = new schema({
    name:{
        type: String,
        required: true
    },
    price:{
        type: Number,
        required:true
    },
    created_at:{
        type: Date,
        default:Date.now
    }
});

module.exports = Product = mongoose.model("products", ProductSchema);

Kemudian kita akan membuat routes nya, edit / buat file routes/index.js dan sisipkan script berikut :

var express = require('express');
var router = express.Router();
let Product = require("../models/Product"); 
let config = require("../config/keys")






/**
 * The Middleware
 */

// a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path
router.use('/seed', function (req, res, next) {
  console.log(config.jwtSecret)
  let token = req.headers['Authorization']; // Express headers are auto converted to lowercase
  if(token == undefined){
    res.status(403).json({
      message: "Please provide token",
      status_code: 403
    })
  }else{
    if (token.startsWith('Bearer ')) {
      // Remove Bearer from string
      token = token.slice(7, token.length);
    }

    
    if (token) {
      jwt.verify(token, config.jwtSecret, (err, decoded) => {
        if (err) {
          res.status(403).json({
            message: "Invalid token",
            status_code: 403
          })
        } else {
          req.decoded = decoded;
          next();
        }
      });
    } else {
      res.status(403).json({
        message: "Please provide token",
        status_code: 403
      })
    }
  }
  
})
router.get('/seed', function(req, res, next) {
  let data = [];
  let length = 100; // user defined length

  for(let i = 0; i < length; i++) {
     new Product({
       name: "Product name " + i,
       price: 15000
     }).save().then(() => console.log("Success"))
  }
  res.send(`Seeding ${length} complete`)
});
/**
 * Get Products list
 */
router.get('/', function(req, res, next) {
  Product.find({}, function(err, results) {
    res.send(results)
  })
});


module.exports = router;

Kemudian kita edit file app.js dan sisipan script berikut :

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

// MongoDB
const db = require("./config/keys").mongoURI;
const mongoose = require("mongoose");
console.log(db)
mongoose
    .connect(db, {useNewUrlParser: true, auth:{authdb:"admin"}})
    .then(() => console.log("mongoDB Connected"))
    .catch((err) => {
      console.log(err)
      process.exit(1)
    });

module.exports = app;

Oke sampai saat ini kita sudah berhasil membuat service products. PS : Admin anggap kalian sudah mengerti ya dalam pembuatan API menggunakan NodeJS karena disini admin hanya memberikan contoh service sederhana, Kalau kalian ingin berkreasi dengan contoh kasus lain silakan.

Okay, saat nya kita mencoba.

Buka aplikasi Postman kemudian coba hit di endpoint http://localhost:3000/. Kalian pasti akan mendapatkan response array kosong karena kita belum melakukan seeder database. untuk melakukan seeder database kalian kunjungi http://localhost:3000/seed.

Dan pastinya kalian akan mendapatkan response seperti ini :

{
"message": "Please provide token",
"status_code": 403
}

Jadi mekanisme nya adalah, kalian harus mengambil JWT TOKEN ke service Authentication yang telah kita buat sebelumnya, kemudian Ambil token tersebut dan kirimkan bersamaan dengan request untuk melakukan seeder. (Pastikan JWT_SECRET nya sama ya).

Jika ada kendala jangan sungkan untuk tanya ke admin lewat sosial media yang ada diatas. Tutorial ini disimpan di Repository github saya, kalian bisa buka disini : https://github.com/tarikhagustia/microservice_example

Sekian dan terimakasih, Wassalamu’alaikum Wr. Wb.

Facebook Comments
Default image
Tarikh Agustia
Saya adalah seorang yang tertarik dibidang teknologi dan informasi, khususnya dalam software engineering, penyuka kopi juga tapi bukan kopi senja, kopi apa aja yang penting bisa diseduh. pokonya kalo yang Mantap - Mantap saya suka aja sih.