Belajar Node.js untuk Membuat Website



Belajar Node.js untuk Membuat Website - Pembuatan aplikasi web tidak bisa dilakukan hanya dengan satu skill.

Untuk dapat menghasilkan sebuah aplikasi web baru, diperlukan beberapa skill sekaligus.

Skill-skill tersebut ada yang digunakan pada sisi client dan sisi server.

Node.js menyeragamkan bahasa scripting di client dan di server karena keduanya sama-sama menggunakan bahasa Javascript.

Tidak hanya itu, Node.js memiliki dukungan komunitas yang sangat bagus.

Apalagi, terdapat banyak modul Node.js yang bisa didapatkan dengan menggunakan NPM (Node Package Manager).

Dengan potensi tersebut, diharapkan Node.js menjadi suatu alternatif yang lebih baik dalam pengembangan aplikasi web.

Tutorial ini membahas dasar-dasar Node.js yang singkat, tetapi menyeluruh.

Tutorial ini disertai source code, download di sini:


Berikut ini adalah daftar bab-bab-nya:



















Selamat belajar!

Pengenalan

Aplikasi web adalah salah satu software aplikasi yang paling beragam di dunia.

Untuk membuatnya, dibutuhkan beberapa skill sekaligus.

Untuk tampilannya saja, dibutuhkan skill Javascript, HTML, dan CSS.

Selain itu, agar konten dari aplikasi web bisa dinamis, diperlukan server side scripting seperti PHP.

Jadi, kalau dijumlahkan setidaknya diperlukan 4 skill sekaligus untuk membuat sebuah aplikasi web.

Walaupun demikian, saat ini ada sebuah teknologi baru berupa runtime environment yang menggunakan Javascript sebagai bahasa scripting-nya.

Teknologi tersebut adalah Node.js.
Akibat dari munculnya Node.js, maka scripting di client side dan server side bisa menggunakan bahasa yang sama, yakni Javascript.

Apa Itu Node.js?

Node.js merupakan sebuah runtime environment berbasis Javascript yang bersifat cross platform dan open source.

Node.js bisa digunakan untuk membuat sebuah aplikasi server untuk web.

Walaupun begitu, Node.js juga sebenarnya bisa juga digunakan untuk membuat aplikasi console yang berjalan di command line interface seperti CMD atau Terminal.

Jenis aplikasi web yang bisa dibuat juga bisa bermacam-macam.

Mulai dari aplikasi blogging, social networking, payment gateway, dan search engine (termasuk web scraping).

Dengan lisensinya yang sangat permisif, Node.js bisa didapatkan dengan gratis.

Node.js juga dapat berjalan di banyak Operating System seperti Windows, Linux, Unix, dan Mac OS sehingga Node.js bisa dikatakan cross platform.

Apa yang Bisa Dilakukan dengan Node.js?

Node.js telah menyediakan modul bawaannya yang sangat banyak.

Hal yang paling umum dalam aplikasi web yang bisa dilakukan oleh Node.js adalah memanipulasi file.

Fila dalam artian file system maupun file dalam artian database file.

Jadi, kita bisa membuka, menutup, mengedit, dan menghapus file dalam file system dan juga melakukan fungsi-fungsi yang berkaitan dengan database (meskipun diperlukan modul pihak ketiga untuk database).

Node.js juga bisa membuat respon ke client berupa HTML, JSON, dan sebagainya dari server.

Artinya, Node.js bisa digunakan untuk membuat konten yang dinamis.

Selain itu, Node.js juga bisa menyaring request dan parameter-parameternya, yang artinya Node.js bisa menangani form HTML dari client ke server.

Node.js juga dilengkapi dengan NPM, yakni sebuah package manager untuk mendapatkan modul-modul pihak ketiga Node.js.

Dengan menggunakan NPM, struktur project Node.js jadi lebih baik dan terorganisir.

Modul-modul pihak ketiga tersebut didapatkan dari www.npmjs.com.

Modul yang tersedia sangat banyak.

Bahkan ada juga modul-modul tertentu yang hanya bisa dijalankan pada OS tertentu.

Jadi, berhati-hatilah ketika memilih modul yang akan digunakan untuk berbagai OS. Pastikan modul tersebut benar-benar bisa dijalankan pada OS yang ditargetkan.

Bagaimana Cara Node.js Bekerja Mengangani Request?

Node.js merespon sebuah request dengan cara yang berbeda dengan alternatif lainnya.

Ketika Node.js menerima perintah dari client di server, Node.js akan segera bersiap menangani request selanjutnya.

Ketika ada file yang diminta untuk dibaca di server, Node.js membuka file tersebut dan secara bersamaan mengembalikan konten yang telah diproses ke client. Jadi, Node.js tidak menunggu-nunggu untuk menangani request antara yang sekarang, dengan yang selanjutnya.

Hal tersebut berbeda dengan alternatif lainnya.

PHP, misalnya, dia akan tetap menunggu sampai file system yang terbuka selesai dibaca, baru kemudian menangani request selanjutnya.



Javascript Browser Javascript Node.js
Window Object Ada Tidak Ada
Location Object Ada Tidak Ada
Document Object Ada Tidak Ada
Require Tidak Ada Ada
Memproses Apa Response Request

Mengapa Kita Menggunakan Node.js untuk Aplikasi Web?

Node.js merupakan runtime environment yang penggunaan memorinya sangat efisien karena menggunakan single thread.

Berbeda dengan PHP yang menggunakan multi thread.

