0% menganggap dokumen ini bermanfaat (0 suara)
316 tayangan52 halaman

Pengenalan Nodejs

Buku ini membahas tentang pemrograman aplikasi web menggunakan Node.js, mulai dari pengantar Node.js, konsep asynchronous I/O dan event, membangun server HTTP dasar, penggunaan modul NPM, framework ExpressJS, database seperti SQLite dan MongoDB, pengujian kode dengan Mocha, dan contoh-contoh aplikasi seperti REST API dan pengunggahan gambar.

Diunggah oleh

En Kilah
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
316 tayangan52 halaman

Pengenalan Nodejs

Buku ini membahas tentang pemrograman aplikasi web menggunakan Node.js, mulai dari pengantar Node.js, konsep asynchronous I/O dan event, membangun server HTTP dasar, penggunaan modul NPM, framework ExpressJS, database seperti SQLite dan MongoDB, pengujian kode dengan Mocha, dan contoh-contoh aplikasi seperti REST API dan pengunggahan gambar.

Diunggah oleh

En Kilah
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 52

Table

of Contents
1. Introduction
2. Node.js
i. JavaScript Di Server
ii. Node.js In Action
3. Asinkron I/O & Event
i. PHP & Server HTTP Apache
ii. Javascript & Node.js
4. Server HTTP Dasar
i. Menjalankan Server
5. Server File Statis
i. Kode
6. Pemrosesan Data Form HTML
i. URL Encode
ii. Multipart Data
7. Module Npm
i. Konsep
ii. Paket npm
8. ExpressJS
i. Server File
i. Kode
ii. Middleware
iii. Akses Server
ii. Server REST
9. Database
i. SQLite
i. Node Sqlite3
ii. Enkripsi
i. sqlcipher
ii. MySQL
iii. MongoDB
iv. Knex.js
10. Testing
i. Mocha
11. Person REST API
i. Cara Kerja
ii. Kode
12. Image Uploader
13. Tentang Pengarang

Aplikasi Web Node.js


Note: This book is written in Indonesian and the main reason for that is most of Node.js beginners in my country is
having difficulties to find Node.js resources written in my native language Bahasa Indonesia.

Buku
Buku ini cocok bagi siapa saja yang ingin mulai belajar pemrograman di platform Node.js khususnya untuk membangun
aplikasi web.
Syarat yang dibutuhkan adalah pembaca setidaknya pernah atau sudah bisa memakai bahasa JavaScript.

Lisensi
Aplikasi Web Node.js oleh Equan Pr. di kerjakan di bawah lisensi Creative Commons Attribution-ShareAlike 4.0
International License.

Berdasarkan pada ebook di https://github.com/idjs/belajar-nodejs.


Untuk pertanyaan, kesalahan ketik atau permintaan bisa menghubungi melalui email byte[at]equan.me

Node.js
Javascript merupakan bahasa pemrograman yang lengkap hanya saja selama ini di pakai sebagai bahasa untuk
pengembangan aplikasi web yang berjalan pada sisi client atau browser saja. Tetapi sejak ditemukannya Node.js oleh
Ryan Dhal pada tahun 2009, Javascript bisa digunakan sebagai bahasa pemrograman di sisi server sekelas dengan PHP,
ASP, C#, Ruby dll dengan katak lain Node.js menyediakan platform untuk membuat aplikasi Javascript dapat dijalankan di
sisi server.
Untuk mengeksekusi Javascript sebagai bahasa server diperlukan engine yang cepat dan mempunyai performansi yang
bagus. Engine Javascript dari Google bernama V8 yang dipakai oleh Node.js yang merupakan engine yang sama yang
dipakai di browser Google Chrome.

JavaScript Di Server
Tak terelakkan bahwa Javascript merupakan bahasa pemrograman yang paling populer. Jika anda sebagai developer
pernah mengembangkan aplikasi web maka penggunaan Javascript pasti tidak terhindarkan.
Sekarang dengan berjalannya Javascript di server lalu apa keuntungan yang anda peroleh dengan mempelajari Node.js,
kurang lebih seperti ini :
Pengembang hanya memakai satu bahasa untuk mengembangkan aplikasi lengkap client & server sehingga
mengurangi 'Learning Curve' untuk mempelajari bahasa server yang lain.
Sharing kode antara client dan server atau istilahnya code reuse.
Javascript secara native mendukung JSON yang merupakan standar transfer data yang banyak dipakai saat ini
sehingga untuk mengkonsumsi data-data dari pihak ketiga pemrosesan di Node.js akan sangat mudah sekali.
Database NoSQL seperti MongoDB dan CouchDB mendukung langsung Javascript sehingga interfacing dengan
database ini akan jauh lebih mudah.
Node.js memakai V8 yang selalu mengikuti perkembangan standar ECMAScript, jadi tidak perlu ada kekhawatiran
bahwa browser tidak akan mendukung fitur-fitur di Node.js.

