lifelong learner — urip iku urup, currently working on accenture.

ORM dengan waterline setup nodejs

0
Degananda.com -

Waterline adalah salah library untuk melakukan ORM(Object relational mapping) pada nodejs. Waterline sendiri digunakan pada framework sails js. Terdapat banyak adapter yang mesupport database terkenal seperti mongodb, postgresql, mysql dan lain sebagaiannya.

Fungsi

Waterline sebagai tools untuk ORM menawarkan pembuatan API dengan menggunakan berbagai macam database yang ada dengan satu query yang sama. Untuk mendapatkan data user dari collections mongodb ataupun mysql/postgresql cukup dengan find(). Kita tidak perlu menspesifikasikan query untuk masing-masing jenis database. Model seperti ini akan meningkatkan fleksibilitas dari aplikasi (mudah diport ke database manapun) dan mengurangi learning curve mempelajari database lain.

Alternative

Pada kontex ORM(object relational mapping). Waterline bukanlah tools satu-satunya melainkan terdapat mongoose (ORM spesifik untuk mongodb), Active records dan Hibernate. Balderdashy sebagai pengembang (developer) dari waterline memiliki keunggulan yang tidak ada pada ketiga tools ORM lainnya yaitu :

  • Fresh prespective (pendekatan yang berbeda terkait model)
  • Tingkat testability yang lebih besar
  • Konsistensi adapter. Terdapat official adapter dan community adapter yang sampai saat ini terus berkembang.

Hingga saat ini setidaknya terdapat 18 adapter yang siap digunakan dengan waterline.

Sails vs waterline

Waterline adalah salah satu modul yang terdapat pada sails. jika kita menggunakan sails tentunnya juga akan menggunakan waterline namun kita juga dapat menggunakan waterline secara terpisah dengan sails.

What will we build ?

kita akan mensetup waterline dengan menggunakan mongodb adapter.

Setup

1.Init project

Langkah pertama tentunnya kita akan membuat project nodejs pada suatu folder tertentu dengan menggunakna perintah

npm init

setelah itu install beberapa package berikut

  1. waterline , komponen utama yakni core module dari waterline itu sendiri.
  2. mongodb adapter.

perintah yang digunakan adalah

npm install waterline sails-mongo --save

jika anda ingin menggunakan adapter lainnya maka berikut adalah daftar link github untuk beberapa adapter official.

nama adpter link
postgresql https://github.com/balderdashy/sails-postgresql
mysql https://github.com/balderdashy/sails-mysql
mongodb https://github.com/balderdashy/sails-mongo
microsoft sql server https://github.com/cnect/sails-sqlserver

setelah itu buat index.js (tergantung dari spesifikasi npm init anda) dan panggil kedua package diatas dengan require. Kemudian buatlah instances waterline. Biasannya intances waterline ini diberi nama ORM agar tidak membingungkan (tetapi terserah pada preferensi anda).

var mongoDbAdapter = require('sails-mongo');
var waterline = require('waterline');
var orm = new waterline();

2. Membuat config waterline

setelah itu buat variabel config yang isinnya adalah object “adapter” dan “connections“. Object adapter memiliki parameter wajib yakni “adapters” yang menspesifikasikan jenis adapter yang digunakan oleh waterline. Kemudian connections memiiki parameter wajib berupa “default” isinnya adalah konfigurasi koneksi ke adapter tersebut.

Berikut ini adalah contoh config yang kami gunakan untuk adapter mongodb. Jika anda menggunakan adapter lain isi dari config sama hanya saja berbeda isinya.

Config adapter & connection adapter mongodb

var config = {
    adapters : {
        'mongoadapter' : mongoDbAdapter
    },
    connections : {
        default :{
            adapter: 'mongoadapter',
            host: 'localhost',
            port: 27017,
            database: 'dudu-api'
        }
    }
}

Config connection adapter mysql

default : {
    adapter: 'sails-mysql',
    host: 'YOUR_MYSQL_SERVER_HOSTNAME_OR_IP_ADDRESS',
    user: 'YOUR_MYSQL_USER', //optional
    password: 'YOUR_MYSQL_PASSWORD', //optional
    database: 'YOUR_MYSQL_DB' //optional
}