Dengan demikian, Node.js cocok untuk aplikasi web yang menangani banyak request sekaligus seperti aplikasi chatting.

Selain itu, Node.js menggunakan bahasa Javascript.

Artinya, kita bisa menyeragamkan bahasa di sisi client maupun server, sehingga lebih hemat waktu belajar.

Selain itu, Node.js memiliki modul yang berlimpah, baik yang bawaan maupun yang dari pihak ketiga di www.npmjs.com.

Semua itu bisa didapatkan dengan menggunakan NPM.

Dengan banyaknya modul tersebut, kita bisa fokus pada fungsi utama aplikasi web yang kita buat.

Di samping itu, komunitas pengguna Node.js sangat banyak dan aktif.

Apabila kita mendapatkan masalah dalam pengembangan aplikasi dengan Node.js, kita bisa googling solusinya dengan mudah.

Dan yang paling menarik, beberapa perusahaan IT yang besar telah mengadopsi sistem Node.js untuk website-nya dan itu bisa menjadi teladan bagi mereka yang masih ragu untuk menggunakan Node.js.

Memulai

Pada bagian Pengenalan, kita telah membahas sekelumit tentang Node.js.

Agar lebih jelas, sekarang kita mencoba menggunakan Node.js untuk membuat aplikasi yang sangat sederhana.

Tapi sebelumnya, ada beberapa hal yang dibutuhkan.

Hal-hal tersebut adalah:
  • Text Editor apapun, boleh Notepad++ (Windows Saja) atau Visual Studio Code atau Atom Editor. Saya Menggunakan Visual Studio Code.
  • CMD (untuk Windows, sudah ada) atau Terminal (untuk Linux atau Mac)
  • Koneksi Internet
  • Node.js yang bisa didapatkan di http://nodejs.org
Khusus Node.js, saya akan membahas cara meng-install-nya pada OS yang berbeda.

Meng-Install Node.js di Windows

Untuk meng-install Node.js di Windows, kita perlu memiliki file installer yang telah didapatkan dari http://nodejs.org

Setelah membuka situs tersebut, pilih Node.js yang "Recommended For Most Users".



Pada gambar ini ada di tombol hijau sebelah kiri.

Setelah installer Node.js selesai di-download, kita tinggal menjalankan installer-nya dan klik next sampai finish.

Meng-Install Node.js di Linux (Ubuntu)

Kali ini, kita akan menginstall Node.js di Linux.

Tapi, karena distro Linux sangat beragam, saya memilih yang paling umum digunakan saja, yakni Ubuntu.

Berbeda dengan cara sebelumnya yang meng-install Node.js dari installer dari situs resminya, kita menginstall Node.js di Ubuntu melalui repository Ubuntu.

Jadi kita akan menggunakan Terminal untuk melakukannya.

Pertama-tama, buka terminal, pastikan kita berada pada directory "home", lalu ketik:
sudo apt-get install curl
Kita perlu menginstall curl karena kita akan meng-install installation script-nya terlebih dahulu:
curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh
Lantas, jalankan script tersebut dengan cara:
sudo bash nodesource_setup.sh
Selanjutnya, install Node.js:
sudo apt-get install nodejs
Install juga build-essential karena NPM ada yang membutuhkannya:
sudo apt-get install build-essential 

Meng-Install Node.js di Mac

Untuk meng-install Node.js di Mac, caranya mirip dengan di Windows.

Download installer Node.js di website resminya dan pilih installer untuk Mac.

Selanjutnya, jalankan installer tersebut di Mac dan ikuti instruksinya hingga selesai.

Menguji Hasil Peng-Install-an Node.js

Agar kita yakin bahwa Node.js telah terinstall dengan benar, kita akan mengujinya terlebih dahulu.

Buka CMD/Terminal kemudian ketikkan:
npm -v
Jika hasilnya semacam ini:
5.5.1
Berarti NPM baik-baik saja.

Selanjutnya ketik ini:
node -v
Jika hasilnya seperti ini:
v8.9.0
Berarti Node.js baik-baik saja.

Apabila hasil-hasil perintah tadi tidak keluar atau ada pesan semacam ini:
'xcvxc' is not recognized as an internal or external command,
operable program or batch file.
Berarti ada yang salah dengan pen-setting-an Environment Variable (jika di Windows).

Cara memperbaikinya adalah dengan menge-set Environment Variable "PATH" ke lokasi NPM atau Node.js terinstall.

Membuat Program Console "Hello World"

Sekarang, saatnya mencoba coding dengan Node.js.

Kita akan membuat program "Hello World" yang akan menampilkan teks "Hello World" di CMD/Terminal kita.

Caranya, buat file baru bernama "console-hello-world.js" pada folder apapun.

Kemudian isi file tersebut dengan kode ini:

console.log("Hello World");

Simpan file tersebut, kemudian buka CMD/Terminal pada folder di mana file tersebut berada dan jalankan perintah ini:
node console-hello-world.js
Outputnya adalah:
Hello World

Membuat Program Web "Hello World"

Kali ini kita akan membuat program yang seperti tadi, tapi teks-nya akan muncul di browser kita.

Pertama, buatlah file baru bernama "web-hello-world.js" pada folder apapun.

Kemudian, isi file tersebut dengan kode ini:

var http= require('http');
 
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end('Hello World!');
}).listen(8080);

Jalankan dengan cara membuka CMD/Terminal pada folder itu lalu ketikkan perintah:
node web-hello-world.js
Setelah itu, buka browser kita di http://localhost:8080

Nanti di browser, akan tampil teks ini:
Hello World

Modul