Node.js In Action
Supaya anda lebih tertarik dalam belajar Node.js berikut beberapa website terkenal yang sudah memakai Node.js
www.myspace.com

www.yummly.com

www.shutterstock.com

www.klout.com

www.geekli.st

www.learnboost.com

Apakah masih ragu untuk memakai Node.js ?...Kalau masih penasaran apa yang membuat Node.js berbeda dari backend
pada umumnya, silahkan dilanjutkan membaca :smile:

Asinkron I/O & Event


Tidak seperti kebanyakan bahasa backend lainnya operasi fungsi di javascript lebih bersifat asinkron dan banyak
menggunakan event demikian juga dengan Node.js. Sebelum penjelasan lebih lanjut mari kita lihat terlebih dahulu tentang
metode sinkron seperti yang dipakai pada PHP dengan web server Apache.

PHP & Server HTTP Apache


Mari kita lihat contoh berikut yaitu operasi fungsi akses ke database MySQL oleh PHP yang dilakukan secara sinkron

$hasil = mysql_query("SELECT * FROM TabelAnggota");


print_r($hasil);

pengambilan data oleh mysql_query() diatas akan dijalankan dan operasi berikutnya print_r() akan diblok atau tidak
akan berjalan sebelum akses ke database selesai. Yang perlu menjadi perhatian disini yaitu proses Input Output atau I/O
akses ke database oleh mysql_query() dapat memakan waktu yang relatif mungkin beberapa detik atau menit tergantung
dari waktu latensi dari I/O. Waktu latensi ini tergantung dari banyak hal seperti
Query database lambat akibat banyak pengguna yang mengakses
Kualitas jaringan untuk akses ke database jelek
Proses baca tulis ke disk komputer database yang membutuhkan waktu
...
Sebelum proses I/O selesai maka selama beberapa detik atau menit tersebut state dari proses mysql_query() bisa dibilang
idle atau tidak melakukan apa-apa.
Lalu jika proses I/O di blok bagaimana jika ada request lagi dari user ? apa yang akan dilakukan oleh server untuk
menangani request ini ?..penyelesaiannya yaitu dengan memakai pendekatan proses multithread . Melalui pendekatan ini
tiap koneksi yang terjadi akan ditangani oleh thread . Thread disini bisa dikatakan sebagai task yang dijalankan oleh
prosesor komputer.
Sepertinya permasalahan I/O yang terblok terselesaikan dengan pendekatan metode ini tetapi dengan bertambahnya
koneksi yang terjadi maka thread akan semakin banyak sehingga prosesor akan semakin terbebani, belum lagi untuk
switching antar thread menyebabkan konsumsi memory (RAM) komputer yang cukup besar.
Berikut contoh benchmark antara web server Apache dan Nginx (server HTTP seperti halnya Apache hanya saja Nginx
memakai sistem asinkron I/O dan event yang mirip Node.js). Gambar ini diambil dari goo.gl/pvLL4

Bisa dilihat bahwa Nginx bisa menangani request yang jauh lebih banyak daripada web server Apache pada jumlah
koneksi bersama yang semakin naik.

Javascript & Node.js


Kembali ke Javascript!. Untuk mengetahui apa yang dimaksud dengan pemrograman asinkron bisa lebih mudah dengan
memakai pendekatan contoh kode. Perhatikan kode Javascript pada Node.js berikut

var fs = require('fs');
fs.readFile('./resource.json',function(err, data){
if(err) throw err;
console.log(JSON.parse(data));
});
console.log('Selanjutnya...');

fungsi readFile() akan membaca membaca isi dari file resource.json secara asinkron yang artinya proses eksekusi
program tidak akan menunggu pembacaan file resource.json sampai selesai tetapi program akan tetap menjalankan kode
Javascript selanjutnya yaitu console.log('Selanjutnya...') . Sekarng lihat apa yang terjadi jika kode javascript diatas
dijalankan

Jika proses pembacaan file resource.json selesai maka fungsi callback pada readFile() akan di jalankan dan hasilnya
akan ditampilkan pada console. Yah, fungsi callback merupakan konsep yang penting dalam proses I/O yang asinkron
karena melalui fungsi callback ini data data yang dikembalikan oleh proses I/O akan di proses.
Lalu bagaimana platform Node.js mengetahui kalau suatu proses itu telah selesai atau tidak ?...jawabannya adalah Event
Loop. Event - event yang terjadi karena proses asinkron seperti pada fungsi fs.readFile() akan ditangani oleh yang
namanya Event Loop ini.
Campuran teknologi antara event driven dan proses asinkron ini memungkinkan pembuatan aplikasi dengan penggunaan
data secara masif dan real-time. Sifat komunikasi Node.js I/O yang ringan dan bisa menangani user secara bersamaan
dalam jumlah relatif besar tetapi tetap menjaga state dari koneksi supaya tetap terbuka dan dengan penggunaan memori
yang cukup kecil memungkinkan pengembangan aplikasi dengan penggunaan data yang besar dan kolaboratif...Yeah,
Node.js FTW! :metal:

Server HTTP Dasar


Penggunaan Node.js yang revolusioner yaitu sebagai server. Yup...mungkin kita terbiasa memakai server seperti Apache PHP, Nginx - PHP, Java - Tomcat - Apache atau IIS - ASP.NET sebagai pemroses data di sisi server, tetapi sekarang
semua itu bisa tergantikan dengan memakai JavaScript - Node.js!. Lihat contoh dasar dari server Node.js berikut (kode
sumber pada direktori code pada repositori ini)
server-http.js

var http = require('http'),


PORT = 3400;
var server = http.createServer(function(req, res){
var body = "<pre>Haruskah belajar Node.js?</pre><p><h3>...Yo Mesto!</h3></p>"
res.writeHead(200, {
'Content-Length':body.length,
'Content-Type':'text/html',
'Pesan-Header':'Pengenalan Node.js'
});
res.write(body);
res.end();
});
server.listen(PORT);
console.log("Port "+PORT+" : Node.js Server...");

Paket http merupakan paket bawaan dari platform Node.js yang mendukung penggunaan fitur-fitur protokol HTTP. Object
server merupakan object yang di kembalikan dari fungsi createServer() .

var server = http.createServer([requestListener])

Tiap request yang terjadi akan ditangani oleh fungsi callback requestListener . Cara kerja callback ini hampir sama dengan
ketika kita menekan tombol button html yang mempunyai atribut event onclick , jika ditekan maka fungsi yang teregistrasi
oleh event onclick yaitu clickHandler(event) akan dijalankan.
onclick-button.html

<script>
function clickHandler(event){
console.log(event.target.innerHTML+" Terus!");
}
</script>
<button onclick="clickHandler(event)">TEKAN</button>

Sama halnya dengan callback requestListener pada object server ini jika ada request maka requestListener akan
dijalankan

function(req, res){
var body = "<pre>Haruskah belajar Node.js?</pre><p><h3>...Yo Mesto!</h3></p>"
res.writeHead(200, {
'Content-Length':body.length,
'Content-Type':'text/html',
'Pesan-Header':'Pengenalan Node.js'
});
res.write(body);
res.end();
}

Paket http Node.js memberikan keleluasan bagi developer untuk membangun server tingkat rendah. Bahkan mudah saja
kalau harus men-setting nilai field header dari HTTP.
Seperti pada contoh diatas agar respon dari request diperlakukan sebagai HTML oleh browser maka nilai field ContentType harus berupa text/html . Setting ini bisa dilakukan melalui metode writeHead() , res.setHeader(field, value) dan

beberapa metode lainnya.


Untuk membaca header bisa dipakai fungsi seperti res.getHeader(field, value) dan untuk menghapus field header
tertentu dengan memakai fungsi res.removeHeader(field) . Perlu diingat bahwa setting header dilakukan sebelum fungsi
res.write() atau res.end() di jalankan karena jika res.write() dijalankan tetapi kemudian ada perubahan field header

maka perubahan ini akan diabaikan.


Satu hal lagi yaitu tentang kode status dari respon HTTP. Kode status ini bisa disetting selain 200 (request http sukses),
misalnya bila diperlukan halaman error dengan kode status 404.

Menjalankan Server
Untuk menjalankan server Node.js ketik perintah berikut di terminal

$ node server-http.js
Port 3400 : Node.js Server...

Buka browser (chrome) dan buka url http://localhost:3400 kemudian ketik CTRL+SHIFT+I untuk membuka Chrome Dev
Tool, dengan tool ini bisa dilihat respon header dari HTTP dimana beberapa fieldnya telah diset sebelumnya (lingkaran
merah pada screenshot dibawah ini).

Server File Statis


Aplikasi web memerlukan file - file statis seperti CSS, font dan gambar atau file - file library JavaScript agar aplikasi web
bekerja sebagaimana mestinya. File - file ini sengaja dipisahkan agar terstruktur dan secara best practices file - file ini
memang harus dipisahkan. Lalu bagaimana caranya Node.js bisa menyediakan file - file ini ?...ok mari kita buat server
Node.js yang fungsinya untuk menyediakan file statis.
Agar server Node.js bisa mengirimkan file statis ke klien maka server perlu mengetahui path atau tempat dimana file
tersebut berada.
Node.js bisa mengirimkan file tersebut secara streaming melalui fungsi fs.createReadStream() . Sebelum dijelaskan lebih
lanjut mungkin bisa dilihat atau di coba saja server file Node.js dibawah ini
server-file.js

var http = require('http'),


parse = require('url').parse,
join = require('path').join,
fs = require('fs'),
root = join(__dirname, 'www'),
PORT = 3300,
server = http.createServer(function(req, res){
var url = parse(req.url),
path = join(root, url.pathname),
stream = fs.createReadStream(path);
stream.on('data', function(bagian){
res.write(bagian);
});
stream.on('end', function(){
res.end();
});
stream.on('error', function(){
res.setHeader('Content-Type','text/html');
var url_demo = "http://localhost:"+PORT+"/index.html";
res.write("coba buka <a href="+url_demo+">"+url_demo+"</a>");
res.end();
})
});
server.listen(PORT);
console.log('Port '+PORT+': Server File ');