Config connection adapter  postgresql

default: {
     adapter: 'sails-postgresql',
     host: 'YOUR_POSTGRES_SERVER_HOSTNAME_OR_IP_ADDRESS',
     user: 'YOUR_POSTGRES_USER', // optional
     password: 'YOUR_POSTGRES_PASSWORD', // optional
     database: 'YOUR_POSTGRES_DB' //optional
}

3. Membuat model

Selanjutnya kita akan membuat model yang dibuat menggunakan fungsi waterline.connection.extend(). Disini kita akan menspesifikasikan berbagai konfigurasi untuk model. Yang paling utama adalah attribute dari model tersebut. Field/kolom apa saja yang ada pada collections/tabel tersebut. Ini adalah contoh model “user” yang kami buat

// create spesifik model
var userCollection = waterline.Collection.extend({
    identity : 'user',
    connection : 'default',
    tableName : 'user',
    schema : true,
    adapter : 'mongoadapter',
    attributes : {
        nama : {
            type : 'string'
        }
    }
})

orm.loadCollection(userCollection);

sedikit penjelasan mengenai parameter-parameter diatas.

  1. Identity. identitas dari model atau nama dari model. Nama ini yang akan kita panggil saat melakukan query atau bisa disebut dengan nama dari collections(bukan collections mongodb).
  2. table , nama dari tabel(jika menggunakan sql) atau collections(jika menggunakan mongodb) yang nantinnya akan dibuat.
  3. connections, konfigurasi koneksi. Isi dari koneksi ini kita ambil dari config yang sudah kita buat pada langkah sebelum ini yakni ‘default’.
  4. schema, jika false maka tidak ada restriksi mengenai data yang masuk ke database (mengabaikan attributes). jika true maka data yang bisa dimasukan (saat request api post/put) hanya yang terdefinisi pada attribute
  5. Attribute, daftar field yang ada pada tabel/collections.
  6. adapter, nama dari adapter (sesuaikan dengan config yang sudah dibuat).

Enam parameter diatas perlu kita tentukan saat membuat model. Inilah keutungan dengan ORM cukup membuat satu model namun dapat digunakan untuk berbagai macam database.

4. Menginisiasi waterline

Proses selanjutnya adalah menginisiasi waterline / menjalankan ORM. Berikut adalah kode untuk menjalankan waterline.

orm.initialize(config, function(err,ontology){
    if(err){
        console.log(err)
    }    
    var User = ontology.collections.user;
    User.create({
        nama  : 'degananda'
    }).exec(function (err,user){
        console.log(user);
    })
})

untuk mengakses model kita menggunakan ontology(callback) anda dapat menamainnya dengan nama apapun dengan query tertentu. Misalkan untuk membuat data querynya adalah model.create() sedangkan untuk read/mendapatkan data querynya adalah find(). Pembahasan mengenai waterline query ini akan dibahas pada ulasan selanjutnya.

5. Done

jalankan dengna menggunakan

node index.js

atau jika anda menggunakan nodemon

nodemon index.js localhost 7787

maka pada console akan nampak seperti berikut ini

full code

ini adalah fullcode dari kode-kode diatas

var mongoDbAdapter = require('sails-mongo');
var waterline = require('waterline');
var orm = new waterline();

// setup config
var config = {
    adapters : {
        'mongoadapter' : mongoDbAdapter
    },
    connections : {
        default :{
            adapter: 'mongoadapter',
            host: 'localhost',
            port: 27017,
            database: 'dudu-api'
        }
    }
}

// create spesifik model
var userCollection = waterline.Collection.extend({
    identity : 'user',
    connection : 'default',
    tableName : 'user',
    schema : true,
    adapter : 'mongoadapter',
    attributes : {
        nama : {
            type : 'string'
        }
    }
})

orm.loadCollection(userCollection);

// setup waterline
orm.initialize(config, function(err,ontology){
    if(err){
        console.log(err)
    }    
    var User = ontology.collections.user;
    User.create({
        nama  : 'degananda'
    }).exec(function (err,user){
        console.log(user);
    })
})