Pada dasarnya, modul Node.js adalah library Javascript.

Ada modul yang sudah ada secara default dengan Node.js yang ter-install.

Ada juga modul yang harus di-install dulu agar dapat digunakan.

Modul yang pertama tadi tidak perlu di-install dengan NPM agar dapat digunakan, sedangkan modul yang terakhir harus di-install terlebih dahulu dengan NPM.

Modul bawaan maupun yang sudah ter-install kemudian di-include ke dalam script Node.js kita dengan fungsi require().

Akan tetapi ada juga modul bawaan yang tidak perlu require(), misalnya Buffer.

Selain itu, kita juga bisa membuat modul sendiri dan meng-include-nya pada script lain.

Beberapa Modul Bawaan

File System

Modul ini adalah modul yang digunakan untuk memanipulasi file.

Untuk meng-include-nya:

var fs = require("fs");

Semua method dari modul File System ada yang synchronous dan asynchronous.

Yang asynchronous tidak akan mem-block program ketika dieksekusi, sedangkan yang synchronous akan mem-block-nya.

Untuk mencobanya, buat file baru bernama "teks-untuk-dibaca.txt", kemudian isi dengan ini:
file ini hanya untuk contoh.
silakan dibaca.
Kemudian, buat file baru bernama "fs-sync-async.js, kemudian isi dengan kode ini:

var fs = require("fs");

console.log("START");

//Membaca secara asynchronous
fs.readFile('teks-untuk-dibaca.txt', function (err, data) {
   if (err) {
      return console.error(err);
   }
   console.log("File ini dibaca secara asynchronous: " + data.toString());
});

//Membaca secara synchronous
var data = fs.readFileSync('teks-untuk-dibaca.txt');
console.log("File ini dibaca secara synchronous: " + data.toString());

console.log("STOP");

Jalankan script ini dengan cara:
node fs-sync-async.js
Nanti output-nya seperti ini:
START
File ini dibaca secara synchronous: file ini hanya untuk contoh.
silakan dibaca.
STOP
File ini dibaca secara asynchronous: file ini hanya untuk contoh.
silakan dibaca.

Tampak bahwa program akan meneruskan instruksi ke bagian yang synchronous dulu sambil menunggu yang asynchronous selesai dibaca.

Dengan demikian, yang synchronous akan tampil terlebih dahulu.

HTTP

Modul ini adalah modul yang digunakan untuk membuat server atau client HTTP.

Jika ingin membuat HTTP server, begini caranya:

var http1 = require('http');

http1.createServer(function (req, res) {
  res.write('Ini adalah server http!'); //tulis
  res.end(); //akhiri
}).listen(8080); //gunakan port 8080

Setelah dijalankan, buka browser kita ke:
http://localhost:8080
Nanti output-nya:
Ini adalah server http!
Jika ingin membuat HTTP Client, begini caranya:

var http1 = require('http');

var requestCallback = function(response){
   var body = '';
   response.on('data', function(data) {
      body += data;
   });
   
   response.on('end', function() {
      // Data received completely.
      console.log(body);
   });
}

var req = http1.request({
   host: 'www.google.com',
   port: '80',
   path: '/'  
}, requestCallback);

req.end();

Jalankan, dan hasilnya seperti ini:
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.id/?gws_rd=cr&amp;dcr=0&amp;ei=lcgOWoTPGIeYvQTrn7-
QBA">here</A>.
</BODY></HTML>

Modul Luar

Selain modul bawaan, ada juga modul luar yang harus di-install terlebih dahulu sebelum dapat digunakan.

Untuk meng-install-nya, kita menggunakan perintah NPM:
npm install <nama_modul>
Jadi, jika kita ingin meng-install Expressjs
npm install express
NPM bisa menginstall modul secara local maupun global.

Secara default, NPM menginstall modul secara local.

Secara local, modul akan di-install dalam folder "node_modules" yang ada di dalam folder dimana perintah NPM dijalankan.

Jadi, jika kita menjalankan perintah NPM dalam folder "C:\Nodejs", maka lokasi folder "node_modules" berada di dalam folder tersebut.

Agar modul terinstall secara global, tambahkan parameter -g:
npm install express -g
Dengan cara ini, modul terinstall di dalam folder global yang berbeda-beda lokasinya di setiap OS.

Jika kita menggunakan Windows, maka folder global tersebut ada di "C:\Users\
<nama_user>\AppData\Roaming\npm\node_modules"

Jika kita menggunakan Linux, maka folder itu ada di "/usr/local/lib/node"
atau di "/usr/local/lib/node_modules"

Lokasi folder global tersebut bisa dicek dengan perintah ini:
npm root -g
Penginstalan modul juga dapat diatur sehingga modul yang terinstall didaftarkan dalam dependencies package.json.

Jika sudah didaftarkan di sana, kita bisa menginstall kembali semua modul dengan satu perintah:
npm install
Agar modul yang di-install didaftarkan dalam package.json, gunakan parameter --save:
npm install express --save
Modul juga dapat di-uninstall dengan cara ini:
npm uninstall <nama_package>
Jadi jika ingin meng-uninstall Expressjs, begini caranya:
npm uninstall express

Express.js

Pada pembahasan sebelumnya, kita telah mengetahui bahwa Node.js memiliki modul yang membuat Node.js menjadi web server.

Modul HTTP misalnya.

Akan tetapi, ada kalanya kita mungkin membutuhkan akses ke file yang statis melalui web server.

Atau mungkin juga kita ingin membuat routing pada banyak halaman.