Berikut sedikit penjelasan dari kode diatas


__dirname merupakan variabel global yang disediakan oleh Node.js yang berisi path direktori dari file yang sedang

aktif mengeksekusi __dirname .


root merupakan direktori root atau referensi tempat dimana file-file yang akan dikirimkan oleh server Node.js. Pada

kode server diatas direktori root di setting pada direktori www .


path adalah path file yang bisa didapatkan dengan menggabungkan path direktori root dan pathname . pathname yang

dimaksud di sini misalnya jika URL yang diminta yaitu http://localhost:3300/index.html maka pathname adalah
/index.html . Nilai variabel path dihasilkan dengan memakai fungsi join() .

var path = join(root, url.pathname)

stream yang di kembalikan oleh fungsi fs.createReadStream() merupakan class stream.Readable . Objek stream ini

mengeluarkan data secara streaming untuk di olah lebih lanjut. Perlu menjadi catatan bahwa stream.Readable tidak

akan mengeluarkan data jikalau tidak di kehendaki. Nah...cara untuk mendeteksi data streaming ini sudah siap di
konsumsi atau belum adalah melalui event.
Event yang di dukung oleh class stream.Readable adalah sebagai berikut
Event: readable
Event: data
Event: end
Event: error
Event: close
Mungkin anda bertanya kenapa server file statis diatas memakai stream, bukankah menyediakan file secara langsung saja
sudah bisa? jawabannya memang bisa, tetapi mungkin tidak akan efisien kalau file yang akan di berikan ke client
mempunyai ukuran yang besar. Coba lihat kode berikut

var http = require('http');


var fs = require('fs');
var server = http.createServer(function (req, res) {
fs.readFile(__dirname + '/data.txt', function (err, data) {
res.end(data);
});
});
server.listen(8000);

Jika file data.txt terlalu besar maka buffer yang digunakan oleh sistem juga besar dan konsumsi memori juga akan
bertambah besar seiring semakin banyak pengguna yang mengakses file ini.
Jika anda ingin lebih banyak mendalami tentang Node.js Stream silahkan lihat resource berikut (dalam Bahasa Inggris):
Node.js API Stream
Stream Handbook

Kode
Agar server Node.js bisa mengirimkan file statis ke klien maka server perlu mengetahui path atau tempat dimana file
tersebut berada.
Node.js bisa mengirimkan file tersebut secara streaming melalui fungsi fs.createReadStream() . Sebelum dijelaskan lebih
lanjut mungkin bisa dilihat atau di coba saja server file Node.js dibawah ini
server-file.js

var http = require('http'),


parse = require('url').parse,
join = require('path').join,
fs = require('fs'),
root = join(__dirname, 'www'),
PORT = 3300,
server = http.createServer(function(req, res){
var url = parse(req.url),
path = join(root, url.pathname),
stream = fs.createReadStream(path);
stream.on('data', function(bagian){
res.write(bagian);
});
stream.on('end', function(){
res.end();
});
stream.on('error', function(){
res.setHeader('Content-Type','text/html');
var url_demo = "http://localhost:"+PORT+"/index.html";
res.write("coba buka <a href="+url_demo+">"+url_demo+"</a>");
res.end();
})
});
server.listen(PORT);
console.log('Port '+PORT+': Server File ');

Berikut sedikit penjelasan dari kode diatas


__dirname merupakan variabel global yang disediakan oleh Node.js yang berisi path direktori dari file yang sedang

aktif mengeksekusi __dirname .


root merupakan direktori root atau referensi tempat dimana file-file yang akan dikirimkan oleh server Node.js. Pada

kode server diatas direktori root di setting pada direktori www .


path adalah path file yang bisa didapatkan dengan menggabungkan path direktori root dan pathname . pathname yang

dimaksud di sini misalnya jika URL yang diminta yaitu http://localhost:3300/index.html maka pathname adalah
/index.html . Nilai variabel path dihasilkan dengan memakai fungsi join() .

var path = join(root, url.pathname)

stream yang di kembalikan oleh fungsi fs.createReadStream() merupakan class stream.Readable . Objek stream ini

mengeluarkan data secara streaming untuk di olah lebih lanjut. Perlu menjadi catatan bahwa stream.Readable tidak
akan mengeluarkan data jikalau tidak di kehendaki. Nah...cara untuk mendeteksi data streaming ini sudah siap di
konsumsi atau belum adalah melalui event.
Event yang di dukung oleh class stream.Readable adalah sebagai berikut
Event: readable

Event: data
Event: end
Event: error
Event: close
Mungkin anda bertanya kenapa server file statis diatas memakai metode stream, bukankah menyediakan file secara
langsung saja sudah bisa? jawabannya memang bisa tetapi mungkin tidak akan efisien kalau file yang akan di berikan ke
client mempunyai ukuran yang cukup besar. Coba lihat kode berikut ini

