Belajar Membuat Web Menggunakan Framework Express JS (Part 3) - CRUDPRO

Belajar Membuat Web Menggunakan Framework Express JS (Part 3)


Di bagian part 3 ini penulis akan share cara menggunakan migrations, seeder dan models pada framework Express JS. Fitur ini sudah tidak asing lagi bagi kita yang awalnya adalah programmer laravel dan beralih ke node js, dan pastinya kita akan memerlukan kedua fitur ini saat tahap development.

Dan tentunya di Node JS sendiri sudah tersedia paket untuk menggunakan migration dan seeder tersebut.

Apa itu Migrations?

Migrations merupakan sebuah fitur atau paket schema builder yang berguna untuk mempermudah pemrogram dalam membuat skema database ketika terdapat perubahan dalam database.

Apa itu Seeder?

Seeder merupakan sebuah fitur untuk membuat data dummy atau data sembarang yang bersifat sementara untuk tahap development, sehingga akan memudahkan pemrogram untuk menguji aplikasinya sendiri dengan isian data - data sembarang tersebut.

Apa itu Model?

Model merupakan sebuah fitur yang bertugas untuk menghubungkan antara database dengan logic dalam mengambil data ke database.

Paket yang digunakan?

Paket yang digunakan yaitu Sequelize. Sequelize merupakan paket atau plugin migration dan seeder sekaligus ORM (Objec Relational Mapping) nya untuk Node JS.


Bagi kita yang belum mengikuti artikel sebelumnya silakan ikuti step by stepnya dari awal sebelum melanjutkan ke tahap ini, dan bagi kita yang sudah mengikuti dari awal silakan untuk melanjutkan ke tahap sebagai berikut :

1. Install Sequelize

Ketikan command di bawah ini di terminal kita atau command line bagi pengguna windows

$ npm install -g sequelize-cli

Setelah install package sequelize selanjutnya install untuk support ke database nya. Bisa kita sesuaikan dengan database driver masing - masing yang akan digunakan, berikut beberapa command untuk menginstall support driver database nya.

$ npm install --save pg pg-hstore
$ npm install --save mysql // Untuk mysql dan mariadb
$ npm install --save sqlite3
$ npm install --save tedious // MSSQL

2. Setting Connection

Setelah berhasil menginstall paket sequelize dengan database drivernya, sekarang yang harus kita lakukan adalah setting config nya, supaya aplikasi kita bisa terhubung dengan database.

Buat folder dengan nama config untuk menginisialisasi folder config tersebut dengan cara seperti ini

$ sequelize init:config

Kemudian akan muncul file baru yang bernama config.json di dalam file config tersebut yang isinya seperti di bawah ini.

{
    "development": {
        "username": "root",
        "password": null,
        "database": "database_development",
        "host": "127.0.0.1",
        "dialect": "mysql",
        "operatorsAliases": false
    },
    "test": {
        "username": "root",
        "password": null,
        "database": "database_test",
        "host": "127.0.0.1",
        "dialect": "mysql",
        "operatorsAliases": false
    },
    "production": {
        "username": "root",
        "password": null,
        "database": "database_production",
        "host": "127.0.0.1",
        "dialect": "mysql",
        "operatorsAliases": false
    }
}

Ubah dan sesuaikan dengan konfigurasi databasenya masing - masing.

3. Create Migrations

Setelah setting koneksi nya yang harus kita lakukan yaitu insialisasikan path folder migrationsnya dengan cara sebagai berikut

$ sequelize init:migrations

Maka kita akan melihat satu folder baru lagi yaitu folder migrations, kemudian buat 1 file migrations dengan cara

$ sequelize migration:generate --name=create_users_table

Kurang lebih isi nya seperti ini

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    /*
      Add altering commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.createTable('users', { id: Sequelize.INTEGER });
    */
  },

  down: (queryInterface, Sequelize) => {
    /*
      Add reverting commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.dropTable('users');
    */
  }
};

Sementara di dalam file tersebut belum ada skema table nya, maka dari itu kita ubah menjadi seperti dibawah ini

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      username : {
        type: Sequelize.STRING,
        unique : true 
      },
      password : {
        type: Sequelize.STRING
      },
      email: {
        type: Sequelize.STRING,
        unique : true 
      },
      createdAt: {
        allowNull: true,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: true,
        type: Sequelize.DATE
      }
    });
  },

  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users');
  }
};

Di dalam source code yang sudah kita ubah terdapat beberapa fields, berikut penjelasannya

- Field id
Field ini merupakan field primary key dengan type data integer dengan autoincrement : true dan allowNull : false yang artinya pada field ini tidak boleh null.

- Field username
Field ini merupakan field unik yang diamana datanya tidak boleh ada yang sama dengan ditandai unique : true dan mempunyai type data string.

- Field password
Field ini merupakan field yang type datanya menggunakan string.

- Field email
Field ini merupakan field unik yang diamana datanya tidak boleh ada yang sama dengan ditandai unique : true dan mempunyai type data string.

- Field createdAt & Field updatedAt
Field ini merupakan date field (kolom tanggal insert dan update) secara otomatis akan mengisi sendiri ketika satu data di masukan maupun di update untuk field updatedAt.

4. Create Models

Inisialisaikan folder models dengan cara sebagai berikut

$ sequelize init:models

Setelah itu akan ada satu file baru yaitu index.js di dalam folder tersebut yang isinya kurang lebih seperti ini

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

Kemudian buat satu file model user dengan cara seperti ini

$ sequelize model:create --name=User --attributes=id:Integer,username:String,password:String,email:String

--name=User merupakan argumen untuk nama model tersebut dan --attributes=id:Integer,username:String,password:String,email:String untuk mendefinisikan field dengan type datanya yang dipisahkan dengan tanda titik dua dan koma untuk memisahkan bagian fieldnya.

5. Create Seeders

kita buat file seeder dan mendefinisikan folder seeder dengan cara sebagai berikut

$ sequelize init:seeders 			  // Mendefinisikan folder seeder
$ sequelize seed:generate --name=UsersTableSeeder // Membuat file seeder

Karena terdapat password di dalam users table, maka kita perlu mengenkripsi password tersebut dan menginstall package nya, dengan cara sebagai berikut

$ npm install bcrypt-nodejs --save

Setelah install enkripsi password kita perlu satu package lagi yaitu dotenv package, berikut untuk install dotenv package

$ npm install dotenv --save

Terakhir buat satu file yang bernama .env pada root projectnya yang isi nya sebagai berikut

# Env Mode (development, testing, production)
NODE_ENV=development

# Password Encryoption Key
PASSWORD_SECRET=12345

Berikut isi daripada file seeder yang sudah penulis buat

'use strict';

const   crypto  = require('crypto'),
        dotenv  = require('dotenv').config(),
        secret  = process.env.PASSWORD_SECRET;

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.bulkInsert('Users', [{
      username : 'admin',
      password : crypto.createHmac('sha256', secret).update('password').digest('hex'),
      email : '[email protected]'
    }], {});
  },

  down: (queryInterface, Sequelize) => {
    return queryInterface.bulkDelete('Users', null, {});
  }
};

6. Running Seeder & Migration

Setelah kita selesai mengikuti step by stepnya sekarang, coba untuk menjalankan seeder dan migrations yang sudah di buat dengan cara seperti ini.

$ sequelize db:migrate // Runnning migrations table
$ sequelize db:seed:all // Running Seeders

Migration berhasil dijalankan
Seeder berhasil dijalankan
Seeder berhasil dijalankan
Download Full Source Code