Dengan hanya mengandalkan modul tadi, proses ini menjadi semakin rumit.

Jadi agak ribet.

Oleh karena itu, developer mengembangkan beberapa framework untuk keperluan web bagi Node.js.

Framework-framework tersebut adalah:
  • Express.js
  • Hapi.js
  • Mojito
  • Meteor
  • Derby
  • Sails.js
  • Koa.js
  • Total.js

Karena banyak, maka saya tidak akan membahas semua framework tersebut.

Yang saya akan bahas adalah Express.js karena framework ini cukup umum digunakan.

Menginstall dan Menggunakan Express.js

Express.js adalah modul luar atau pihak ketiga, oleh karena itu, kita harus menginstallnya terlebih dahulu dengan NPM sebelum digunakan di dalam kode kita.

Pertama-tama, kita akan membuat project Node.js terlebih dahulu.

Caranya, buka folder apapun, kemudian buat folder baru bernama tutorial-expressjs.

Selanjutnya, buka CMD di dalam folder tersebut dan pastikan CMD telah berada di dalam direktori tersebut.

Selanjutnya, ketikkan perintah ini:
npm init
Isi input yang ditanyakan oleh NPM hingga selesai.

Setelah itu, install Express.js dengan cara ini:
npm install express --save
Dengan parameter --save, maka Express.js didaftarkan dalam dependencies dalam package.json.

Sekarang kita coba Express.js.

Caranya, buat file baru bernama testing-expressjs.js, kemudian isi dengan:

const express = require('express');
const app = express();

app.get('/', function (req, res) {
  res.send('Salam dari Express.js!');
});

app.listen(3000, function () {
  console.log('Aplikasi ini berjalan pada port 3000!');
});

Kemudian, jalankan script tersebut dengan perintah:
node testing-expressjs.js
Hasilnya dapat dilihat dengan membuka browser ke:
http://localhost:3000
Outputnya seperti ini:
Salam dari Express.js!
Apabila kita memasukkan path yang salah semisal:
http://localhost:3000/1
Maka browser akan menampilkan:
Cannot GET /1
Hal itu disebabkan kita belum mendaftarkan route ke path "/1".

Express.js Routing

Express.js menangani routing get seperti yang barusan kita praktikkan.

Selain itu ada post, put, head, delete, options, trace, copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, m-search, notify, subscribe, unsubscribe, patch, search, dan
connect.

Penggunaan routing di atas serupa dengan get, yakni:

app.METHOD(PATH, HANDLER)

Di mana METHOD misalnya get, put, head, dan lain-lain.

Di mana PATH misalnya "/", "/1" , "/about" dan lain-lain.

Dan di mana HANDLER adalah response yang disajikan dalam fungsi callback.

Ada pula suatu metode routing spesial dari Express.js yang bernama all.

Metode all menerima semua jenis request.

Jadi, jika kita melakukan ini:

app.all('/', function (req, res) {
  res.send('Salam dari Express.js!');
});

Maka request GET, POST, PUT, DELETE dan yang lainnya akan dijawab dengan:
Salam dari Express.js!

Express.js Route Path

Tadi kita telah mencoba "/" sebagai Path.

Itu hanya satu contoh.

Sebenarnya masih banyak lagi Path lain yang bisa didefinisikan.

Seperti "/1", "/about" dan apapun.

Yang menarik, Path ini bisa diisi dengan regular expression.

Misalnya...

Ini valid untuk abc atau abcd:

app.get('/ab?cd', function (req, res) {
  res.send('ab?cd')
})

Ini valid untuk abcd, abbcd, abbbcd:

app.get('/ab+cd', function (req, res) {
  res.send('ab+cd')
})

Ini valid untuk abcd, abxcd, abRANDOMcd, ab123cd:

app.get('/ab*cd', function (req, res) {
  res.send('ab*cd')
})

Ini valid untuk /abe dan /abcde:

app.get('/ab(cd)?e', function (req, res) {
  res.send('ab(cd)?e')
})

Route juga bisa merespon request dengan path yang memiliki parameter.

URL seperti ini:
http://localhost:8080/books/100
http://localhost:8080/books/101
http://localhost:8080/books/102
http://localhost:8080/books/567
Akan diproses jika route-nya seperti ini:

app.get('/books/:bookId', function (req, res) {
  res.send(req.params)
})

Apabila ada request ke:
http://localhost:8080/books/102
Maka isi dari req.params adalah:
{ "bookId": "102" }

Response Methods

Selain res.send, Express.js juga menyediakan beberapa metode respon lainnya. Berikut ini daftarnya:
  • res.download(), untuk mendownload sesuatu.
  • res.end(), mengakhiri proses response.
  • res.json(), mengirim response berupa JSON.
  • res.jsonp(), mengirim response berupa JSON dengan JSONP support.
  • res.redirect(), melakukan redirect.
  • res.render(), merender template.
  • res.sendFile(), mengirim file dalam bentuk octet stream.
  • res.sendStatus(), mengeset response status code dan mengirim representasi stringnya sebagai response body.

Middleware

Fungsi middleware adalah fungsi yang memiliki akses ke request object (req), response object (res), dan fungsi middleware selanjutnya dalam siklus request-response dari sebuah aplikasi.

Fungsi next() mengarahkan middleware ke middleware selanjutnya.

Agar memahaminya, buat file baru bernama web-server-3.js, kemudian isi dengan:

const express = require('express');
const app = express();

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

app.use('/user/:id', function (req, res, next) {
  console.log('Request Type:', req.method)
  next()
})