var http = require('http');


var fs = require('fs');
var server = http.createServer(function (req, res) {
fs.readFile(__dirname + '/data.txt', function (err, data) {
res.end(data);
});
});
server.listen(8000);

Jika file data.txt ukurannya terlalu besar maka buffer yang digunakan oleh sistem juga besar sehingga konsumsi memori
juga akan bertambah besar seiring semakin banyak pengguna yang mengakses file ini.
Jika anda ingin lebih banyak mendalami tentang Node.js Stream silahkan lihat resource berikut (dalam Bahasa Inggris)
Node.js API Stream
Stream Handbook

Pemrosesan Data Form HTML


Aplikasi web memperoleh data dari pengguna umumnya melalui pengisian form HTML. Contohnya seperti ketika registrasi
di media sosial atau aktifitas update status di Facebook misalnya pasti akan mengisi text field dan kemudian menekan
tombol submit ataupun enter agar data bisa terkirim dan diproses oleh server.
Data yang dikirim oleh form biasanya salah satu dari dua tipe mime berikut
application/x-www-form-urlencoded
multipart/form-data
Node.js sendiri hanya menyediakan parsing data melalui body dari request sedangkan untuk validasi atau pemrosesan
data akan diserahkan kepada komunitas.

URL Encode
Hanya akan dibahas untuk 2 metode HTTP yaitu GET dan POST saja. Metode GET untuk menampilkan form html dan
POST untuk menangani data form yang dikirim

Ok langsung kita lihat kode server sederhana untuk parsing data form melalui objek request dengan data form bertipe
application/x-www-form-urlencoded yang merupakan default dari tag form.

var http = require('http');


var data = [];
var qs = require('querystring');
var server = http.createServer(function(req, res){
if('/' == req.url){
switch(req.method){
case 'GET':
tampilkanForm(res);
break;
case 'POST':
prosesData(req, res);
break;
default:
badRequest(res);
}
} else {
notFound(res);
}
});
function tampilkanForm(res){
var html = '<html><head><title>Data Hobiku</title></head><body>'
+ '<h1>Hobiku</h1>'
+ '<form method="post" action="/">'
+ '<p><input type="text" name="hobi"></p>'
+ '<p><input type="submit" value="Simpan"></p>'
+ '</form></body></html>';
res.setHeader('Content-Type', 'text/html');
res.setHeader('Content-Length', Buffer.byteLength(html));
res.end(html);
}
function prosesData(req, res) {
var body= '';
req.setEncoding('utf-8');
req.on('data', function(chunk){
body += chunk;
});
req.on('end', function(){
var data = qs.parse(body);
res.setHeader('Content-Type', 'text/plain');
res.end('Hobiku: '+data.hobi);
});
}
function badRequest(res){
res.statusCode = 400;
res.setHeader('Content-Type', 'text/plain');
res.end('400 - Bad Request');
}
function notFound(res) {
res.statusCode = 404;
res.setHeader('Content-Type', 'text/plain');
res.end('404 - Not Found');
}
server.listen(3003);
console.log('server http berjalan pada port 3003');

Untuk mengetest GET dan POST bisa dilakukan melalui curl, browser atau melalui gui Postman.

GET

POST

module querystring dari Node.js berfungsi untuk mengubah url encoded string menjadi objek JavaScript. Contohnya

querystring.parse('nama=lanadelrey&job=singer&album=borntodie&ultraviolence');
// returns
{ nama: 'lanadelrey', job: 'singer',album: ['borntodie', 'ultraviolence']}

Multipart Data
(TODO)

Module Npm
nice people matter

npm merupakan package manager untuk Node.js dan untuk nama npm bukanlah suatu singkatan. Hanya dalam waktu 2
tahun sejak di releasenya Node.js ke publik jumlah modul melesat jauh bahkan hampir menyamai modul java ataupun ruby
gems.

Grafik diatas didapat dari http://modulecounts.com.


Banyaknya push module ke repositori npm dapat diartikan adanya kepercayaan publik terhadap platform ini dan untuk
kedepannya Node.js akan menjadi platform yang prospektif untuk berinvestasi.

Konsep
npm memakai sistem modul CommonJS yang cukup mudah dalam penggunaanya. Sistem modul ini akan meng-export
objek JavaScript ke variabel exports yang bersifat global di modul tersebut.
Sebagai contoh
band.js

'use strict';
function Band(){}
Band.prototype.info = function(){
return 'Nama Band: '+this.name;
}
Band.prototype.add = function(name){
this.name = name;
}
module.exports = new Band();

Untuk pemakaiannya seperti di bawah ini


app.js

var band = require('./band.js');


band.add('Dewa 19');
console.log(band.info);

require() diatas adalah fungsi sinkron yang meload paket atau modul lain dari sistem file.