app.get('/', function (req, res) {
  res.send('Salam dari Express.js!');
});

app.listen(3000, function () {
  console.log('Berjalan di port 3000!');
});

Selanjutnya, jalankan dengan perintah ini:
node web-server-3.js
Kemudian buka browser ke:
http://localhost:3000
Nanti di console window, akan tampil angka yang menunjukkan waktu dan tanggal seperti ini:
Time: 1502120455668
Selanjutnya coba browse ke:
http://localhost:3000/user/123
Nanti di console window akan tampil yang semacam ini:
Time: 1502120455668
Request Type: GET
Tapi di browser akan tampil:
Cannot GET /user/123
Hal ini wajar, karena kita tidak meresponse /user/123.

Tapi yang penting kita lihat bahwa, dengan menggunakan use, kita bisa meng-hijack request yang dikirimkan.

Jika tidak terikat dengan path-nya, cukup lakukan ini:

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

Sedangkan jika terikat dengan path lakukan ini:

app.use('/user/:id', function (req, res, next) {
  console.log('Request Type:', req.method)
  next()
})

Middlware digunakan juga untuk tujuan lain seperti untuk mengakses file statis.

Untuk mencobanya, buatlah folder bernama "public" di tempat yang sama dengan file script webserver kita.

Kemudian di script tersebut tambahkan:

app.use(express.static('public'));

Nanti seisi folder public dapat diakses dengan cara ini:
http://localhost:3000/images/soccer.png
http://localhost:3000/css/bootstrap.min.css
http://localhost:3000/js/jquery.min.js
http://localhost:3000/home.html 

Template Engine

Terdapat beberapa template engine untuk Express.js yang berfungsi untuk melakukan server render terhadap response html.

Dengan template engine tersebut, kita bisa membuat sebuah template html yang dapat diselipkan dengan data-data tertentu.

Dengan begitu, response html bisa terlihat dinamis.

Beberapa template engine yang populer adalah:
  • Pug
  • Mustache
  • EJS

Akan tetapi, template engine tidak mutlak diperlukan.

Jika kita membuat single page web application, kita mungkin lebih memilih client render dengan menggunakan Angular maupun Vue.

Jadi server akan meneruskan request dari client ke REST API di belakangnya, sambil mengembalikan file HTML statis.

Database

Node.js memiliki modul luaran yang sangat banyak dan jumlahnya semakin meningkat.

Di sisi lain, karena Node.js umumnya digunakan untuk aplikasi yang membutuhkan database, maka jumlah modul untuk manajemen database juga banyak.

Adapun beberapa database yang disupport oleh modul luaran Node.js adalah:
  • MySQL
  • SQLite
  • MongoDB
  • NeDB
  • PostgreSQL
  • CouchDB
  • Redis
  • MariaDB
  • Cassandra
Karena sangat banyak, maka kita akan membahas sebagian database saja, yakni MySQL, SQLite, dan MongoDB.

MySQL

Database MySQL merupakan salah satu database yang paling populer di kalangan web developer.

Jika kita belajar PHP, MySQL sering disertakan pada pelajaran tersebut.

Beberapa keunggulan MySQL adalah:
  • Support yang bagus karena dukungan komunitas
  • Mudah diinstall
  • Murah dan bisa didapatkan dengan gratis
  • Merupakan industry standard
Beberapa kelemahan MySQL adalah:
  • Memiliki sedikit masalah dalam stabilitas
  • Tidak terlalu open source
  • Dimiliki oleh perusahaan dan bukan community driven
  • Terlalu tergantung pada add-ons

Menginstall MySQL

Untuk menggunakan MySQL dengan Node.js, kita harus menginstall MySQL server terlebih dahulu.

Downloadlah MySQL Community Edition di:
https://www.mysql.com/downloads/
Kemudian install software tersebut.

Setelah menginstallnya, install MySQL driver untuk Node.js dengan cara:
npm install mysql --save

Membuka Koneksi ke MySQL

Untuk membuka koneksi ke MySQL:

var mysql = require('mysql'); //import module mysql

var connection = mysql.createConnection({
 host: "nama_domain_atau_ip",
 user: "username_anda",
 password: "password_anda"
});

Untuk menjalankannya, jalankan server MySQL terlebih dahulu, lalu jalankan script di atas.

Outputnya (jika host, user, dan password benar):
Terkoneksi dengan sukses!

Fungsi Query pada Node.js MySQL

Untuk membuat database, membuat tabel, melakukan insert dan select, semua dapat dilakukan dengan fungsi query:

connection.query(query_nya, function (err, result) {
 if (err){
  throw err;
 }
 console.log("Result: " + result);
});

Jadi, apabila ingin melakukan create database:

var mysql = require('mysql');

var connection = mysql.createConnection({
 host: "nama_domain_atau_ip",
 user: "username_anda",
 password: "password_anda"
});

connection.connect(function(err) {
 if (err){
  throw err;
 }
 console.log("Terkoneksi dengan sukses!");
 
 connection.query("CREATE DATABASE nama_database", function (err, result) {
  if (err){
   throw err;
  }
  console.log("Database created");
 });
});

Apabila ingin membuat tabel:

var mysql = require('mysql');

var connection = mysql.createConnection({
 host: "nama_domain_atau_ip",
 user: "username_anda",
 password: "password_anda",
 database: "nama_database"
});

connection.connect(function(err) {
 if (err){
  throw err;
 }
 console.log("Terkoneksi dengan sukses!");
 
 var sql = "CREATE TABLE books (title VARCHAR(255), description VARCHAR(255))";
 connection.query(sql, function (err, result) {
  if (err){
   throw err;
  }
  console.log("Table selesai dibuat");
 });
});

Perhatikan bahwa kita harus memilih terlebih dahulu database mana yang ingin dibuat tabelnya pada createConnection:
database: "nama_database"
Apabila ingin melakukan insert:

var mysql = require('mysql');

var connection = mysql.createConnection({
 host: "nama_domain_atau_ip",
 user: "username_anda",
 password: "password_anda",
 database: "nama_database"
});

connection.connect(function(err) {
 if (err){
  throw err;
 }
 console.log("Terkoneksi dengan sukses!");
 
 var sql = "INSERT INTO books (title, description) VALUES ('Cara Membuat Kopi', 'bagaimana caranya membuat kopi')";
 connection.query(sql, function (err, result) {
  if (err){
   throw err;
  }
  console.log("1 record diinsert");
 });
});

Apabila ingin melakukan select:

var mysql = require('mysql');

var connection = mysql.createConnection({
 host: "nama_domain_atau_ip",
 user: "username_anda",
 password: "password_anda",
 database: "nama_database"
});

connection.connect(function(err) {
 if (err){
  throw err;
 }
 console.log("Terkoneksi dengan sukses!");
 
 connection.query("SELECT * FROM books", function (err, result, fields) {
  if (err){
   throw err;
  }
  console.log(result);
 });
});

SQLite

Tidak kalah populernya dengan MySQL, SQLite yang merupakan versi serverless (tanpa server) dari MySQL sangat banyak digunakan pada aplikasi mobile.

Bahkan, di Android SDK, SQLite merupakan database resmi dari aplikasinya.

Beberapa keunggulan SQLite adalah:
  • Tidak memerlukan server
  • Tidak memerlukan konfigurasi yang rumit
  • Dapat digunakan pada berbagai OS
  • Mudah dipackage
  • Tersedia database browsernya, seperti DB Browser for SQLite
Beberapa kelemahan SQLite adalah:
  • Performance tidak terlalu bagus untuk aplikasi client/server
  • Tidak cocok untuk website yang banyak melakukan write
  • Database hanya dapat disimpan pada single disk

Menginstall SQLite

Untuk menggunakan SQLite di Node.js, kita tidak perlu menginstall servernya terlebih dahulu, karena SQLite memang serverless.

Akan tetapi, kita harus menginstall module Node.js untuk SQLite terlebih dahulu dengan cara:
npm install sqlite3 --save

Fungsi Run dan Prepare pada Node SQLite3

SQLite memiliki query yang kurang lebih sama dengan MySQL.

Akan tetapi, pada API Node.js-nya terdapat beberapa perbedaan.

Salah satunya adalah pada MySQL fungsi querynya adalah query, sedangkan pada SQLite, fungsi querynya adalah run.

Jadi apabila kita ingin membuat tabel dengan SQLite:

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('nama_database.db');
var check;
db.serialize(function() {
 db.run("CREATE TABLE if not exists book_infos (info TEXT)");
});

Apabila kita ingin memasukkan beberapa data sekaligus, kita bisa menggunakan fungsi prepare.

Misalnya, pada tabel book_infos tadi, kita ingin memasukkan beberapa row info.

Untuk melakukannya, begini caranya:

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('nama_database.db');
var prepared = db.prepare("INSERT INTO book_infos VALUES (?)");
for (var i = 0; i < 10; i++) {
  prepared.run("Info " + i);
}
prepared.finalize();

Tanda tanya pada fungsi prepare tadi adalah parameter yang diikat pada variabel prepared.

Jadi tanda tanya tadi di-replace dengan "Info 1", "Info 2", dan seterusnya.

Adapun fungsi finalize adalah untuk mengakhiri statement.

Fungsi finalize tidak mutlak diperlukan, kecuali ada delay yang cukup lama untuk menjalankan query selanjutnya.

Fungsi Each

Untuk mendapatkan row dari SQLite, digunakan fungsi each:

db.each("SELECT rowid AS id, info FROM book_infos", function(err, row) {
 console.log(row.id + ": " + row.info);
});

Dengan demikian, isi dari tabel book_infos akan ditampilkan.

MongoDB

MongoDB adalah salah satu database baru yang populer akhir-akhir ini.

Perbedaan yang mencolok dari MongoDB dibandingkan MySQL adalah database ini tidak menggunakan SQL.

Oleh karena itu, database semacam MongoDB ini disebut NoSQL.

Jadi, querynya menggunakan API langsung dari client.

Database ini tetap memerlukan server.

Beberapa keunggulan MongoDB adalah:
  • Sharding dan load-balancing
  • Query yang lebih cepat
  • Fleksibel
Beberapa kelemahan MongoDB adalah:
  • Tidak bisa join
  • Membutuhkan lebih banyak memory
  • Masih baru

Menginstall MongoDB

Untuk menggunakan MongoDB, kita harus menginstall servernya terlebih dahulu.

Downloadlah server MongoDB di sini:
https://www.mongodb.com/download-center#community
Kemudian install server tersebut.

Setelah server terinstall, kita bisa membuat database MongoDB dengan menggunakan module Node.js resminya:
npm install mongodb --save

Membuat Koneksi ke MongoDB

Untuk membuat koneksi dan database mongodb, begini caranya:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/database1";

MongoClient.connect(url, function(err, db) {
 if (err){
  throw err;
 }
 console.log("Terkoneksi dan database telah dibuat!");
 db.close();
});