Paket npm
Secara default data paket npm disimpan di registry npmjs.org. Sehingga untuk menginstall paket npm tertentu anda bisa
mencari paket ini melalui command npm atau langsung melalui website.
Sejak versi Node.js 0.6.3 command npm sudah ter-bundle dengan installer Node.js. Untuk menginstall modul npm yang
anda butuhkan ketik misalnya

npm install express

perintah diatas akan mendownload paket express dari http://npmjs.org dan secara otomatis akan membuat directory
node_modules .

Untuk memakai modul express ini cukup dengan membuat file JavaScript baru di luar direktori node_modules dan load
modul dengan keyword require .

var app = require('express');


// kode lainnya

Membuat Paket npm


Sebelum membuat paket npm pastikan fungsionalitas yang anda cari tidak ada dalam registry npm. Caranya yaitu anda
bisa menggunakan perintah

npm search

atau dengan memakai website berikut npmjs.org, node-modules.com atau npmsearch.com


Untuk membuat paket npm caranya cukup mudah. Berikut alur umum untuk membuat paket npm untuk di publish ke
registry npmjs.org .

Secara garis besar proses pembuatan paket npm menurut alur diatas akan dijelaskan sebagai berikut

Registrasi
Sebelum publish ke registry npmjs.org kita harus registrasi dulu melalui perintah berikut

npm adduser

Buat Project

Untuk membuat project baru dari nol langkah pertama adalah membuat direktori

mkdir npmproject

Kemudian inisialisasi project tersebut

npm init

perintah diatas akan membuat file package.json yang isinya adalah info dan dependensi project. Ikuti saja tiap pertanyaan
dan isi informasi sesuai dengan paket yang ingin anda buat.
Contohnya pada paket svh berikut ini
package.json

{
"name": "svh",
"version": "0.0.7-beta",
"author": "Equan Pr.",
"description": "Simple file server for html-javascript web client app development",
"keywords": [
"process",
"reload",
"watch",
"development",
"restart",
"server",
"monitor",
"auto",
"static",
"nodemon"
],
"homepage": "https://github.com/junwatu/svh",
"bugs": "https://github.com/junwatu/svh/issues",
"main": "./lib/core.js",
"scripts": {
"test": "./node_modules/mocha/bin/mocha"
},
"dependencies": {
"async": "~0.2.9",
"chalk": "0.2.x",
"cheerio": "0.12.x",
"commander": "2.0.x",
"compression": "^1.0.2",
"concat-stream": "1.0.x",
"express": "4.x",
"morgan": "^1.1.1",
"send": "^0.3.0",
"watch": "0.8.x",
"wordgenerator": "0.0.1"
},
"devDependencies": {
"gulp": "^3.5.6",
"gulp-uglifyjs": "^0.3.0",
"gulp-util": "2.2.14",
"mocha": "1.13.x",
"supertest": "0.8.x"
},
"repository": {
"type": "git",
"url": "http://github.com/junwatu/svh.git"
},
"bin": {
"svh": "./bin/svh"
},
"license": "MIT"
}

Publish Lokal

Sebelum di publish pastikan paket anda bisa berjalan atau digunakan pada komputer lokal. Perintah berikut akan
menginstall paket anda secara global di komputer.

npm publish . -g

atau jika diinginkan link simbolik bisa memakai perintah npm berikut

npm link

Publish Publik
npm publish

Untuk lebih jelasnya silahkan kunjungi dokumentasi untuk developer npm.

ExpressJS
Untuk memudahkan pembuatan aplikasi web anda bisa menggunakan framework ExpressJS daripada harus
menggunakan module http bawaan Node.js. Framework ini menawarkan beberapa fitur seperti routing, rendering view dan
mendukung middleware dengan kata lain anda akan banyak menghemat waktu dalam pengembangan aplikasi Node.js.
ExpressJS merupakan framework minimal yang sangat fleksibel. Anda bisa membuat web server HTML, server file statik,
aplikasi chat, search engine, sosial media, layanan web dengan akses melalui REST API atau aplikasi hybrid yaitu selain
pengguna mempunyai akses melalui REST API juga mempunyai akses ke HTML page.

Server File
Sebelumnya bikin project kecil dengan mengetikkan perintah berikut pada direktori project

$ npm init

dan berikan nama project sebagai server-file-statik . Direktori project dari server file bisa dilihat pada sususan tree
dibawah ini.
Susunan file dan direktori

server-file-statis
package.json
app.js
node_modules
publik
index.html

Dengan adanya npm instalasi ExpressJS sangat mudah, ketik perintah berikut pada direktori project.

$ npm install express --save

Catatan :
Perintah diatas akan menginstall ExpressJS dengan versi yang paling terbaru (pada saat buku ini ditulis versi terbaru
adalah 4.x). Jika membutuhkan versi tertentu cukup dengan menambahkan '@' dan nomer versi yang akan di
inginkan seperti contoh berikut

$ npm install express@3 --save

Untuk kedepannya bahasan mengenai ExpressJS ini akan memakai versi 4.x.