Sedangkan untuk membuat collection, begini caranya:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/database1";

MongoClient.connect(url, function(err, db) {
 if (err){
  throw err;
 }
 db.createCollection("customers", function(err, res) {
  if (err){
   throw err;
  }
  console.log("Collection berhasil dibuat!");
  db.close();
 });
});

Sedangkan, untuk menginsert document ke mongodb, begini caranya:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/database1";

MongoClient.connect(url, function(err, db) {
 if (err){
  throw err;
 }
 var myobj = { name: "Rakifsul", address: "Tangsel" };
 db.collection("customers").insertOne(myobj, function(err, res) {
  if (err){
   throw err;
  }
  console.log("1 document telah diinsert");
  db.close();
 });
});

Websocket

Apa Itu Websocket?

Websocket adalah protokol komunikasi dua arah antara server dan browser.

Protokol komunikasi ini bersifat bi-directional dan full duplex.

Artinya, kedua pihak berkomunikasi pada waktu yang sama.

Karena koneksinya bersifat persisten, server dapat mengirim data ke browser.



Walaupun demikian, koneksi harus dimulai dari client terlebih dahulu karena server tidak bisa memulai koneksi ke client.

Selain untuk browser, websocket juga dapat diterapkan pada Internet of Things (IoT).

Akibatnya, perangkat IoT yang terkoneksi ke server bisa berkomunikasi secara bi-directional dan full duplex seperti browser.

Saat ini, sebagian browser, baik untuk desktop maupun Android sudah mendukung websocket.

Kita bisa melihatnya di gambar ini.


Apa Bedanya dengan AJAX?

Walaupun fungsinya bisa sama, ada beberapa perbedaan antara Websocket dengan AJAX.

Perbedaan itu dirangkum dalam tabel ini.


Websocket AJAX
Koneksi Sekali request, akan tetap terkoneksi. Harus tetap me-request agar tetap terkoneksi.
Pengiriman Data Dari client ke server dan sebaliknya. Dari client ke server saja.
Bandwith Hemat bandwidth karena ukuran data frame kecil Kurang hemat bandwith karena ukuran data frame lebih besar.

Membuat Aplikasi Websocket Pertama

Agar lebih jelas dalam memahami Websocket, kita akan mencobanya dengan Node.js.

Pertama-tama, buat folder bernama "websocket".

Selanjutnya buka PowerShell/Terminal pada folder tersebut dan buatlah project Node.js dengan nama "websocket".

Kemudian install modul Websocket yang bernama "ws":
npm install ws --save
Pastikan juga bahwa browser yang kita gunakan mendukung Websocket.

Kita bisa melihat gambar "Browser yang Mendukung Websocket" pada pembahasan sebelumnya.

Selanjutnya, buat file baru pada folder "websocket" dengan nama "mywebsocket.js", kemudian isi dengan kode ini:

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
    ws.on('message', function incoming(message) {
        console.log('Diterima: %s', message);
    });
    
    ws.send('pesan dikirimkan ke client');
});

Selanjutnya, buat file baru bernama "mywebsocket.html", kemudian isi dengan kode ini:

<!DOCTYPE html>
<html>
<head>
    <style>
    div {
        display: inline;
    }
    </style>
    <script>
    var host = 'localhost';
    var ws = new WebSocket('ws://' + host + ':8080');
    
    ws.onopen = function(event) {
        ws.send("pesan dikirimkan ke server");
    };
    
    ws.onmessage = function (event) {
        document.getElementById('pesan').innerHTML = event.data;
    };
    </script>
</head>
<body>
    <strong>Percobaan WebSocket</strong><br>
    Pesan: <div id='pesan'></div><br>
</body>
</html>

Sekarang simpan kedua file tersebut dan buka PowerShell/Terminal pada folder "websocket".

Kemudian jalankan server-nya:
node  mywebsocket.js
Selanjutnya, buka file "mywebsocket.html" sebagai file html dengan browser kita.

Output pada browser akan seperti ini:
Pesan: pesan dikirimkan ke client
Output pada PowerShell/Terminal akan seperti ini:
Diterima: pesan dikirimkan ke server
Kode Websocket yang "mywebsocket.js" adalah server-nya, sedangkan yang html adalah client-nya.

Di situ tampak bahwa server bisa mengirimkan data ke client pada bagian kode yang ini:

//Kode ini di sisi server
wss.on('connection', function connection(ws) {
    ws.on('message', function incoming(message) {
        console.log('Diterima: %s', message);
    });
    
    ws.send('pesan dikirimkan ke client'); //YANG INI
});

Event "message" terjadi ketika server menerima data dari client.

Event-Event pada Websocket

Di sisi client, Websocket API pada browser memiliki 4 event utama.

Event-event tersebut adalah:
    • Open
    • Message
    • Close
    • Error

Event Open terjadi ketika koneksi antara client dan server terbangun.

Pada contoh sebelumnya, kita mendeteksi event ini dengan:

//Kode ini di sisi client
ws.onopen = function(event) { //YANG INI
    ws.send("pesan dikirimkan ke server");
};

Jadi, event Open dapat diterima dengan callback WebSocket.onopen di sisi browser.

Event Message terjadi setiap kali server mengirim data (dan client menerima data dari server).

Data yang bisa dikirim dari server adalah teks dan binary.

ws.onmessage = function(event){
    //Kode untuk menangani data
};

Event Close terjadi pada saat koneksi diakhiri.

Setelah event Close terjadi, maka tidak ada lagi data yang bisa ditransfer antara client dan server.