Kode
Jika anda ingat server file yang memakai modul http pada bab sebelumnya berikut merupakan versi yang memakai
ExpressJS
app.js

'use strict';
var express = require('express');
var server = express();
var logger = require('morgan');
server.use(logger('dev'));
server.use(express.static(__dirname+'/publik'));
server.listen(4000, function(){
console.log('Server file sudah berjalan bos!');
});

Seperti yang dijelaskan pada bab sebelumnya untuk memakai module Node.js di gunakan keyword require .
Modul express akan menangani tiap request dari user dan kemudian akan memberikan response berupa file yang
diinginkan. Pada kode diatas file yang akan diberikan ke pengguna disimpan pada folder publik .

Middleware
Fungsionalitas yang diberikan oleh ExpressJS di bantu oleh yang namanya middleware yaitu fungsi asinkron yang bisa
mengubah request dan respon di server.
Pada kode diatas contoh middleware yaitu modul morgan . Cara pemakaian middleware yaitu melalui app.use() .
Module morgan merupakan modul untuk logger yang berfungsi untuk pencatatan tiap request ke server. Pencatatan ini
atau istilahnya logging akan ditunjukkan di console terminal.
Untuk menginstall modul ini ketik perintah berikut

$ npm install morgan --save

Middleware middleware ini bisa anda lihat di link berikut


https://github.com/senchalabs/connect#middleware

Akses Server
Untuk menjalankan server file statik ini

$ node app.js

Anda bisa meletakkan file apa saja pada direktori 'publik'. Untuk mengakses server ini ketik alamat berikut pada browser

http://localhost:4000

dan secara default akan menampilkan file index.html di browser.


Untuk mengakses file yang lain format URL adalah

http://localhost:4000/[nama-file]

misalnya untuk mengakses file img.jpg

Server REST
Framework ExpressJS sangat banyak digunakan sebagai aplikasi RESTful. Bagi anda yang belum tahu, REST atau
Representational State Transfer adalah arsitektur yang digunakan dalam desain aplikasi network. Idenya yaitu daripada
memakai teknik seperti CORBA, SOAP atau RPC untuk membuat Web Service lebih baik jika memakai protokol HTTP
yang lebih mudah.
Aplikasi RESTful memakai request HTTP untuk operasi Create, Read, Update dan Delete data. REST itu sendiri bukanlah
suatu standard jadi tidak ada yang namanya spec dari W3C. Sehingga sangat mudah bagi bahasa pemrograman untuk
menggunakan arsitektur ini. Keuntungan lainnya yaitu dengan arsitektur ini bisa dibangun berbagai macam teknologi klien
seperti web atau mobile ataupun dekstop untuk mengakses aplikasi RESTful tersebut.
Untuk contoh aplikasi RESTful memakai ExpressJS akan diberikan pada Bab 9 Person REST API.

Database
Berkembang pesatnya komunitas Node.js menyebabkan dukungan pustaka yang semakin cepat juga. Dengan waktu yang
relatif cepat platform ini sekarang mendukung banyak tipe database seperti SQLite, MySQL, MongoDB, Redis, CouchDB
dll. Dalam buku ini hanya akan dibahasa 3 database saja yaitu SQLite, MySQL dan MongoDB.

SQLite
Mungkin database ini sudah tidak asing lagi bagi developer seperti anda karena memang banyak digunakan dalam aplikasi
portable dan embeddable.
Kekuatan SQLite secara garis besar sebagai berikut
Serverless
SQLite tidak memerlukan proses lain untuk beroperasi seperti pada database lain yang umumnya sebagai server. Library
SQLite akan mengakses file data secara langsung.
Zero Configuration
Karena sifatnya bukan server maka database ini tidak memerlukan setup tertentu. Untuk membuat database cukup seperti
ketika membuat file baru.
Cross-Platfrom
Semua data tersimpan pada satu sistem file yang bersifat cross platform dan tidak memerlukan administrasi.
Self-Contained
Library SQLite sudah mencakup semua sistem database sehingga dengan mudah dapat diintegrasikan ke aplikasi host.
Small Runtime Footprint
Ukuran default dari SQLite ini kurang dari 1MB dan membutuhkan hanya beberapa Megabyte memory.
Transactional
Operasi transaksi kompatibel dengan ACID sehingga aman kalau harus mengakses data dari proses banyak thread.
Untuk penjelasan lebih detil, silahkan kunjungi website resmi http://sqlite.org

node sqlite3
Komunitas node menyediakan banyak solusi untuk memakai SQLite di platform Node.js. Salah satu yang paling populer
adalah modul node-sqlite3 .

Instal
node sqlite3 merupakan binding modul JavaScript yang asinkron untuk database sqlite3.
Untuk penginstalan modul ini ketik perintah berikut

$ npm install sqlite3 --save

CRUD
Operasi database seperti Create, Read, Update dan Delete untuk database SQLite sangat mudah seperti pada contoh
berikut
app.js