ws.onclose = function(event){
    //Kode untuk menangani data
};

Event Error terjadi ketika ada kesalahan yang terjadi dalam komunikasi.

Event ini selalu diikuti dengan diakhirinya koneksi.

ws.onerror = function(event){
    //Kode untuk menangani data
};


Deployment

Setelah kita menyelesaikan program Node.js, kita mungkin perlu meng-host program kita pada sebuah hosting agar program kita dapat diakses melalui internet.

Saat ini sudah cukup banyak jasa penyedia hosting Node.js di dalam maupun di luar negeri.

Jenis hosting yang bisa digunakan untuk Node.js adalah VPS, Dedicated Server, dan Container Application Platform.

VPS yang tersedia di dalam negeri bisa dicari di google dengan keyword:
VPS Indonesia
VPS yang tersedia di luar negeri bisa dicari di google dengan keyword:
VPS
Jika ingin mencari dedicated server, tinggal ganti keyword "VPS" dengan "Dedicated Server".

Sedangkan, untuk jenis Container Application Platform, kita bisa cari dengan keyword:
Node.js hosting
Atau jika ingin mencari yang lokal:
Node.js hosting Indonesia

Cara Men-Deploy Program Node.js di Heroku

Sekarang, kita akan mencoba melakukan deployment program Node.js pada Container Application Platform.

Karena saya ingin yang gratis, saya akan mencobanya di Heroku.

Sebelumnya, kita harus memiliki sebuah aplikasi web terlebih dahulu untuk dicoba.

Jadi, buatlah project baru pada folder "mynodedeploy" dengan NPM, kemudian buat script bernama "index.js".

Berikut ini adalah isi dari file "index.js":

var http= require('http');

http.createServer(function (req, res) {
 res.writeHead(200, {'Content-Type': 'text/html'});
 res.end('Hello World!');
}).listen((process.env.PORT || 5000)); //YANG INI

Perhatikan bagian ini:

}).listen((process.env.PORT || 5000));

Di situ kita menggunakan process.env.PORT agar port yang ditentukan tergantung dari environment variable.

Di Heroku, kita tidak bisa menentukan di port berapa program Node.js kita berjalan.

Oleh karena itu, kita menggunakan port sesuai dengan yang ada pada environment variable.

Juga, pastikan file "package.json" kita seperti ini:

{
"name": "bab-10",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Lusfikar Sheba",
"license": "UNLICENSED"
}

Pastikan yang digarisbawahi di package.json tadi ada.

Sekarang persiapan kode kita selesai.

Selanjutnya, daftarkan akun Anda terlebih dahulu di Heroku (https://www.heroku.com/).

Kemudian, buat app baru dan beri nama "mynodedeploy" jika nama tersebut tersedia:



Setelah selesai, Anda siap untuk menguploadnya.

Pastikan Anda sudah menginstall semua software yang dibutuhkan:
    • Git For Windows( https://git-for-windows.github.io/ )
    • Heroku Client ( https://devcenter.heroku.com/articles/heroku-cli )

Sekarang buka command line, masuk ke folder "mynodedeploy":
cd mynodedeploy
Jalankan perintah ini:
heroku login
Isi email dan password Anda.

Kemudian jalankan perintah ini:
git init
heroku git:remote -a mynodedeploy
git add .
git commit -am "make it better"
git push heroku master
Tunggu sampai proses upload selesai.

Setelah itu buka browser ke:
https://mynodedeploy.herokuapp.com/
Untuk mengupdate saja, cukup dengan perintah ini:
heroku login
git add .
git commit -am "make it better"
git push heroku master
Nama subdomain sama dengan nama App yang telah kita berikan.

Kalau Anda tidak bisa membuatnya dengan nama "mynodedeploy", tinggal ganti saja perintah-perintah tadi dengan nama project Anda.

Cara Men-Deploy Program Node.js di Ubuntu Server

Untuk men-deploy program Node.js di Ubuntu Server, kita harus memastikan bahwa kita telah meng-install Node.js di Ubuntu Server.

Cara menginstall Node.js di Ubuntu Server telah kita bahas pada bagian sebelumnya.

Selanjutnya kita juga perlu meng-install PM2.

PM2 adalah process manager untuk Node.js.

Dengan PM2, kita bisa menjalankan dan menghentikan script Node.js dengan comand line.

Agar bisa meng-install-nya di Ubuntu Server, kita memerlukan aplikasi Putty jika sistem operasi client menggunakan Windows.

Download Putty di sini:
http://www.putty.org/
Selanjutnya, buka Putty ke IP Address VPS kita.

Setelah login ke SSH, kita bisa menginstall PM2 dengan perintah ini:
sudo npm install -g pm2
Jika katakanlah, kita memiliki sebuah script bernama "hello.js", maka kita bisa menjalankan script tersebut dengan PM2 seperti ini:
pm2 start hello.js
Sedangkan, untuk menghentikannya, gunakan perintah ini:
pm2 stop hello.js
Untuk me-restart-nya, gunakan perintah ini:
pm2 restart hello.js
Untuk melihat daftar program Node.js yang dijalankan PM2, gunakan perintah ini:
pm2 list
Untuk melihat status, CPU, dan memory usage, gunakan perintah ini:
pm2 monit

Praktikum 1: Web System Monitor

Baca artikel "Cara Membuat Aplikasi Web System Monitor dengan Node.js" ini.

Praktikum 2: Pastebin Clone

Baca artikel "Cara Membuat Aplikasi Clone Pastebin dengan Node.js" ini.