/**
* Akses SQLite 3
*/
var sqlite = require('sqlite3').verbose();
var file = 'film.db';
var db = new sqlite.Database(file);
var fs = require('fs');
// Sample Data
var film = {
judul: "Keramat",
release: "2009",
imdb: "http://www.imdb.com/title/tt1495818/",
deskripsi: "Film horror paling horror!"
}
var filmUpdate = {
id: 1,
deskripsi: "Best Indonesian Horror Movie."
}

// SQL Statement
var CREATE_TABLE = "CREATE TABLE IF NOT EXISTS fdb ( id INTEGER PRIMARY KEY AUTOINCREMENT, judul TEXT NOT NULL, release TEXT NOT NULL,
var INSERT_DATA = "INSERT INTO fdb (judul, release, imdb, deskripsi) VALUES (?, ?, ?, ?)";
var SELECT_DATA = "SELECT * FROM fdb";
var UPDATE_DATA = "UPDATE fdb SET deskripsi=$deskripsi WHERE id=$id";
// Run SQL one at a time
db.serialize(function() {
// Create table
db.run(CREATE_TABLE, function(err) {
if (err) {
console.log(err);
} else {
console.log('CREATE TABLE');
}
});
// Insert data with sample data
db.run(INSERT_DATA, [film.judul, film.release, film.imdb, film.deskripsi], function(err) {
if (err) {
console.log(err);
} else {
console.log('INSERT DATA');
}
});

// Query all data


selectAllData();
// Update data
db.run(UPDATE_DATA, {$deskripsi: filmUpdate.deskripsi, $id: filmUpdate.id}, function(err){
if(err) {
console.log(err);
} else {
console.log('UDATE DATA');
}
});
selectAllData();
db.run('DELETE FROM fdb WHERE id=$id', {$id:1}, function(err){
if(err) {
console.log(err)
} else {
console.log("DELETE DATA");
};
})
});
function selectAllData() {
db.each(SELECT_DATA, function(err, rows) {
if (!err) {
console.log(rows);
}
})
}

Aplikasi diatas akan membuat tabel fdb , memasukkan data baru kemudian data tersebut akan di update dan terakhir
akan dihapus.
Contoh diatas memakai API berikut ini
db.serialize()

db.run(operasi_sqlite, callback)

Dengan memakai fungsi db.serialize() maka eksekusi sql akan di eksekusi secara serial atau berurutan dan operasi
SQL apa saja bisa di eksekusi oleh node-sqlite3 dengan memakai metode db.run() tersebut.
Penjelasan API lebih lanjut untuk Node SQLite bisa dilihat pada link berikut
https://github.com/mapbox/node-sqlite3/wiki/API.

Enkripsi
Kalau anda memakai SQLite dan membutuhkan supaya database ini terenkripsi maka beruntunglah karena node sqlite3
mendukung penggunaan database SQLite yang terenkripsi.
Enkripsi yang didukung oleh SQLite yaitu melalui ekstensi sqlcipher . Sqlcipher merupakan ekstensi sqlite yang
mendukung enkripsi 256 bit AES. Ekstensi ini bisa di didownload melalui website berikut
https://github.com/sqlcipher/sqlcipher

sqlcipher
Instalasi ekstensi ini sangat mudah yaitu jika anda berada dalam lingkungan Linux

$ sudo apt-get install libsqlcipher-dev

Kemudian kompilasi ulang node-sqlite3 dengan perintah berikut ini

$ npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher \


--sqlite=/usr/

Untuk menggunakan fitur enkripsi ini peru ditambahkan beberapa baris kode berikut pada aplikasi node-sqlite3.

//encrypt database
db.run('PRAGMA key="passwordmu!"');

Pada contoh CRUD node-sqlite3 pada bagian sebelumnya kode diatas bisa dituliskan sebelum operasi CRUD atau pada
saat inisialisasi.

...
// Run SQL one at a time
db.serialize(function() {
//encrypt database
db.run('PRAGMA key="passwordmu!"');
// Create table
db.run(CREATE_TABLE, function(err) {
if (err) {
console.log(err);
} else {
console.log('CREATE TABLE');
}
});
...

Bandingkan jika SQLite tidak memakai enkripsi, anda bisa menggunakan SQLite Browser atau tool hexdump pada Linux

dan jika SQLite memakai enkripsi bisa dilihat dari screenshot dibawah ini bahwa isi dari database menjadi "meaningless".

MySQL
Kalau anda terbiasa dengan bahasa pemrograman PHP maka pasti sudah tidak asing lagi database relasional yang paling
banyak di pakai saat ini yaitu MySQL.

MongoDB

Query Builder Dengan Knex.js

Testing

Mocha - Chai - Sinon

Person REST API

Cara Kerja
(TODO)

Kode
(TODO)

Image Uploader

Tentang Pengarang
Equan Pr. adalah developer NodeJS dan peminum kopi kelas berat. Selalu sibuk dengan yang berbau JavaScript ketika di
depan komputer, penggila film dan musik metal.

Anda mungkin juga menyukai