Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

98
Pengembangan Aplikasi Cloud Computing Menggunakan Node.js Oleh: Bambang Purnomosidi D. P. (http://bpdp.name) Kontributor: Aji Kisworo Mukti (http://adzymaniac.web.id) Buku bebas dengan lisensi Creative Common BY-SA. Silahkan membaca isi selengkapnya serta penjelasannya di http://wiki.creativecommons.org/Licenses/by-sa/3.0LegalText_(Indonesian) May 6, 2013

description

Buku bebas karya saya tentang pengembangan aplikasi cloud computing menggunakan Node.js. Lisensi: CC-BY-SA. Kode sumber (LaTeX) serta kode sumber dari program2 yang ada di buku ini bisa diperoleh di akun github saya: https://github.com/bpdp/buku-cloud-nodejs

Transcript of Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Page 1: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Pengembangan Aplikasi Cloud ComputingMenggunakan Node.js

Oleh:

Bambang Purnomosidi D. P. (http://bpdp.name)Kontributor:

Aji Kisworo Mukti (http://adzymaniac.web.id)

Buku bebas dengan lisensi Creative Common BY-SA. Silahkan membaca isiselengkapnya serta penjelasannya di

http://wiki.creativecommons.org/Licenses/by-sa/3.0LegalText_(Indonesian)

May 6, 2013

Page 2: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Kata Pengantar

Buku bebas ini merupakan buku yang dirancang untuk keperluan memberikan penge-tahuan mendasar pengembangan aplikasi berbasis Cloud Computing, khususnya meng-gunakan Node.js. Pada buku ini akan dibahas penggunaan Node.js untuk mengem-bangkan aplikasi SaaS (Software as a Service). Node.js merupakan software di sisiserver yang dikembangkan dari engine JavaScript V8 dari Google serta libuv (https://github.com/joyent/libuv)1.Jika selama ini kebanyakan orang mengenal JavaScript hanya di sisi klien (browser),

dengan Node.js ini, pemrogram bisa menggunakan JavaScript di sisi server. Meskipunini bukan hal baru, tetapi paradigma pemrograman yang dibawa oleh Node.js denganevented - asynchronous I/O menarik dalam pengembangan aplikasi Web (selain kitahanya perlu menggunakan 1 bahasa yang sama di sisi server maupun di sisi klien).Untuk mengikuti materi yang ada pada buku ini, pembaca diharapkan menyiapkan

peranti komputer dengan beberapa software berikut terpasang:

X Sistem operasi Linux (distribusi apa saja) - lihat di http://www.distrowatch.com.Sistem operasi Linux ini bukan keharusan, anda bisa menggunakan Windows tetapisilahkan membuat penyesuaian-penyesuaian sendiri yang diperlukan. Kirimi sayapull request jika anda menuliskan pengalaman anda di Windows!

X Git (untuk version control system) - bisa diperoleh di http://git-scm.com. Sayamenggunakan versi 1.8.2.2.

X Ruby (http://www.ruby-lang.org/en/) - diperlukan untuk menginstall dan mengek-sekusi vmc, perintah command line untuk mengelola aplikasi Cloud di Cloud-Foundry. Versi Ruby yang digunakan adalah versi 2.0.0p0 (2013-02-24 revision39474).

X mongoDB (basis data NOSQL) - bisa diperoleh di http://www.mongodb.org, sayamenggunakan versi 2.4.4-pre-

X Vim (untuk mengedit source code) - bisa diperoleh di http://www.vim.org. Jikatidak terbiasa menggunakan Vim, bisa menggunakan editor teks lainnya (atauIDE), misalnya gedit (ada di GNOME), geany (http://geany.org), KATE (adadi KDE), dan lain-lain.

Software utama untuk keperluan workshop ini yaitu Node.js serta command line toolsdari provider Cloud Computing (materi ini menggunakan fasilitas dari CloudFoundry),akan dibahas pada pada bab-bab tertentu. Materi akan lebih banyak berorientasi ke com-mand line / shell sehingga para pembaca sebaiknya sudah memahami cara-cara menggu-nakan shell di Linux. Anda bisa menggunakan shell apa saja (bash, tcsh, zsh, ksh, danlain-lain), saya menggunakan bash 4.2.45(2)-release.Have fun!

1Versi sebelum 0.9.0 menggunakan libev dari Mark Lechmann

i

Page 3: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Daftar Isi

Kata Pengantar i

Daftar Gambar iii

Listing Program iv

Daftar Tabel v

1. Pengenalan Cloud Computing dan Infrastruktur Pengembangan Aplikasi Berba-sis Node.js 11.1. Apa itu Cloud Computing? . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2. Karakteristik Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . 11.3. Public dan Private Cloud Computing . . . . . . . . . . . . . . . . . . . . . 31.4. Model Layanan Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . 31.5. Pengembangan Aplikasi di Cloud Computing . . . . . . . . . . . . . . . . 31.6. Node.js dan Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . . 41.7. Layanan Hosting Aplikasi: CloudFoundry . . . . . . . . . . . . . . . . . . 4

1.7.1. Pendaftaran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.7.2. Instalasi Command Line Utilities . . . . . . . . . . . . . . . . . . . 41.7.3. Konfigurasi di Server Cloud . . . . . . . . . . . . . . . . . . . . . . 101.7.4. Instalasi dan Konfigurasi Node.js di Komputer Lokal . . . . . . . . 12

1.8. Pengelolaan Aplikasi di Cloud . . . . . . . . . . . . . . . . . . . . . . . . . 131.8.1. Push, Delete, Update Aplikasi . . . . . . . . . . . . . . . . . . . . . 141.8.2. Menggunakan Framework ExpressJS . . . . . . . . . . . . . . . . . 141.8.3. Tanpa Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2. REPL dan Dasar-dasar JavaScript di Node.js 212.1. REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.1.1. Mengaktifkan REPL . . . . . . . . . . . . . . . . . . . . . . . . . . 21

ii

Page 4: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Daftar Isi iii

2.1.2. Perintah-perintah REPL . . . . . . . . . . . . . . . . . . . . . . . . 222.2. Dasar-dasar JavaScript di Node.js . . . . . . . . . . . . . . . . . . . . . . . 23

2.2.1. Membaca Masukan dari Stream / Masukan Standar (stdin) . . . . 232.2.2. Nilai/Value dan Tipe Data . . . . . . . . . . . . . . . . . . . . . . 242.2.3. Variabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.2.4. Konstanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.2.5. Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Pengertian Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Definisi Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Fungsi Anonim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Fungsi Rekursif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Fungsi di dalam Fungsi / Nested Functions . . . . . . . . . . . . . 27

2.2.6. Literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Literal Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Literal Boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal Floating-point . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.2.7. Struktur Data dan Representasi JSON . . . . . . . . . . . . . . . . 302.2.8. Aliran Kendali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

Pernyataan Kondisi if .. else if .. else . . . . . . . . . . . . . . . . 31Pernyataan switch . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Looping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

2.2.9. Penanganan Error . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3. Paradigma Pemrograman di JavaScript 373.1. Pemrograman Fungsional . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3.1.1. Ekspresi Lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.1.2. Higher-order Function . . . . . . . . . . . . . . . . . . . . . . . . . 383.1.3. Closure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.1.4. Currying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

3.2. Pemrograman Berorientasi Obyek . . . . . . . . . . . . . . . . . . . . . . . 403.2.1. Pengertian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.2.2. Definisi Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.2.3. Inheritance / Pewarisan . . . . . . . . . . . . . . . . . . . . . . . . 41

4. Mengelola Paket Menggunakan npm 434.1. Apakah npm Itu? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.2. Menggunakan npm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

4.2.1. Instalasi Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444.2.2. Struktur Instalasi Paket Node.js . . . . . . . . . . . . . . . . . . . 444.2.3. Menghapus Paket / Uninstall . . . . . . . . . . . . . . . . . . . . . 454.2.4. Mencari Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

Page 5: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Daftar Isi iv

4.2.5. Menampilkan Informasi Paket . . . . . . . . . . . . . . . . . . . . . 464.2.6. Memperbaharui Paket . . . . . . . . . . . . . . . . . . . . . . . . . 47

5. Node.js dan Web: Teknik Pengembangan Aplikasi 485.1. Pendahuluan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.2. Event-Driven Programming dan EventEmitter . . . . . . . . . . . . . . . . 495.3. Asynchronous / Non-blocking IO dan Callback . . . . . . . . . . . . . . . 50

6. Mengakses Basis Data NoSQL: mongoDB 526.1. Apa itu Basis Data NoSQL? . . . . . . . . . . . . . . . . . . . . . . . . . . 526.2. Mengenal mongoDB dan Fitur-fiturnya . . . . . . . . . . . . . . . . . . . . 52

6.2.1. Memulai Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.2.2. Klien dan Shell mongoDB . . . . . . . . . . . . . . . . . . . . . . . 546.2.3. Documents dan Collections . . . . . . . . . . . . . . . . . . . . . . 56

6.3. Node.js dan MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.3.1. Node-gyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.3.2. Driver Node.js untuk mongoDB . . . . . . . . . . . . . . . . . . . . 576.3.3. Mengakses mongoDB dari Node.js . . . . . . . . . . . . . . . . . . 58

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB . . . . . . . . . . . . . 59

7. Pola Arsitektur Aplikasi Web: MVC dan ExpressJS 627.1. Apa itu Pola Arsitektur? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.2. Pola Arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS . . . . . . . 64

7.3.1. Struktur Aplikasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.3.2. File-file yang Diperlukan . . . . . . . . . . . . . . . . . . . . . . . . 657.3.3. Hasil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya . . . . . . . . . . 66

8. Real-time Web Menggunakan Socket.io 688.1. Apa itu Real-time Web? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688.2. Teknologi Pendukung Real-time Web . . . . . . . . . . . . . . . . . . . . . 68

8.2.1. Ajax Technology . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688.2.2. Comet dan Push Technology . . . . . . . . . . . . . . . . . . . . . . 69

SSE (Server-Sent Events) . . . . . . . . . . . . . . . . . . . . . . . 69Bayeux Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69BOSH Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

8.2.3. WebSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.3. Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

8.3.1. Apa itu Socket.io? . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.3.2. Menggunakan Socket.io untuk Real-time Web . . . . . . . . . . . . 71

Tentang Aplikasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71Membuat Kerangka Aplikasi dengan ExpressJS . . . . . . . . . . . 71Instalasi Paket yang Diperlukan . . . . . . . . . . . . . . . . . . . . 71

Page 6: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Daftar Isi v

Konfigurasi JavaScript untuk Browser . . . . . . . . . . . . . . . . 72Hapus File yang Tidak Diperlukan . . . . . . . . . . . . . . . . . . 72Ubah File-file Tertentu . . . . . . . . . . . . . . . . . . . . . . . . . 72Menjalankan Server Socket.io . . . . . . . . . . . . . . . . . . . . . 73

Daftar Pustaka 76

Lampiran 78

A. Gaya Penulisan Kode / Coding Style 78A.1. Tentang Gaya Penulisan Kode . . . . . . . . . . . . . . . . . . . . . . . . . 78A.2. npm’s Coding Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

A.2.1. DESCRIPTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78A.2.2. Line Length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79A.2.3. Indentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79A.2.4. Curly braces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79A.2.5. Semicolons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79A.2.6. Comma First . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80A.2.7. Whitespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80A.2.8. Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80A.2.9. Callbacks, Sync/async Style . . . . . . . . . . . . . . . . . . . . . . 81A.2.10.Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81A.2.11.Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81A.2.12.Case, naming, etc. . . . . . . . . . . . . . . . . . . . . . . . . . . . 81A.2.13.null, undefined, false, 0 . . . . . . . . . . . . . . . . . . . . . . . . . 81

B. Commit History dari Penulis Utama dan Kontributor 83

Indeks 85

Page 7: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Daftar Gambar

1.1. Model Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2. Pendaftaran di CF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3. Hasil proses pendaftaran di CF . . . . . . . . . . . . . . . . . . . . . . . . 61.4. E-mail persetujuan dan pemberitahuan credentials . . . . . . . . . . . . . 71.5. Hasil push ke server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.6. Hasil update dengan menyertakan versi Node.js . . . . . . . . . . . . . . . 181.7. Deployment menggunakan versi runtime tertentu . . . . . . . . . . . . . . 191.8. Hasil deployement app.js tanpa framework . . . . . . . . . . . . . . . . . . 20

4.1. Tampilan “npm ls” pada direktori proyek dengan paket terinstall lengkap . 46

6.1. Admin web console untuk mongoDB . . . . . . . . . . . . . . . . . . . . . 55

7.1. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637.2. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

8.1. Hasil di browser dari ExpressJS + Socket.io . . . . . . . . . . . . . . . . . 75

vi

Page 8: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Listing Program

1.1. Instalasi vmc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2. Peringatan setting PATH untuk vmc . . . . . . . . . . . . . . . . . . . . . 81.3. Peringatan setting PATH untuk vmc . . . . . . . . . . . . . . . . . . . . . 81.4. Hasil gem yang terinstall . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.5. Hasil opsi help dari vmc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.6. Mengubah target server - belum ada konfigurasi . . . . . . . . . . . . . . . 101.7. Mengubah target server - setelah konfigurasi . . . . . . . . . . . . . . . . . 101.8. Login ke server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.9. Mengubah password server . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.10. Hasil dari download Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . 121.11. Ekstraksi Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.12. Konfigurasi variabel lingkungan Node.js . . . . . . . . . . . . . . . . . . . 131.13. Instalasi ExpressJS menggunakan npm . . . . . . . . . . . . . . . . . . . . 141.14. Perintah express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.15. Menggunakan express untuk membuat rerangka aplikasi . . . . . . . . . . 141.16. package.json untuk ExpressJS . . . . . . . . . . . . . . . . . . . . . . . . . 151.17. app.js untuk ExpressJS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.18. Hasil edit routes/index.js . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.19. Deployment aplikasi ExpressJS ke CF . . . . . . . . . . . . . . . . . . . . 161.20. Update: menambahkan versi Node.js ke routes/index.js . . . . . . . . . . . 171.21. Mengupdate aplikasi di server . . . . . . . . . . . . . . . . . . . . . . . . . 171.22. Menghapus aplikasi yang di-deploy di CF . . . . . . . . . . . . . . . . . . 171.23. Deployment ke CF dengan memilih runtime Node.js . . . . . . . . . . . . 181.24. app.js tanpa framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.25. Deployment app.js tanpa framework . . . . . . . . . . . . . . . . . . . . . 19

2.1. Node.js REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2. Contoh penggunaan .load dalam REPL . . . . . . . . . . . . . . . . . . . . 22

vii

Page 9: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Listing Program viii

2.3. Contoh penggunaan perintah .save di sesi REPL . . . . . . . . . . . . . . 232.4. readline.js: penggunaan pustaka Readline untuk masukan . . . . . . . . . 242.5. Fitur dynamically typed language . . . . . . . . . . . . . . . . . . . . . . . 252.6. Contoh konstanta dalam JavaScript . . . . . . . . . . . . . . . . . . . . . . 252.7. Sintaksis Fungsi dalam JavaScript . . . . . . . . . . . . . . . . . . . . . . . 262.8. Pemanggilan Fungsi dalam JavaScript . . . . . . . . . . . . . . . . . . . . 262.9. Contoh deklarasi fungsi dan pemanggilannya . . . . . . . . . . . . . . . . 262.10. Fungsi anonim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.11. Fungsi rekursif untuk menghitung faktorial . . . . . . . . . . . . . . . . . 272.12. Fungsi di dalam Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.13. Array di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.14. Representasi JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.15. Pernyataan if .. else if .. else . . . . . . . . . . . . . . . . . . . . . . . . . 312.16. Pernyataan Contoh penggunaan “switch” . . . . . . . . . . . . . . . . . . . 322.17. Pernyataan for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.18. Pernyataan for .. in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.19. Pernyataan do .. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342.20. Pernyataan while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342.21. Pernyataan break dan continue . . . . . . . . . . . . . . . . . . . . . . . . 352.22. Pernyataan break dengan label . . . . . . . . . . . . . . . . . . . . . . . . 352.23. Pernyataan try catch finally . . . . . . . . . . . . . . . . . . . . . . . . . . 362.24. Pernyataan try catch throw . . . . . . . . . . . . . . . . . . . . . . . . . . 36

3.1. Ekspresi Lambda di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . 383.2. Higher-order Function di JavaScript . . . . . . . . . . . . . . . . . . . . . 383.3. Closure di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.4. Currying di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.5. Definisi obyek di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . 403.6. Pewarisan di PBO JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . 41

4.1. Sintaksis lengkap perintah npm . . . . . . . . . . . . . . . . . . . . . . . . 434.2. Cara install paket menggunakan npm . . . . . . . . . . . . . . . . . . . . . 444.3. Argumen npm untuk melihat daftar paket terpasang . . . . . . . . . . . . 454.4. npm ls pada aplikasi yang paket-paketnya belum terinstall . . . . . . . . . 454.5. Perintah menghapus paket di npm . . . . . . . . . . . . . . . . . . . . . . 454.6. Perintah menghapus paket di npm . . . . . . . . . . . . . . . . . . . . . . 464.7. Menampilkan rincian suatu paket dalam format JSON . . . . . . . . . . . 464.8. Memperbaharui paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

5.1. pegawai.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.2. server.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.3. server-on-error.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505.4. Membaca file secara synchronous . . . . . . . . . . . . . . . . . . . . . . . 505.5. Membaca file secara asynchronous . . . . . . . . . . . . . . . . . . . . . . 51

Page 10: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Listing Program ix

6.1. Menjalankan server MongoDB (mongod) . . . . . . . . . . . . . . . . . . . 536.2. Mengakhiri server MongoDB (mongod) . . . . . . . . . . . . . . . . . . . . 546.3. Shell mongoDB (mongo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.4. Sesi dalam shell mongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.5. Instalasi node-gyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.6. Instalasi driver mongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.7. Instalasi wrapper mongojs . . . . . . . . . . . . . . . . . . . . . . . . . . . 586.8. Mengakses mongoDB dari Node.js . . . . . . . . . . . . . . . . . . . . . . 586.9. Express+MongoDB web: app.js . . . . . . . . . . . . . . . . . . . . . . . . 596.10. Express+MongoDB web: package.json . . . . . . . . . . . . . . . . . . . . 606.11. Express+MonggoDB web: routes/index.js . . . . . . . . . . . . . . . . . . 606.12. Express+MongoDB web: routes/employee.js . . . . . . . . . . . . . . . . . 606.13. Express+MongoDB web: views/employee.jade . . . . . . . . . . . . . . . . 616.14. views/index.jade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

7.1. Struktur direktori asli aplikasi ExpressJS . . . . . . . . . . . . . . . . . . . 647.2. Struktur direktori ExpressJS sesuai pola MVC . . . . . . . . . . . . . . . 647.3. app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657.4. controllers/user.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657.5. models/db.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.6. package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

8.1. package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718.2. Isi direktori dist di socket.io-client . . . . . . . . . . . . . . . . . . . . . . 728.3. app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728.4. views/index.jade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738.5. routes/index.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738.6. Menjalankan server Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . 738.7. Kode sumber di browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

A.1. Bad curly braces placement - 1 . . . . . . . . . . . . . . . . . . . . . . . . 79A.2. Good curly braces placement - 1 . . . . . . . . . . . . . . . . . . . . . . . 79A.3. Bad curly braces placement - 2 . . . . . . . . . . . . . . . . . . . . . . . . 79A.4. Good curly braces placement - 2 . . . . . . . . . . . . . . . . . . . . . . . 79A.5. Good semicolon usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80A.6. Comma first . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

B.1. Commit history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

Page 11: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Daftar Tabel

x

Page 12: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

BAB 1

Pengenalan Cloud Computing dan Infrastruktur Pengembangan AplikasiBerbasis Node.js

1.1. Apa itu Cloud Computing?

Cloud Computing, atau sering diterjemahkan sebagai “Komputasi Awan” dalam bahasaIndonesia mempunyai berbagai definisi:

X Wikipedia: penggunaan sumber daya komputasi (peranti keras dan peranti lunak)yang berfungsi untuk memberikan layanan melalui suatu jaringan (pada umumnyaInternet)1.

X NIST2: model yang memungkinkan akses jaringan ubiquitous (dari mana saja),nyaman, on-demand (saat ada permintaan) ke sekumpulan sumber daya komputasiyang dikonfigurasi untuk berbagi (jaringan, server, penyimpanan, dan berbagailayanan lain) yang dapat dengan cepat ditetapkan dan dirilis dengan usaha yangminimal dari manajemen ataupun interaksi dengan penyedia layanan3.

Jika diwujudkan secara visual, Cloud Computing bisa dilihat pada Gambar 1.14

1.2. Karakteristik Cloud Computing

Menurut NIST, ada beberapa karakteristik dari Cloud Computing:

1http://en.wikipedia.org/wiki/Cloud_computing2The National Institute of Standards and Technology3http://csrc.nist.gov/publications/PubsSPs.html#800-1454Gambar dibuat oleh Sam Johnston, diambil dari http://en.wikipedia.org/w/index.php?title=File:Cloud_computing.svg&page=1

1

Page 13: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.2. Karakteristik Cloud Computing 2

Gambar 1.1.: Model Cloud Computing

X On-demand self-service: layanan bisa diperoleh pada saat diminta, tanpa inter-vensi atau interaksi manusia di sisi penyedia jasa.

X Broad network access: tersedia melalui jaringan dengan berbagai peranti yangumum (komputer, tablet, HP, dan lain-lain)

X Resource pooling: sumber daya komputasi dari penyedia jasa terkumpul untukmelayani.

X Rapid elasticity: skalabilitas.

X Measured service: penggunaan sumber daya bisa diukur, di-monitor, dikenda-likan, dan dilaporkan.

Karakteristik lain yang tidak kalah penting adalah multitenancy. Multitenancy meru-pakan suatu prinsip dalam arsitektur software. Pada arsitektur tersebut, satu instan darisoftware berjalan pada server, melayani banyak organisasi klien. Aplikasi dirancang un-tuk mempartisi data dan konfigurasinya secara virtual dan setiap organisasi klien tersebut

Page 14: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.3. Public dan Private Cloud Computing 3

bekerja dengan instan aplikasi virtual tersebut5.

1.3. Public dan Private Cloud Computing

Cloud Computing bisa dibangun untuk keperluan pribadi suatu organisasi dan (secaralegal) hanya bisa diakses oleh organisasi yang bersangkutan. Tipe tersebut dikenal den-gan Private Cloud Computing. Sementara itu, jika sumber daya Cloud Computing bisadiakses oleh publik (dengan hak akses yang sesuai), maka model tersebut dikenal se-bagai Public Cloud Computing. Pembahasan di buku ini adalah pembahasan tentangPublic Cloud Computing dan semua referensi tentang Cloud Computing di buku ini akanmenunjuk pada Public Cloud Computing kecuali dinyatakan lain.

1.4. Model Layanan Cloud Computing

Model layanan pada Cloud Computing akan berkembang sesuai kebutuhan konsumenserta inovasi dari berbagai penyedia layanan. Saat ini, pada umumnya, ada tiga modellayanan:

X SaaS (Software as a Service): layanan berupa aplikasi yang ditempatkan padainfrastruktur penyedia layanan, siap digunakan oleh konsumen.

X PaaS (Platform as a Service): menyediakan layanan ke konsumen berupa platformuntuk men-deploy aplikasi.

X IaaS (Infrastructure as a Service): menyediakan layanan ke konsumen berupaberbagai sumber daya komputasi (pemrosesam, penyimpanan, jaringan, dan sum-ber daya fundamental lainnya).

Meski sampai saat ini, umumnya terdapat tiga model tersebut, beberapa model keli-hatannya sudah mulai muncul, misalnya STaaS (Storage as a Service), SECaaS (Securityas a Service), DaaS (Data as a Service), TEaaS (Test Environment as a Service), DesktopVirtualization, APIaaS (API as a Service).

1.5. Pengembangan Aplikasi di Cloud Computing

Pada umumnya, para pengembang aplikasi di Cloud Computing juga menggunakan pen-dekatan Agile Software Development yang berbasis pada pengembangan secara iteratifuntuk setiap milestone (dalam iterasi analisis-desain-coding-testing-debugging) mulai darimilestone paling awal sampai software dirilis. Perbedaan paling mendasar hanyalah padaplatform yang digunakan untuk deployment, peranti pengembangan yang digunakan,serta utilitas untuk mengelola aplikasi yang di-deploy pada instan di cloud.Pengembangan aplikasi di Cloud Computing akan melibatkan peranti pengembang

yang didukung oleh infrastruktur Cloud. Kita akan memerlukan PaaS untuk keperluanini. Pada dasarnya pengembangan aplikasi akan meliputi siklus berikut:

5http://en.wikipedia.org/wiki/Multitenancy

Page 15: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.6. Node.js dan Cloud Computing 4

X Coding

X Test di komputer lokal

X Upload ke server (dalam Cloud Computing, proses ini diistilahkan dengan “push”

X Edit - push

Jika pengembangan aplikasi dilakukan oleh tim, maka perlu adanya software untukversion control, misalnya Git, mercurial, dan lain-lain. Setelah itu, aktivitas yang di-lakukan biasanya terpusat pada push (untuk mengupload instan dari aplikasi ke server)dan pull (untuk mengambil instan aplikasi dari server).

1.6. Node.js dan Cloud Computing

Node.js merupakan salah satu peranti pengembang yang bisa digunakan untuk membuataplikasi berbasis Cloud. Node.js dikembangkan dari engine JavaScript yang dibuat olehGoogle untuk browser Chrome / Chromium (V8) ditambah dengan libUV serta beberapapustaka internal lainnya. Dengan menggunakan Node.js, semua pengembangan akandilakukan menggunakan JavaScript, baik pada sisi klien maupun server. Node.js dibuatpertama kali oleh Ryan Dahl (twitter.com/ryah) dan sampai saat ini dikembangkan olehkomunitas sebagai software bebas dengan pendanaan utama dari Joyent, perusahaantempat Ryan Dahl bekerja.

1.7. Layanan Hosting Aplikasi: CloudFoundry

Saat ini, mulai banyak penyedia layanan Cloud yang mendukung Node.js, diantaranyaadalah CloudFoundry (http://www.cloudfoundry.com, selanjutnya akan kita sebut den-gan CF). Buku ini akan menggunakan fasilitas dari CF. Daftar lengkap dari penye-dia infrastruktur Node.js bisa dilihat pada https://github.com/joyent/node/wiki/Node-Hosting.

1.7.1. Pendaftaran

Untuk menggunakan fasilitas dari CF, kita akan mendaftar lebih dahulu di URL https://my.cloudfoundry.com/signup sepert yang terlihat pada Gambar 1.2.Setelah itu, CF akan mengirimkan pemberitahuan bahwa proses pendaftaran selesai

seperti di Gambar 1.3. Credentials atau informasi tentang akun kita di CF akan dikir-imkan ke e-mail kita seperti pada Gambar 1.4.

1.7.2. Instalasi Command Line Utilities

Command Line Utilities / CLU) adalah software yang dijalankan melalui shell / com-mand line / command prompt. CLU untuk CF ini dibuat dengan menggunakan Rubydan didistribusikan dalam bentuk gem sehingga untuk instalasi ini diperlukan ruby danrubygem. Berikut adalah perintah untuk instalasi vmc (CLU dari CF).

Page 16: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.7. Layanan Hosting Aplikasi: CloudFoundry 5

Gambar 1.2.: Pendaftaran di CF

1 $ gem search vmc −−remote | grep "\bvmc\ s "2 vmc ( 0 . 5 . 0 )3 $ gem i n s t a l l vmc4 Fetching : json_pure −1 . 7 . 7 . gem (100%)5 WARNING: You don ’ t have /home/bpdp / . gem/ruby /2 . 0 . 0 / bin in your PATH,6 gem executab l e s w i l l not run .7 Su c c e s s f u l l y i n s t a l l e d json_pure −1.7 .78 Fetching : multi_json −1 . 7 . 2 . gem (100%)9 Su c c e s s f u l l y i n s t a l l e d multi_json −1.7 .2

10 Fetching : i n t e r a c t −0 . 5 . 2 . gem (100%)11 Su c c e s s f u l l y i n s t a l l e d i n t e r a c t −0.5 .212 Fetching : mult ipart−post −1 . 2 . 0 . gem (100%)13 Su c c e s s f u l l y i n s t a l l e d mult ipart−post −1.2 .014 Fetching : rubyzip −0 . 9 . 9 . gem (100%)15 Su c c e s s f u l l y i n s t a l l e d rubyzip −0.9 .916 Fetching : c f−uaa−l i b −1 .3 . 10 . gem (100%)17 Su c c e s s f u l l y i n s t a l l e d cf−uaa−l i b −1.3.1018 Fetching : cfoundry −0 . 5 . 2 . gem (100%)19 Su c c e s s f u l l y i n s t a l l e d cfoundry −0.5 .220 Fetching : c louseau −0 . 0 . 2 . gem (100%)21 Su c c e s s f u l l y i n s t a l l e d c louseau −0.0 .222 Fetching : mothership −0 . 5 . 1 . gem (100%)23 Su c c e s s f u l l y i n s t a l l e d mothership −0.5 .124 Fetching : mani fes t s−vmc−plugin −0 . 6 . 2 . gem (100%)25 Su c c e s s f u l l y i n s t a l l e d mani fes t s−vmc−plugin −0.6 .226 Fetching : addressab le −2 . 3 . 4 . gem (100%)27 Su c c e s s f u l l y i n s t a l l e d addressab le −2.3 .4

Page 17: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.7. Layanan Hosting Aplikasi: CloudFoundry 6

Gambar 1.3.: Hasil proses pendaftaran di CF

28 Fetching : ca ldeco t t−c l i e n t −0 . 0 . 2 . gem (100%)29 Su c c e s s f u l l y i n s t a l l e d ca ldeco t t−c l i e n t −0.0 .230 Fetching : mime−types −1.23.gem (100%)31 Su c c e s s f u l l y i n s t a l l e d mime−types −1.2332 Fetching : r e s t−c l i e n t −1 . 6 . 7 . gem (100%)33 Su c c e s s f u l l y i n s t a l l e d re s t−c l i e n t −1.6 .734 Fetching : uu idtoo l s −2 . 1 . 4 . gem (100%)35 Su c c e s s f u l l y i n s t a l l e d uu idtoo l s −2.1 .436 Fetching : tunnel−vmc−plugin −0 . 2 . 2 . gem (100%)37 Su c c e s s f u l l y i n s t a l l e d tunnel−vmc−plugin −0.2 .238 Fetching : vmc−0 . 5 . 0 . gem (100%)39 Su c c e s s f u l l y i n s t a l l e d vmc−0.5 .040 Pars ing documentation for json_pure −1.7 .741 I n s t a l l i n g r i documentation for json_pure −1.7 .742 Pars ing documentation for multi_json −1.7 .243 I n s t a l l i n g r i documentation for multi_json −1.7 .244 Pars ing documentation for i n t e r a c t −0.5 .245 I n s t a l l i n g r i documentation for i n t e r a c t −0.5 .246 Pars ing documentation for mult ipart−post −1.2 .047 I n s t a l l i n g r i documentation for mult ipart−post −1.2 .048 Pars ing documentation for rubyzip −0.9 .949 I n s t a l l i n g r i documentation for rubyzip −0.9 .950 Pars ing documentation for c f−uaa−l i b −1.3.1051 I n s t a l l i n g r i documentation for cf−uaa−l i b −1.3.1052 Pars ing documentation for cfoundry −0.5 .253 I n s t a l l i n g r i documentation for cfoundry −0.5 .254 Pars ing documentation for c louseau −0.0 .255 I n s t a l l i n g r i documentation for c louseau −0.0 .256 Pars ing documentation for mothership −0.5 .157 I n s t a l l i n g r i documentation for mothership −0.5 .158 Pars ing documentation for mani fes t s−vmc−plugin −0.6 .2

Page 18: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.7. Layanan Hosting Aplikasi: CloudFoundry 7

Gambar 1.4.: E-mail persetujuan dan pemberitahuan credentials

59 I n s t a l l i n g r i documentation for mani fest s−vmc−plugin −0.6 .260 Pars ing documentation for addressab le −2.3 .461 I n s t a l l i n g r i documentation for addressab le −2.3 .462 Pars ing documentation for ca ldeco t t−c l i e n t −0.0 .263 I n s t a l l i n g r i documentation for ca ldeco t t−c l i e n t −0.0 .264 Pars ing documentation for mime−types −1.2365 I n s t a l l i n g r i documentation for mime−types −1.2366 Pars ing documentation for r e s t−c l i e n t −1.6 .767 I n s t a l l i n g r i documentation for r e s t−c l i e n t −1.6 .768 Pars ing documentation for uu idtoo l s −2.1 .469 I n s t a l l i n g r i documentation for uu idtoo l s −2.1 .470 Pars ing documentation for tunnel−vmc−plugin −0.2 .271 I n s t a l l i n g r i documentation for tunnel−vmc−plugin −0.2 .272 Pars ing documentation for vmc−0.5 .073 I n s t a l l i n g r i documentation for vmc−0.5 .074 Done i n s t a l l i n g documentation for json_pure , multi_json ,75 i n t e r a c t , mult ipart−post , rubyzip , c f−uaa−l i b , cfoundry ,76 c louseau , mothership , mani fes t s−vmc−plugin , addressab le ,77 ca ldeco t t−c l i e n t , mime−types , r e s t−c l i e n t , uu idtoo l s ,78 tunnel−vmc−plugin , vmc (13 sec ) .79 17 gems i n s t a l l e d80 $

Page 19: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.7. Layanan Hosting Aplikasi: CloudFoundry 8

Listing 1.1: Instalasi vmc

Pesan peringatan berikut ini:1 WARNING: You don ’ t have /home/bpdp / . gem/ruby /2 . 0 . 0 / bin in your PATH,2 gem execu tab l e s w i l l not run .

Listing 1.2: Peringatan setting PATH untuk vmc

terjadi karena path untuk executable script Ruby yang diinstall oleh vmc belum dita-mbahkan ke variabel lingkungan PATH. Edit file $HOME/.bashrc dan tambahkan barisberikut6:

1 export PATH=$PATH:/home/bpdp / . gem/ruby /2 . 0 . 0 / bin

Listing 1.3: Peringatan setting PATH untuk vmc

Setelah itu, ketikkan di shell prompt Bash: source /̃.bashrc7.Hasil dari instalasi vmc adalah sebagai berikut:

1 $ gem l i s t23 ∗∗∗ LOCAL GEMS ∗∗∗45 addre s sab l e ( 2 . 3 . 4 )6 b igdec imal ( 1 . 2 . 0 )7 ca ldeco t t−c l i e n t ( 0 . 0 . 2 )8 cf−uaa−l i b ( 1 . 3 . 1 0 )9 cfoundry ( 0 . 5 . 2 )

10 c louseau ( 0 . 0 . 2 )11 i n t e r a c t ( 0 . 5 . 2 )12 io−conso l e ( 0 . 4 . 2 )13 j son ( 1 . 7 . 7 )14 json_pure ( 1 . 7 . 7 )15 mani fes t s−vmc−p lug in ( 0 . 6 . 2 )16 mime−types ( 1 . 2 3 )17 min i t e s t ( 4 . 3 . 2 )18 mothership ( 0 . 5 . 1 )19 multi_json ( 1 . 7 . 2 )20 mult ipart−post ( 1 . 2 . 0 )21 psych ( 2 . 0 . 0 )22 rake ( 0 . 9 . 6 )23 rdoc ( 4 . 0 . 0 )24 re s t−c l i e n t ( 1 . 6 . 7 )25 rubyzip ( 0 . 9 . 9 )26 test−uni t ( 2 . 0 . 0 . 0 )27 tunnel−vmc−p lug in ( 0 . 2 . 2 )28 uu id too l s ( 2 . 1 . 4 )29 vmc ( 0 . 5 . 0 )30 $

Listing 1.4: Hasil gem yang terinstall

Periksa dengan menjalankan opsi help dari vmc:

6Catatan: "/home/bpdp/" adalah direktori $HOME saya, silahkan sesuaikan dengan tempat anda7Ini hanya untuk keperluan saat ini saja, setelah ini tidak perlu lagi karena setiap login sudah akandibaca oleh Bash

Page 20: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.7. Layanan Hosting Aplikasi: CloudFoundry 9

1 $ vmc help2 Showing ba s i c command set . Run with ’ he lp −−a l l ’ to l i s t a l l commands .34 Gett ing Started5 ta r g e t [URL] Set or d i sp l ay the t a r g e t cloud , o rgan i za t i on , and space6 logout Log out from the t a r g e t7 l o g i n [EMAIL] Authent icate with the t a r g e t8 i n f o Display in fo rmat ion on the cur rent target , user , e t c .9

10 App l i ca t i on s11 app [APP] Show app in fo rmat ion12 apps L i s t your app l i c a t i o n s1314 Management15 s t a r t APPS . . . S ta r t an app l i c a t i on16 d e l e t e APPS . . . De lete an app l i c a t i on17 push [NAME] Push an app l i c a t i on , sync ing changes i f i t e x i s t s18 r e s t a r t APPS . . . Stop and s t a r t an app l i c a t i o n19 stop APPS . . . Stop an app l i c a t i o n2021 S e r v i c e s22 s e r v i c e SERVICE Show s e r v i c e in fo rmat ion23 s e r v i c e s L i s t your s e r v i c e2425 Management26 de l e t e−s e r v i c e [SERVICE] Delete a s e r v i c e27 bind−s e r v i c e [SERVICE] [APP] Bind a s e r v i c e to an app l i c a t i o n28 create−s e r v i c e [OFFERING] [NAME] Create a s e r v i c e29 unbind−s e r v i c e [SERVICE] [APP] Unbind a s e r v i c e from an app l i c a t i on30 tunne l [ INSTANCE] [CLIENT] Create a local tunne l to a s e r v i c e .3132 Organ izat ions33 org [ORGANIZATION] Show organ i z a t i on in fo rmat ion34 de l e t e−org [ORGANIZATION] Delete an o rgan i z a t i on35 orgs L i s t a v a i l a b l e o r gan i z a t i on s36 create−org [NAME] Create an o rgan i z a t i on3738 Spaces39 de l e t e−space SPACES . . . De lete a space and i t s contents40 spaces [ORGANIZATION] L i s t spaces in an o rgan i z a t i on41 create−space [NAME] [ORGANIZATION] Create a space in an o rgan i z a t i on42 space [SPACE] Show space in fo rmat ion4344 Routes45 route s L i s t route s in a space4647 Domains48 domains [SPACE] L i s t domains in a space49 map−domain NAME Map a domain to an o rgan i z a t i on or space50 unmap−domain DOMAIN Unmap a domain from an o rgan i z a t i on or space5152 Options :53 −−[no−] c o l o r Use c o l o r f u l output54 −−[no−] s c r i p t Shortcut for −−qu i e t and −−f o r c e55 −−debug Pr int f u l l s tack t r a c e ( i n s t ead o f crash log )56 −V, −−verbose Pr int ext ra in fo rmat ion57 −f , −−[no−] f o r c e Skip i n t e r a c t i o n when po s s i b l e58 −h , −−help Show command usage59 −m, −−mani fe s t FILE Path to mani f e s t f i l e to use60 −q , −−[no−] qu i e t S imp l i f y output format61 −t , −−t r a c e Show API t r a f f i c

Page 21: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.7. Layanan Hosting Aplikasi: CloudFoundry 10

62 −u , −−proxy EMAIL Run t h i s command as another user ( admin )63 −v , −−ve r s i on Pr int v e r s i on number64 $

Listing 1.5: Hasil opsi help dari vmc

1.7.3. Konfigurasi di Server Cloud

Pada dasarnya, yang diperlukan hanyalah mengubah target ke server cloud dari CF dankemudian mengubah password.

1 $ vmc ta r g e t2 NoMethodError : undef ined method ‘ target ’ for n i l : N i lC la s s3 For more in format ion , s ee ~/.vmc/ crash4 $

Listing 1.6: Mengubah target server - belum ada konfigurasi

Error di atas terjadi karena file konfigurasi belum dibuat. File konfigurasi tersim-pan di direktori $HOME/.vmc. Mengubah target dilakukan dengan membuat file targetdi direktori tersebut. Isi dari file target tersebut adalah server CloudFoundry, yaituhttps://api.cloudfoundry.com. Setelah itu, jika dieksekusi lagi, hasilnya adalah sebagaiberikut:

1 $ vmc ta r g e t2 t a r g e t : https : // api . c loudfoundry . com3 $

Listing 1.7: Mengubah target server - setelah konfigurasi

Setelah itu, setiap kali kita akan melakukan berbagai proses yang melibatkan serverini, kita harus melakukan proses login terlebih dahulu:

1 $ vmc l o g i n2 t a r g e t : https : // api . c loudfoundry . com34 Email> bambangpdp@yahoo . com56 Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗78 Authent icat ing . . . OK9 $ vmc i n f o −−a l l

10 Gett ing runtimes . . . OK11 Gett ing frameworks . . . OK12 Gett ing s e r v i c e s . . . OK1314 VMware ’ s Cloud Appl i ca t ion Platform1516 ta r g e t : https : // api . c loudfoundry . com17 ve r s i on : 0 .99918 support : http :// support . c loudfoundry . com1920 user : bambangpdp@yahoo . com2122 runtime d e s c r i p t i o n23 java 1 . 6 . 0_2424 java7 1 . 7 . 0_04

Page 22: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.7. Layanan Hosting Aplikasi: CloudFoundry 11

25 node 0 . 4 . 1 226 node06 0 . 6 . 827 node08 0 . 8 . 228 ruby18 1 . 8 . 7 p35729 ruby19 1 . 9 . 2 p1803031 framework d e s c r i p t i o n32 g r a i l s33 java_web34 l i f t35 node36 play37 rack38 r a i l s 339 s i n a t r a40 spr ing41 standa lone4243 s e r v i c e v e r s i on prov ide r d e s c r i p t i o n44 mongodb 2 .0 core MongoDB NoSQL database45 mysql 5 . 1 core MySQL database46 po s t g r e s q l 9 . 0 core PostgreSQL database ( vFabric )47 rabbitmq 2 .4 core RabbitMQ message queue48 r e d i s 2 . 4 core Redis key−value s t o r e49 r e d i s 2 . 2 core Redis key−value s t o r e50 r e d i s 2 . 6 core Redis key−value s t o r e51 $525354 $ vmc l o g i n55 t a r g e t : https : // api . c loudfoundry . com5657 Email> bambangpdp@yahoo . com5859 Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗6061 Authent icat ing . . . OK6263 $ vmc i n f o −−a l l64 Gett ing runtimes . . . OK65 Gett ing frameworks . . . OK66 Gett ing s e r v i c e s . . . OK6768 VMware ’ s Cloud Appl i ca t ion Platform6970 ta r g e t : https : // api . c loudfoundry . com71 ve r s i on : 0 .99972 support : http :// support . c loudfoundry . com7374 user : bambangpdp@yahoo . com7576 runtime d e s c r i p t i o n77 java 1 . 6 . 0_2478 java7 1 . 7 . 0_0479 node 0 . 4 . 1 280 node06 0 . 6 . 881 node08 0 . 8 . 282 ruby18 1 . 8 . 7 p35783 ruby19 1 . 9 . 2 p1808485 framework d e s c r i p t i o n86 g r a i l s

Page 23: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.7. Layanan Hosting Aplikasi: CloudFoundry 12

87 java_web88 l i f t89 node90 play91 rack92 r a i l s 393 s i n a t r a94 spr ing95 standa lone9697 s e r v i c e v e r s i on prov ide r d e s c r i p t i o n98 mongodb 2 .0 core MongoDB NoSQL database99 mysql 5 . 1 core MySQL database

100 po s t g r e s q l 9 . 0 core PostgreSQL database ( vFabric )101 rabbitmq 2 .4 core RabbitMQ message queue102 r e d i s 2 . 4 core Redis key−value s t o r e103 r e d i s 2 . 6 core Redis key−value s t o r e104 r e d i s 2 . 2 core Redis key−value s t o r e105 $

Listing 1.8: Login ke server

Untuk mengubah password:1 $ vmc passwd2 New Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗34 Ver i f y Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗56 Your password s t r ength i s : good7 Changing password . . . OK8 $

Listing 1.9: Mengubah password server

1.7.4. Instalasi dan Konfigurasi Node.js di Komputer Lokal

Node.js tersedia untuk Linux, Windows, Mac OS X, serta SunOS. Untuk versi Linux,kebanyakan distro sudah menyertakan paket Node.js, hanya saja ada banyak versi dariNode.js dan jika kita menggunakan manajemen paket dari distro Linux, kita hanya bisamenginstall 1 versi saja. Sebagai contoh, di Arch Linux, paket Node.js bisa diinstalldengan perintah “pacman -S nodejs” tetapi hanya pada versi resmi di repo Arch Linux(versi 0.10.5 pada tanggal 6 Mei 2013).Langkah instalasi berikut ini adalah langkah untuk instalasi tanpa manajemen paket

dari distro Linux.

X Ambil paket binary executable dari http://nodejs/download atau langsung kehttp://nodejs.org/dist/. Versi yang digunakan disini adalah 0.10.5. Downloadfile tersebut, kemudian simpan di direktori tertentu (terserah anda, dibuku inidiletakkan di $HOME/master/nodejs).

1 20:30:31−bpdp@bpdp−arch :~/ master / nodej s$ l s2 t o t a l 46723 drwxr−xr−x 2 bpdp bpdp 4096 Apr 26 20 :37 .4 drwxr−xr−x 46 bpdp bpdp 4096 May 4 23 :33 . .5 −rw−r−−r−− 1 bpdp bpdp 4770726 Apr 24 03 :34 node−v0 .10.5− l inux−x86 . ta r . gz

Page 24: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.8. Pengelolaan Aplikasi di Cloud 13

6 20:30:31−bpdp@bpdp−arch :~/ master / nodej s$

Listing 1.10: Hasil dari download Node.js

X Ekstrak ke direktori yang diinginkan. Node.js akan diinstall di direktori $HOME-/software:

1 $ cd2 $ cd so f tware3 $ ta r −xzvf ~/master / node j s /node−v0 .10.5− l inux−x86 . ta r . gz4 $ ln −s node−v0 .10.5− l inux−x86 node j s5 $ l s −l a6 . . . .7 . . . .8 lrwxrwxrwx 1 bpdp bpdp 22 May 1 07 :58 node j s −> node−v0 .10.5− l inux−x869 drwxr−xr−x 5 bpdp bpdp 4096 Apr 24 03 :31 node−v0 .10.5− l inux−x86

10 . . . .11 . . . .12 $

Listing 1.11: Ekstraksi Node.js

X Konfigurasi variabel lingkungan. Sebaiknya disimpan pada suatu file (pada bukuini, konfigurasi akan disimpan di $HOME/environment/nodejs):

1 NODEJS_HOME=/home/bpdp/ so f tware / node j s23 PATH=$PATH:$NODEJS_HOME/bin4 MANPATH=$MANPATH:$NODEJS_HOME/ share /man5 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NODEJS_HOME/ l i b6 C_INCLUDE_PATH=$C_INCLUDE_PATH:$NODEJS_HOME/ inc lude7 CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$NODEJS_HOME/ inc lude89 export PATH

10 export MANPATH11 export LD_LIBRARY_PATH12 export C_INCLUDE_PATH13 export CPLUS_INCLUDE_PATH

Listing 1.12: Konfigurasi variabel lingkungan Node.js

X Setiap akan menggunakan Node.js, yang diperlukan adalah men-source file konfig-urasi tersebut: source /̃environment/nodejs.

1.8. Pengelolaan Aplikasi di Cloud

Aplikasi yang dibuat nantinya akan di-deploy ke server CF. Pada umumnya, developerakan melakukan proses untuk upload (push), menghapus (delete), serta memperbaharui(update) aplikasi di server. Jika belum memahami sintaksis JavaScript serta penggunaannpm, jangan kuatir. Tujuan dari bab ini hanya mengenalkan pengelolaan aplikasi diCloud. Aspek lainnya akan dibahas di bab-bab berikutnya.

Page 25: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.8. Pengelolaan Aplikasi di Cloud 14

1.8.1. Push, Delete, Update Aplikasi

Pada pembahasan ini, akan diberikan contoh menggunakan dua kategori, yaitu den-gan menggunakan framework (ExpressJS - http://expressjs.com) serta tanpa meng-gunakan framework.

1.8.2. Menggunakan Framework ExpressJS

1 $ npm i n s t a l l −g expre s s

Listing 1.13: Instalasi ExpressJS menggunakan npm

Jika berhasil, maka kita bisa menggunakan perintah express untuk membuat rerangkaaplikasi. Sintaksis penggunaan ExpressJS adalah sebagai berikut:

1 $ expre s s −−help23 Usage : expre s s [ opt i ons ]45 Options :67 −h , −−help output usage in fo rmat ion8 −V, −−ve r s i on output the ve r s i on number9 −s , −−s e s s i o n s add s e s s i o n support

10 −e , −−e j s add e j s eng ine support ( d e f a u l t s to jade )11 −J , −−j shtml add jshtml engine support ( d e f a u l t s to jade )12 −H, −−hogan add hogan . j s eng ine support13 −c , −−c s s <engine> add s t y l e s h e e t <engine> support ( l e s s | s t y l u s ) ( d e f a u l t s to p l a i n c s s )14 −f , −−f o r c e f o r c e on non−empty d i r e c t o r y1516 $

Listing 1.14: Perintah express

Setelah itu, kita bisa membuat rerangka aplikasi ExpressJS dengan cara berikut:1 $ mkdir h e l l o2 $ cd h e l l o3 $ expre s s45 c r e a t e : .6 c r e a t e : . / package . j son7 c r e a t e : . / app . j s8 c r e a t e : . / pub l i c9 c r e a t e : . / pub l i c / j a v a s c r i p t s

10 c r e a t e : . / route s11 c r e a t e : . / route s / index . j s12 c r e a t e : . / route s / user . j s13 c r e a t e : . / pub l i c / s t y l e s h e e t s14 c r e a t e : . / pub l i c / s t y l e s h e e t s / s t y l e . c s s15 c r e a t e : . / views16 c r e a t e : . / views / layout . jade17 c r e a t e : . / views / index . jade18 c r e a t e : . / pub l i c / images1920 i n s t a l l dependenc ies :21 $ cd . && npm i n s t a l l2223 run the app :

Page 26: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.8. Pengelolaan Aplikasi di Cloud 15

24 $ node app2526 $

Listing 1.15: Menggunakan express untuk membuat rerangka aplikasi

Pada rerangka aplikasi tersebut, terdapat file package.json untuk mendefinisikan ap-likasi serta dependensi-nya dan app.js yang merupakan file utama untuk dijalankan padaserver.

1 {2 "name" : "hello -node" ,3 "version" : "0.0.1" ,4 "private" : true ,5 "scripts" : {6 "start" : "node app.js"7 } ,8 "dependencies" : {9 "express" : "3.2.2" ,

10 "jade" : "*"11 }12 }

Listing 1.16: package.json untuk ExpressJS

a12 /**3 * Module dependencies.4 */56 var expre s s = r equ i r e ( ’express ’ )7 , r oute s = r equ i r e ( ’./ routes ’ )8 , user = r equ i r e ( ’./ routes/user’ )9 , http = r equ i r e ( ’http’ )

10 , path = r equ i r e ( ’path’ ) ;1112 var app = expre s s ( ) ;1314 // all environments15 app . s e t ( ’port’ , p ro c e s s . env .PORT | | 3000 ) ;16 app . s e t ( ’views’ , __dirname + ’/views ’ ) ;17 app . s e t ( ’view engine ’ , ’jade’ ) ;18 app . use ( expre s s . f av i con ( ) ) ;19 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;20 app . use ( expre s s . bodyParser ( ) ) ;21 app . use ( expre s s . methodOverride ( ) ) ;22 app . use ( app . rou te r ) ;23 app . use ( expre s s . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;2425 // development only26 i f ( ’development ’ == app . get ( ’env’ ) ) {27 app . use ( expre s s . e r rorHandle r ( ) ) ;28 }2930 app . get ( ’/’ , r ou t e s . index ) ;31 app . get ( ’/users ’ , u se r . l i s t ) ;3233 http . c r e a t eS e rv e r ( app ) . l i s t e n ( app . get ( ’port’ ) , function ( ){34 conso l e . l og ( ’Express server listening on port ’ + app . get ( ’port’ ) ) ;

Page 27: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.8. Pengelolaan Aplikasi di Cloud 16

35 } ) ;

Listing 1.17: app.js untuk ExpressJS

Edit file routes/index.js sebagai berikut:12 /*3 * GET home page.4 */56 export s . index = function ( req , r e s ){7 r e s . render ( ’index’ , { t i t l e : ’Express app at CloudFoundry ’ } ) ;8 } ;

Listing 1.18: Hasil edit routes/index.js

Setelah itu, install modul-modul yang diperlukan dengan perintah npm install padadirektori tersebut. npm akan membaca file package.json kemudian menginstall modul-modul sesuai dengan deskripsi pada dependencies. Setelah diuji pada komputer lokal den-gan perintah node app.js, dan sukses bisa diakses di browser dengan alamat http://localhost:3000,maka aplikasi tersebut bisa di-deploy di CloudFoundry. Proses deployment digambarkansebagai berikut (anda sudah harus login menggunakan perintah vmc login sebelumnya)dan berada di direktori tempat aplikasi tersebut berada:

1 $ vmc push2 Name> bpdp−he l l o−expre s s34 Instances> 156 1 : node7 2 : other8 Framework> node9

10 1 : node11 2 : node0612 3 : node0813 4 : other14 Runtime> 31516 1 : 64M17 2 : 128M18 3 : 256M19 4 : 512M20 5 : 1G21 6 : 2G22 Memory Limit> 64M2324 Creat ing bpdp−he l l o−expre s s . . . OK2526 1 : bpdp−he l l o−expre s s . c loudfoundry . com27 2 : none28 Domain> bpdp−he l l o−expre s s . c loudfoundry . com2930 Updating bpdp−he l l o−expre s s . . . OK3132 Create s e r v i c e s for app l i c a t i on?> n3334 Save c on f i gu r a t i on?> n35

Page 28: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.8. Pengelolaan Aplikasi di Cloud 17

Gambar 1.5.: Hasil push ke server

36 Uploading bpdp−he l l o−expre s s . . . OK37 Sta r t i ng bpdp−he l l o−expre s s . . . OK38 Checking bpdp−he l l o−expre s s . . .39 1/1 i n s t an c e s : 1 running40 OK41 $

Listing 1.19: Deployment aplikasi ExpressJS ke CF

Hasilnya terlihat pada tampilan browser di Gambar 1.5Aplikasi yang sudah dibuat seringkali diubah, oleh karena itu vmc juga menyediakan

fasilitas untuk Mengupdate aplikasi.12 /*3 * GET home page.4 */56 export s . index = function ( req , r e s ){7 var nv = proce s s . v e r s i on ;8 r e s . render ( ’index’ , { t i t l e : ’Express app at CloudFoundry with Node.js ’ + nv } ) ;9 } ;

Listing 1.20: Update: menambahkan versi Node.js ke routes/index.js

1 $ vmc apps2 Gett ing app l i c a t i o n s . . . OK34 name s ta tu s usage runtime u r l5 he l l o−expre s s running 1 x 64M node08 bpdp−he l l o−expre s s . c loudfoundry . com6 $ vmc push he l l o−expre s s7 Uploading he l l o−expre s s . . . OK8 Stopping he l l o−expre s s . . . OK9

10 Sta r t i ng he l l o−expre s s . . . OK11 Checking he l l o−expre s s . . . OK12 $

Listing 1.21: Mengupdate aplikasi di server

Hasilnya bisa dilihat di Gambar 1.6Untuk menghapus aplikasi:

1 $ vmc de l e t e bpdp−m1−hel lonoframework2 Rea l ly d e l e t e bpdp−m1−hel lonoframework?> y3

Page 29: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.8. Pengelolaan Aplikasi di Cloud 18

Gambar 1.6.: Hasil update dengan menyertakan versi Node.js

4 De l e t ing bpdp−m1−hel lonoframework . . . OK56 $

Listing 1.22: Menghapus aplikasi yang di-deploy di CF

Pada saat deployment, kita juga bisa memilih versi Node.js (runtime) sebagai berikut:1 $ vmc push −−runtime=node082 Name> bpdp−he l l o−expres s0634 Instances> 156 1 : node7 2 : other8 Framework> node9

10 1 : 64M11 2 : 128M12 3 : 256M13 4 : 512M14 5 : 1G15 Memory Limit> 64M1617 Creat ing bpdp−he l l o−expres s06 . . . OK1819 1 : bpdp−he l l o−expres s06 . c loudfoundry . com20 2 : none21 URL> bpdp−he l l o−expres s06 . c loudfoundry . com2223 Updating bpdp−he l l o−expres s06 . . . OK2425 Create s e r v i c e s for app l i c a t i on?> n2627 Save c on f i gu r a t i on?> n2829 Uploading bpdp−he l l o−expres s06 . . . OK30 Sta r t i ng bpdp−he l l o−expres s06 . . . OK31 Checking bpdp−he l l o−expres s06 . . . OK32 $

Listing 1.23: Deployment ke CF dengan memilih runtime Node.js

Hasilnya bisa dilihat di Gambar 1.7

Page 30: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.8. Pengelolaan Aplikasi di Cloud 19

Gambar 1.7.: Deployment menggunakan versi runtime tertentu

1.8.3. Tanpa Framework

Tanpa framework, yang kita perlukan hanyalah langsung mem-push file yang kita buat(dalam contoh ini adalah app.js):

1 var http = r equ i r e ( ’http’ ) ;2 var u r l = r equ i r e ( "url" ) ;34 http . c r e a t eS e rv e r ( function ( req , r e s ) {56 var pathname = ur l . parse ( req . u r l ) . pathname ;78 r e s . writeHead (200 , {’Content -Type’ : ’text/html’ } ) ;9 r e s . wr i t e ( "Hello NodeJS <u>" + proce s s . v e r s i on + "</u>" ) ;

10 r e s . wr i t e ( "<br />Request for <b>" + pathname + "</b> received." ) ;11 r e s . end ( ) ;1213 } ) . l i s t e n ( 1337 ) ;

Listing 1.24: app.js tanpa framework

Proses deployement adalah sebagai berikut:1 $ vmc push2 Name> he l l o−noframework34 Instances> 156 1 : node7 2 : other8 Framework> node9

10 1 : node11 2 : node0612 3 : node0813 4 : other14 Runtime> 31516 1 : 64M17 2 : 128M18 3 : 256M19 4 : 512M20 5 : 1G21 Memory Limit> 64M2223 Creat ing he l l o−noframework . . . OK2425 1 : he l l o−noframework . c loudfoundry . com

Page 31: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

1.8. Pengelolaan Aplikasi di Cloud 20

Gambar 1.8.: Hasil deployement app.js tanpa framework

26 2 : none27 URL> he l l o−noframework . c loudfoundry . com2829 Updating he l l o−noframework . . . OK3031 Create s e r v i c e s for app l i c a t i on?> n3233 Save c on f i gu r a t i on?> n3435 Uploading he l l o−noframework . . . OK36 Sta r t i ng he l l o−noframework . . . OK37 Checking he l l o−noframework . . . OK38 $

Listing 1.25: Deployment app.js tanpa framework

Hasilnya bisa dilihat pada Gambar 1.8

Page 32: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

BAB 2

REPL dan Dasar-dasar JavaScript di Node.js

2.1. REPL

REPL adalah lingkungan pemrograman interaktif, tempat developer bisa mengetikkanprogram per baris dan langsung mengeksekusi hasilnya. Biasanya ini digunakan un-tuk menguji perintah-perintah yang cukup dijalankan pada satu baris atau satu bloksegmen kode sumber saja. Karena fungsinya itu, maka istilah yang digunakan adalahREPL (read-eval-print-loop), yaitu loop atau perulangan baca perintah - evaluasi per-intah - tampilkan hasil. REPL sering juga disebut sebagai interactive top level ataulanguage shell. “Tradisi” ini sudah dimulai sejak jaman LISP di mesin UNIX di era awalpengembangan development tools. Saat ini hampir semua interpreter/compiler mempun-yai REPL, misalnya Python, Ruby, Scala, PHP, berbagai interpreter/compiler LISP, dantidak ketinggalan Node.js.

2.1.1. Mengaktifkan REPL

Untuk mengaktifkan REPL dari Node.js, executable command line program-nya adalahnode. Jika node dipanggil dengan argumen nama file JavaScript, maka file JavaScripttersebut akan dieksekusi, sementara jika tanpa argumen, akan masuk ke REPL:

1 $ node2 > . help3 . break Sometimes you get stuck , t h i s g e t s you out4 . c l e a r A l i a s for . break5 . exit Exit the r ep l6 . he lp Show r ep l opt ions7 . load Load JS from a f i l e i n to the REPL s e s s i o n8 . save Save a l l eva luated commands in t h i s REPL s e s s i o n to a f i l e9 >

Listing 2.1: Node.js REPL

21

Page 33: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.1. REPL 22

Tanda “>” adalah tanda bahwa REPL Node.js siap untuk menerima perintah. Untukmelihat perintah-perintah REPL, bisa digunakan .help.

2.1.2. Perintah-perintah REPL

Pada sesi REPL, kita bisa memberikan perintah internal REPL maupun perintah-perintahlain yang sesuai dan dikenali sebagai perintah JavaScript. Perintah internal REPLNode.js terdiri atas:

X .break: keluar dan melepaskan diri dari "keruwetan" baris perintah di REPL.

X .clear: alias untuk .break

X .exit: keluar dari sesi REPL (bisa juga dengan menggunakan Ctrl-D)

X .help: menampilkan pertolong perintah internal REPL

X .load: membaca dan mengeksekusi perintah-perintah JavaScript yang terdapatpada suatu file.

X .save: menyimpan sesi REPL ke dalam suatu file.

Contoh untuk .load:1 $ node2 > . load /home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s / h e l l o . j s3 > var http = r equ i r e ( ’http’ ) ;4 undef ined5 > http . c r e a t eS e rv e r ( function ( req , r e s ) {6 . . . r e s . writeHead (200 , {’Content -Type’ : ’text/plain ’ } ) ;7 . . . r e s . end ( ’Hello World\n’ ) ;8 . . . } ) . l i s t e n (1337 , ’127.0.0.1 ’ ) ;9 { domain : null ,

10 _events :11 { reque s t : [ Function ] ,12 connect ion : [ Function : c onnec t i onL i s t ene r ] ,13 c l i e n tE r r o r : [ Function ] } ,14 _maxListeners : 10 ,15 _connections : 0 ,16 connect i ons : [ Getter / Se t t e r ] ,17 _handle : null ,18 _usingSlaves : false ,19 _slaves : [ ] ,20 allowHalfOpen : true ,21 httpAllowHalfOpen : false ,22 timeout : 120000 }23 > conso l e . l og ( ’Server running at http ://127.0.0.1:1337/ ’ ) ;24 Server running at http : // 127.0.0.1:1337/25 undef ined26 >

Listing 2.2: Contoh penggunaan .load dalam REPL

Setelah keluar dari sesi REPL, maka port akan ditutup dan hasil eksekusi di atas akandibatalkan.Untuk menyimpan hasil sesi REPL menggunakan .save, jika tanpa menyebutkan di-

rektori, maka akan disimpan di direktori aktif saat itu. Contoh:

Page 34: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 23

1 $ node2 > conso l e . l og ( "Selamat datang di Node.js" )3 Selamat datang d i Node . j s4 undef ined5 > . save /home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s /welcome . j s6 Se s s i on saved to : / home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s /welcome . j s7 > $ cat /home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s /welcome . j s8 conso l e . l og ( "Selamat datang di Node.js" )9 $

Listing 2.3: Contoh penggunaan perintah .save di sesi REPL

2.2. Dasar-dasar JavaScript di Node.js

Node.js merupakan sistem peranti lunak yang merupakan implementasi dari bahasapemrograman JavaScript. Spesifikasi JavaScript yang diimplementasikan merupakanspesifikasi resmi dari ECMAScript serta CommonJS (http://commonjs.org). Dengandemikian, jika anda sudah pernah mempelajari JavaScript sebelumnya, tata bahasa dariperintah yang dipahami oleh Node.js masih tetap sama dengan JavaScript.

2.2.1. Membaca Masukan dari Stream / Masukan Standar (stdin)

Untuk lebih memahami dasar-dasar JavaScript serta penerapannya di Node.js, seringkalikita perlu melakukan simulasi pertanyaan - proses - keluaran jawaban. Proses akan kitapelajari seiring dengan materi-materi berikutnya, sementara untuk keluaran, kita bisamenggunakan console.log. Bagian ini akan menjelaskan sedikit tentang masukan.

Perintah untuk memberi masukan di Node.js sudah tersedia pada pustaka API Read-line1. Pola dari masukan ini adalah sebagai berikut:

X me-require pustaka Readline

X membuat interface untuk masukan dan keluaran

X .. gunakan interface ..

X .. gunakan interface ..

X .. gunakan interface ..

X .. gunakan interface ..

X ..

X ..

X tutup interface

1Lengkapnya bisa diakses di http://nodejs.org/api/readline.html

Page 35: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 24

Implementasi dari pola diatas bisa dilihat pada kode sumber berikut ini (diambil darimanual Node.js):

1 var r e ad l i n e = r equ i r e ( ’readline ’ ) ;23 var r l = r e ad l i n e . c r e a t e I n t e r f a c e ({4 input : p roce s s . s td in ,5 output : p roce s s . s tdout6 } ) ;78 r l . ques t i on ( "What do you think of node.js? " , function ( answer ) {9 conso l e . l og ( "Thank you for your valuable feedback:" , answer ) ;

10 r l . c l o s e ( ) ;11 } ) ;1213 // hasil:14 // $ node readline.js15 // What do you think of node.js? awesome!16 // Thank you for your valuable feedback: awesome!17 // $

Listing 2.4: readline.js: penggunaan pustaka Readline untuk masukan

Catatan: function(answer) pada listing di atas merupakan anonymous function ataufungsi anonimus (sering juga disebut lambda function / fungsi lambda. Posisi fungsipada listing tersebut disebut dengan fungsi callback. Untuk keperluan pembahasan saatini, untuk sementara yang perlu dipahami adalah hasil input akan dimasukkan ke an-swer untuk diproses lebih lanjut. Fungsi dan callback akan dibahas lebih lanjut padapembahasan berikutnya.

2.2.2. Nilai/Value dan Tipe Data

Program dalam JavaScript akan berhubungan dengan data atau nilai. Setiap nilai mem-punyai tipe tertentu. JavaScript mengenali berbagai tipe berikut ini:

X Angka: bulat (misalnya 4) atau pecahan (misalnya 3.75)

X Boolean: nilai benar (true) dan salah (false)

X String: diapit oleh tanda petik ganda ("contoh string") atau tunggal (’contohstring’)

X null

X undefined

JavaScript adalah bahasa pemrograman yang mengijinkan pemrogram untuk tidakmendefinisikan tipe data pada saat deklarasi, atau sering juga disebut sebagai dynami-cally typed language:

Page 36: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 25

1 var jumlahMahasiswa = 302 conso l e . l og ( ’Jumlah mahasiswa dalam satu kelas = ’ + jumlahMahasiswa ) ;3 // Jumlah mahasiswa dalam satu kelas = 30

Listing 2.5: Fitur dynamically typed language

Pada contoh di atas, kita bisa melihat bahwa data akan dikonversi secara otomatispada saat program dieksekusi.

Catatan:

X Khusus untuk operator "+", JavaScript akan melakukan penggabungan string(string concatenation), tetapi untuk operator lain, akan dilakukan operasi matem-atis sesuai operator tersebut (-,/,*).

X Konversi string ke tipe numerik bisa dilakukan dengan parseInt(string) (jika bilan-gan bulat) dan parseFloat(string) (jika bilangan pecahan).

2.2.3. Variabel

Variabel adalah suatu nama yang didefinisikan untuk menampung suatu nilai. Nama iniakan digunakan sebagai referensi yang akan menunjukkan ke nilai yang ditampungnya.Nama variabel disebut dengan identifier / pengenal. Ada beberapa syarat pemberiannama identifier di JavaScript:

X Dimulai dengan huruf, underscore (_), atau tanda dollar ($).

X Karakter berikutnya bisa berupa angka, selain ketentuan pertama di atas.

X Membedakan huruf besar - kecil.

Konvensi yang digunakan oleh pemrogram JavaScript terkait dengan penamaan ini adalahvariasi dari metode camel case, yaitu camelBack. Contoh: jumlahMahasiswa, linkMenu,status.

2.2.4. Konstanta

Konstanta mirip dengan variabel, hanya saja sifatnya read-only, tidak bisa diubah-ubahsetelah ditetapkan. Untuk menetapkan konstanta di JavaScript, digunakan kata kunciconst. Contoh:

1 const MENU = "Home" ;23 conso l e . l og ( "Posisi menu = " + MENU) ;45 // mencoba mengisi MENU. berhasil?67 MENU = "About" ;8

Page 37: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 26

9 conso l e . l og ( "Posisi menu = " + MENU) ;1011 // Posisi menu = Home12 // Posisi menu = Home

Listing 2.6: Contoh konstanta dalam JavaScript

Konvensi penamaan konstanta adalah menggunakan huruf besar semua. Bagian ini(sampai saat buku ini ditulis) hanya berlaku di Firefox dan Google Chrome - V8 (artinyaberlaku juga untuk Node.js).

2.2.5. Fungsi

Pengertian Fungsi

Fungsi merupakan subprogram atau suatu bagian dari keseluruhan program yang ditu-jukan untuk mengerjakan suatu pekerjaan tertentu dan (biasanya) menghasilkan suatunilai kembalian. Subprogram ini relatif independen terhadap bagian-bagian lain sehinggamemenuhi kaidah "bisa-digunakan-kembali" atau reusable pada beberapa program yangmemerlukan fungsionalitasnya. Fungsi dalam ilmu komputer sering kali juga disebutdengan prcedure, routine, atau method.

Definisi Fungsi

Definisi fungsi dari JavaScript di Node.js bisa dilakukan dengan sintaksis berikut ini:1 function namaFungsi ( argumen1 , argumen2 , . . . , argumentN ) {2 . .3 JavaScr ipt code . .4 JavaScr ipt code . .5 JavaScr ipt code . .6 JavaScr ipt code . .7 . .8 }

Listing 2.7: Sintaksis Fungsi dalam JavaScript

Setelah dideklarasikan, fungsi tersebut bisa dipanggil dengan cara sebagai berikut:1 . .2 . .3 namaFungsi ( argumen1 , argumen2 , . . . , argumenN ) ;4 . .5 . .

Listing 2.8: Pemanggilan Fungsi dalam JavaScript

Contoh dalam program serta pemanggilannya adalah sebagai berikut:1 $ node2 > function addX( angka ) {3 . . . c on so l e . l og ( angka + 10 ) ;4 . . . }5 undef ined6 > addX ( 2 0 ) ;7 30

Page 38: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 27

8 undef ined9 >

10 > function add2Numbers ( angka1 , angka2 ) {11 . . . return angka1 + angka2 ;12 . . . }13 undef ined14 > conso l e . l og ( "232 + 432 = " + add2Numbers (232 , 4 3 2 ) ) ;15 232 + 432 = 66416 undef ined17 >

Listing 2.9: Contoh deklarasi fungsi dan pemanggilannya

Fungsi Anonim

Fungsi anonim adalah fungsi tanpa nama, pemrogram tidak perlu memberikan namake fungsi. Biasanya fungsi anonimus ini hanya digunakan untuk fungsi yang dikerjakanpada suatu bagian program saja dan tidak dengan maksud untuk dijadikan komponenyang bisa dipakai di bagian lain dari program (biasanya untuk menangani event ataucallback). Untuk mendeklarasikan fungsi ini, digunakan literal function.

1 var pangkat = function ( angka ) {return angka ∗ angka } ;2 conso l e . l og ( pangkat ( 1 0 ) ) ;3 // output: 100

Listing 2.10: Fungsi anonim

Fungsi Rekursif

Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri. Contoh dari aplikasi fungsirekursif adalah pada penghitungan faktorial berikut:

1 function f a c t o r i a l (n ) {23 i f ( ( n == 0) | | (n == 1))4 return 1 ;5 else6 return (n ∗ f a c t o r i a l (n − 1 ) ) ;78 }9

10 conso l e . l og ( "factorial (6) = " + f a c t o r i a l ( 6 ) ) ;1112 // hasil:13 // factorial (6) = 720

Listing 2.11: Fungsi rekursif untuk menghitung faktorial

Fungsi di dalam Fungsi / Nested Functions

Saat mendefinisikan fungsi, di dalam fungsi tersebut pemrogram bisa mendefinisikanfungsi lainnya. Meskipun demikian, fungsi yang terletak dalam suatu definisi fungsi tidakbisa diakses dari luar fungsi tersebut dan hanya tersedia untuk fungsi yang didefinisikan.

Page 39: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 28

1 function induk ( ) {23 var awal = 0 ;4 function tambahkan ( ) {5 awal++;6 }78 tambahkan ( ) ;9 tambahkan ( ) ;

1011 conso l e . l og ( ’Nilai = ’ + awal ) ;1213 }1415 induk ( ) ;16 tambahkan ( ) ;1718 // hasil:19 // Nilai = 220 //21 // /home/bpdp/kerjaan/git -repos/buku -cloud -nodejs/22 // src/bab -02/ nested.js:1223 // tambahkan ();24 // ^25 // ReferenceError: tambahkan is not defined26 // at Object.<anonymous > (/home/bpdp/kerjaan/git -repos/27 // buku -cloud -nodejs/src/bab -02/ nested.js :12:1)28 // at Module._compile (module.js :456:26)29 // at Object.Module._extensions ..js (module.js :474:10)30 // at Module.load (module.js :356:32)31 // at Function.Module._load (module.js :312:12)32 // at Function.Module.runMain (module.js :497:10)33 // at startup (node.js :119:16)34 // at node.js :901:3

Listing 2.12: Fungsi di dalam Fungsi

2.2.6. Literal

Literal digunakan untuk merepresentasikan nilai dalam JavaScript. Ada beberapa tipeliteral.

Literal Array

Array atau variabel berindeks adalah penampung untuk obyek yang menyerupai list ataudaftar. Obyek array juga menyediakan berbagai fungsi dan metode untuk mengolahanggota yang terdapat dalam daftar tersebut (terutama untuk operasi traversal danpermutasi. Listing berikut menunjukkan beberapa operasi untuk literal array.

1 var arrMembers = [ ’one’ , ’two’ , , ’three ’ , ] ;2 // sengaja ada koma di bagian akhir3 conso l e . l og ( arrMembers [ 0 ] ) ;4 // hasil: one5 conso l e . l og ( arrMembers [ 2 ] ) ;6 // hasil: undefined7 conso l e . l og ( arrMembers [ 3 ] ) ;8 // hasil: three

Page 40: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 29

9 conso l e . l og ( arrMembers [ 4 ] ) ;10 // hasil: undefined - karena tidak ada11 conso l e . l og ( arrMembers . l ength ) ;12 // hasil: 413 var multiArray = [14 [ ’0-0’ , ’0-1’ , ’0-2’ ] ,15 [ ’1-0’ , ’1-1’ , ’1-2’ ] ,16 [ ’2-0’ , ’2-1’ , ’2-2’ ] ] ;17 conso l e . l og ( multiArray [ 0 ] [ 2 ] ) ;18 // hasil: 0-219 conso l e . l og ( multiArray [ 1 ] [ 2 ] ) ;20 // hasil: 1-2

Listing 2.13: Array di JavaScript

Literal Boolean

Literal boolean menunjukkan nilai benar (true) atau salah (false).

Literal Integer

Literal integer digunakan untuk mengekspresikan nilai bilangan bulat. Nilai bulanganbulat dalam JavaScript bisa dalam bentuk:

X decimal (basis 10): digit tanpa awalan nol.

X octal (basis 8): digit diawali dengan 1 angka nol.2

X hexadecimal (basis 16): digit diawali dengan 0x.

Literal Floating-point

Literal ini digunakan untuk mengekspresikan nilai bilangan pecahan, misalnya 0.4343atau bisa juga menggunakan E/e (nilai eksponensial), misalnya -3.1E12.

Literal Obyek

Literal ini akan dibahas di bab yang menjelaskan tentang paradigma pemrograman beror-ientasi obyek di JavaScript.

Literal String

Literal string mengekspresikan suatu nilai dalam bentuk sederetan karakter dan beradadalam tanda petik (ganda/“” maupun tunggal/”). Contoh:

X “Kembali ke halaman utama”

X ’Lisensi’

X “Hari ini, Jum’at, tanggal 21 November”2pada ECMA-262, bilangan octal ini sudah tidak digunakan lagi.

Page 41: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 30

X “1234.543”

X “baris pertama \n baris kedua”

Contoh terakhir di atas menggunakan karakter khusus (\n). Beberapa karakter khususlainnya adalah:

X \b: Backspace

X \f: Form feed

X \n: New line

X \r: Carriage return

X \t: Tab

X \v: Vertical tab

X \’: Apostrophe atau single quote

X \": Double quote

X \\: Backslash (\).

X \XXX: Karakter dengan pengkodean Latin-1 dengan tiga digit octal antara 0 and377. (misal, \251 adalah simbol hak cipta).

X \xXX: seperti di atas, tetapi hexadecimal (2 digit).

X \uXXXX: Karakter Unicode dengan 3 digit karakter hexadecimal.

Backslash sendiri sering digunakan sebagai escape character, misalnya “NaN seringdisebut juga sebagai \”Not a Number\“”.

2.2.7. Struktur Data dan Representasi JSON

JSON (JavaScript Object Notation) adalah subset dari JavaScript dan merupakan struk-tur data native di JavaScript. Bentuk dari representasi struktur data JSON adalahsebagai berikut3:

1 var data = {2 "firstName" : "John" ,3 "lastName" : "Smith" ,4 "age" : 25 ,5 "address" : {6 "streetAddress" : "21 2nd Street" ,7 "city" : "New York" ,8 "state" : "NY" ,9 "postalCode" : "10021"

10 } ,

3http://en.wikipedia.org/wiki/JSON dengan sedikit perubahan

Page 42: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 31

11 "phoneNumber" :12 {13 "home" : "212 555 -1234" ,14 "fax" : "646 555 -4567"15 }16 }1718 conso l e . l og ( data . f i r stName + " " + data . lastName +19 " has this phone number = "20 + data . phoneNumber . home ) ;2122 // hasil:23 // John Smith has this phone number = 212 555 -1234

Listing 2.14: Representasi JSON

Dari representasi di atas, kita bisa membaca:

X Nilai data “firstname” adalah “John”

X Data “address” terdiri atas sub data “streetAddress”, “city”, “state”, dan “postal-Code” yang masing-masing mempunyai nilai data sendiri-sendiri.

X dan seterusnya

2.2.8. Aliran Kendali

Alur program dikendalikan melalui pernyataan-pernyataan untuk aliran kendali. Adabeberapa pernyataan aliran kendali yang akan dibahas.

Pernyataan Kondisi if .. else if .. else

Pernyataan ini digunakan untuk mengerjakan atau tidak mengerjakan suatu bagian ataublok program berdasarkan hasil evaluasi kondisi tertentu.

1 var kond i s i = fa l se ;2 i f ( kond i s i ) {3 conso l e . l og ( ’hanya dikerjakan jika kondisi bernilai benar/true’ ) ;4 } ;5 // hasil: n/a, tidak ada hasilnya6 var kond i s i = true ;7 i f ( kond i s i ) {8 conso l e . l og ( ’hanya dikerjakan jika kondisi bernilai benar/true’ ) ;9 } ;

10 // hasil: hanya dikerjakan jika kondisi bernilai benar/true11 // Contoh berikut lebih kompleks , melibatkan input1213 var r e ad l i n e = r equ i r e ( ’readline ’ ) ;1415 var r l = r e ad l i n e . c r e a t e I n t e r f a c e ({16 input : p roce s s . s td in ,17 output : p roce s s . s tdout18 } ) ;1920 r l . ques t i on ( "Masukkan angka nilai: " , function ( answer ) {21 i f ( answer > 80) {22 conso l e . l og ( "Nilai: A" ) ;

Page 43: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 32

23 } else i f ( answer > 70) {24 conso l e . l og ( "Nilai: B" ) ;25 } else i f ( answer > 40) {26 conso l e . l og ( "Nilai: C" ) ;27 } else i f ( answer > 30) {28 conso l e . l og ( "Nilai: D" ) ;29 } else {30 conso l e . l og ( "Tidak lulus" ) ;31 }32 r l . c l o s e ( ) ;33 } ) ;3435 // hasil:36 // hanya dikerjakan jika kondisi bernilai benar/true37 // Masukkan angka nilai: 5038 // Nilai: C

Listing 2.15: Pernyataan if .. else if .. else

Pernyataan switch

Pernyataan ini digunakan untuk mengevaluasi suatu ekspresi dan membandingkan samaatau tidaknya dengan suatu label tertentu di dalam struktur pernyataan switch, sertamengeksekusi perintah-perintah sesuai dengan label yang cocok.

1 var r e ad l i n e = r equ i r e ( ’readline ’ ) ;23 var r l = r e ad l i n e . c r e a t e I n t e r f a c e ({4 input : p roce s s . s td in ,5 output : p roce s s . s tdout6 } ) ;78 conso l e . l og ( "Menu" ) ;9 conso l e . l og ( "====" ) ;

10 conso l e . l og ( "1. Mengisi data" ) ;11 conso l e . l og ( "2. Mengedit data" ) ;12 conso l e . l og ( "3. Menghapus data" ) ;13 conso l e . l og ( "4. Mencari data" ) ;14 r l . ques t i on ( "Masukkan angka pilihan anda: " , function ( answer ) {15 conso l e . l og ( "Pilihan anda: " + answer ) ;16 switch ( answer ) {17 case "1" :18 conso l e . l og ( "Anda memilih menu pengisian data" ) ;19 break ;20 case "2" :21 conso l e . l og ( "Anda memilih menu pengeditan data" ) ;22 break ;23 case "3" :24 conso l e . l og ( "Anda memilih menu penghapusan data" ) ;25 break ;26 case "4" :27 conso l e . l og ( "Anda memilih menu pencarian data" ) ;28 break ;29 d e f au l t :30 conso l e . l og ( "Anda tidak memilih salah satu dari menu di atas" ) ;31 break ;32 }33 r l . c l o s e ( ) ;34 } ) ;35

Page 44: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 33

36 // hasil:37 // $ node switch.js38 // Menu39 // ====40 // 1. Mengisi data41 // 2. Mengedit data42 // 3. Menghapus data43 // 4. Mencari data44 // Masukkan angka pilihan anda: 1045 // Pilihan anda: 1046 // Anda tidak memilih salah satu dari menu di atas47 // $ node switch.js48 // Menu49 // ====50 // 1. Mengisi data51 // 2. Mengedit data52 // 3. Menghapus data53 // 4. Mencari data54 // Masukkan angka pilihan anda: 255 // Pilihan anda: 256 // Anda memilih menu pengeditan data

Listing 2.16: Pernyataan Contoh penggunaan “switch”

Looping

Looping atau sering juga disebut “kalang” adalah konstruksi program yang digunakanuntuk melakukan suatu blok perintah secara berulang-ulang.for

1 f o r (var i = 0 ; i < 9 ; i++) {2 conso l e . l og ( i ) ;3 }45 // hasil:6 // 07 // 18 // 29 // 3

10 // 411 // 512 // 613 // 714 // 8

Listing 2.17: Pernyataan for

Pernyataan “for” juga bisa digunakan untuk mengakses data yang tersimpam dalamstruktur data JavaScript (JSON).

1 var data = {a : 1 , b : 2 , c : 3 } ;23 f o r (var i t e r a s i in data ) {4 conso l e . l og ( "Nilai dari iterasi " + i t e r a s i + " adalah: " + data [ i t e r a s i ] ) ;5 }67 // hasil:8 // Nilai dari iterasi a adalah: 19 // Nilai dari iterasi b adalah: 2

Page 45: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 34

10 // Nilai dari iterasi c adalah: 3

Listing 2.18: Pernyataan for .. in

do .. whilePernyataan ini digunakan untuk mengerjakan suatu blok program selama suatu kondisi

bernilai benar dengan jumlah minimal pengerjaan sebanyak 1 kali.1 var i = 0 ;2 do {3 i += 2 ;4 conso l e . l og ( i ) ;5 } while ( i < 20 ) ;67 // hasil:8 // 29 // 4

10 // 611 // 812 // 1013 // 1214 // 1415 // 1616 // 1817 // 20

Listing 2.19: Pernyataan do .. while

whileSeperti do .. while, pernyataan ini digunakan untuk mengerjakan suatu blok program

secara berulang-ulang selama kondisi bernilai benar. Meskipun demikian, bisa saja blokprogram tersebut tidak pernah dikerjakan jika pada saat awal expresi dievaluasi sudahbernilai false.

1 var n = 0 ;2 var x = 0 ;34 while (n < 5) {5 n ++;6 x += n ;7 conso l e . l og ( "Nilai n = " + n ) ;8 conso l e . l og ( "Nilai x = " + x ) ;9 }

1011 // hasil:12 // Nilai n = 113 // Nilai x = 114 // Nilai n = 215 // Nilai x = 316 // Nilai n = 317 // Nilai x = 618 // Nilai n = 419 // Nilai x = 1020 // Nilai n = 521 // Nilai x = 15

Listing 2.20: Pernyataan while

label, break, dan continueBagian ini digunakan dalam looping dan switch.

Page 46: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 35

X label digunakan untuk memberi pengenal pada suatu lokasi program sehingga bisadireferensi oleh break maupun continue (jika dikehendaki).

X break digunakan untuk menghentikan eksekusi dan meneruskan alur program kepernyataan setelah looping atau switch

X continue digunakan untuk meneruskan eksekusi ke iterasi atau ke kondisi switchberikutnya.

1 var n = 0 ;2 var x = 0 ;34 while (n < 5) {5 n ++;6 x += n ;78 i f ( x%2 == 0) {9 cont inue ;

10 } ;1112 i f (x>10) {13 break ;14 } ;1516 conso l e . l og ( "Nilai n = " + n ) ;17 conso l e . l og ( "Nilai x = " + x ) ;1819 } ;20 // hasil:21 //Nilai n = 122 //Nilai x = 123 //Nilai n = 224 //Nilai x = 3

Listing 2.21: Pernyataan break dan continue

1 topLabel :2 f o r (var k = 0 ; k < 10 ; k++){3 f o r (var m = 0 ; m < 20 ; m++){4 i f (m == 5){5 conso l e . l og ( "Nilai k = " + k ) ;6 conso l e . l og ( "Nilai m = " + m) ;7 break topLabel ;8 }9 }

10 }11 // hasil:12 //Nilai k = 013 //Nilai m = 5

Listing 2.22: Pernyataan break dengan label

2.2.9. Penanganan Error

JavaScript mendukung pernyataan try .. catch .. finally serta throw untuk menangani er-ror. Meskipun demikian, banyak hal yang tidak sesuai dengan konstruksi ini karena sifat

Page 47: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

2.2. Dasar-dasar JavaScript di Node.js 36

JavaScript yang asynchronous. Untuk kasus asynchrous, pemrogram lebih disarankanmenggunakan function callback.

1 try {2 gakAdaFungsiIni ( ) ;3 } catch ( e ) {4 conso l e . l og ( "Error: " + e . message ) ;5 } f i n a l l y {6 conso l e . l og ( "Bagian ’pembersihan ’, akan dikerjakan , apapun yang terjadi" ) ;7 } ;89 // hasil:

10 // Error: gakAdaFungsiIni is not defined11 // Bagian ’pembersihan ’, akan dikerjakan , apapun yang terjadi

Listing 2.23: Pernyataan try catch finally

Jika diperlukan, kita bisa mendefinisikan sendiri error dengan menggunakan perny-ataan throw.

1 try {2 var a = 1/0 ;3 throw "Pembagian oleh angka 0" ;4 } catch ( e ) {5 conso l e . l og ( "Error: " + e ) ;6 } ;78 // hasil:9 // Error: Pembagian oleh angka 0

Listing 2.24: Pernyataan try catch throw

Page 48: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

BAB 3

Paradigma Pemrograman di JavaScript

3.1. Pemrograman Fungsional

Pemrograman fungsional, atau sering disebut functional programming, selama ini lebihsering dibicarakan di level para akademisi. Meskipun demikian, saat ini terdapat kecen-derungan paradigma ini semakin banyak digunakan di industri. Contoh nyata dari im-plementasi paradigma ini di industri antara lain adalah Scala (http://www.scala-lang.org), OCaml (http://www.ocaml.org), Haskell (http://www.haskell.org), MicrosoftF# (http://fsharp.org), dan lain-lain. Dalam konteks paradigma pemrograman, per-anti lunak yang dibangun menggunakan pendekatan paradigma ini akan terdiri atasberbagai fungsi yang mirip dengan fungsi matematis. Fungsi matematis tersebut di-evaluasi dengan penekanan pada penghindaran state serta mutable data. Bandingkandengan paradigma pemrograman prosedural yang menekankan pada immutable data dandefinisi berbagai prosedur dan fungsi untuk mengubah state serta data.JavaScript bukan merupakan bahasa pemrograman fungsional yang murni, tetapi ada

banyak fitur dari pemrograman fungsional yang terdapat dalam JavaScript. Dalam halini, JavaScript banyak dipengaruhi oleh bahasa pemrograman Scheme (http://www.schemers.org/). Bab ini akan membahas beberapa fitur pemrograman fungsional diJavaScript. Pembahasan ini didasari pembahasan di bab sebelumnya tentang Fungsi diJavaScript.

3.1.1. Ekspresi Lambda

Ekspresi lambda / lambda expression merupakan hasil karya dari ALonzo Church sekitartahun 1930-an. Aplikasi dari konsep ini di dalam pemrograman adalah penggunaanfungsi sebagai parameter untuk suatu fungsi. Dalam pemrograman, lambda functionsering juga disebut sebagai fungsi anonimus (fungsi yang dipanggil/dieksekusi tanpa

37

Page 49: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

3.1. Pemrograman Fungsional 38

ditautkan (bound) ke suatu identifier). Berikut adalah implementasi dari konsep ini diJavaSCript:

1 // Diambil dari2 // http :// stackoverflow.com/questions /3865335/ what -is -a-lambda -language3 // dengan beberapa perubahan45 function applyOperation (a , b , opera t i on ) {6 return opera t i on (a , b ) ;7 }89 function add (a , b) {

10 return a+b ;11 }1213 function subt rac t ( a , b ) {14 return a−b ;15 }1617 conso l e . l og ( ’1,2, add: ’ + applyOperation (1 , 2 , add ) ) ;18 conso l e . l og ( ’43,21, subtract: ’ + applyOperation (43 ,21 , subt rac t ) ) ;1920 conso l e . l og ( ’4^3: ’ + applyOperation (4 , 3 , function ( a , b ) {return Math . pow(a , b ) } ) )2122 // hasil:23 // 1,2, add: 324 // 43,21, subtract: 2225 // 4^3: 64

Listing 3.1: Ekspresi Lambda di JavaScript

3.1.2. Higher-order Function

Higher-order function (sering disebut juga sebagai functor adalah suatu fungsi yangsetidak-tidaknya menggunakan satu atau lebih fungsi lain sebagai parameter dari fungsi,atau menghasilkan fungsi sebagai nilai kembalian.

1 function forEach ( array , a c t i on ) {2 f o r (var i = 0 ; i < array . l ength ; i++ )3 ac t i on ( array [ i ] ) ;4 }56 function pr in t (word ) {7 conso l e . l og (word ) ;8 }9

10 function makeUpperCase (word ) {11 conso l e . l og (word . toUpperCase ( ) ) ;12 }1314 forEach ( [ "satu" , "dua" , "tiga" ] , p r i n t ) ;15 forEach ( [ "satu" , "dua" , "tiga" ] , makeUpperCase ) ;1617 // hasil:18 //satu19 //dua20 //tiga21 //SATU22 //DUA

Page 50: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

3.1. Pemrograman Fungsional 39

23 //TIGA

Listing 3.2: Higher-order Function di JavaScript

3.1.3. Closure

Suatu closure merupakan definisi suatu fungsi bersama-sama dengan lingkungannya.Lingkungan tersebut terdiri atas fungsi internal serta berbagai variabel lokal yang masihtetap tersedia saat fungsi utama / closure tersebut selesai dieksekusi.

1 // Diambil dengan sedikit perubahan dari:2 // https :// developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures3 function makeAdder (x ) {4 return function ( y ) {5 return x + y ;6 } ;7 }89 var add5 = makeAdder ( 5 ) ;

10 var add10 = makeAdder ( 1 0 ) ;1112 conso l e . l og ( add5 ( 2 ) ) ; // 713 conso l e . l og ( add10 ( 2 ) ) ; // 12

Listing 3.3: Closure di JavaScript

3.1.4. Currying

Currying memungkinkan pemrogram untuk membuat suatu fungsi dengan cara menggu-nakan fungsi yang sudah tersedia secara parsial, artinya tidak perlu menggunakan semuaargumen dari fungsi yang sudah tersedia tersebut.

1 // Diambil dari:2 // http :// javascriptweblog.wordpress.com /2010/04/05/3 // curry -cooking -up -tastier -functions/4 // dengan sedikit perubahan56 function toArray ( fromEnum) {7 return Array . prototype . s l i c e . c a l l ( fromEnum ) ;8 }9

10 Function . prototype . curry = function ( ) {11 i f ( arguments . length <1) {12 return this ; // nothing to curry with - return function13 }14 var __method = this ;15 var args = toArray ( arguments ) ;16 return function ( ) {17 return __method . apply ( this , a rgs . concat ( toArray ( arguments ) ) ) ;18 }19 }2021 var add = function ( a , b ) {22 return a + b ;23 }2425 // create function that returns 10 + argument

Page 51: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

3.2. Pemrograman Berorientasi Obyek 40

26 var addTen = add . curry ( 1 0 ) ;27 conso l e . l og ( addTen ( 2 0 ) ) ; //30

Listing 3.4: Currying di JavaScript

3.2. Pemrograman Berorientasi Obyek

3.2.1. Pengertian

Pemrograman Berorientasi Obyek (selanjutnya akan disingkat PBO) adalah suatu paradigmapemrograman yang memandang bahwa pemecahan masalah pemrograman akan dilakukanmelalui definisi berbagai kelas kemudian membuat berbagai obyek berdasarkan kelas yngdibuat tersebut dan setelah itu mendefinisikan interaksi antar obyek tersebut dalammemecahkan masalah pemrograman. Obyek bisa saling berinteraksi karena setiap obyekmempunyai properti (sifat / karakteristik) dan method untuk mengerjakan suatu peker-jaan tertentu. Jadi, bisa dikatakan bahwa paradigma ini menggunakan cara pandangyang manusiawi dalam penyelesaian masalah.Dengan demikian, inti dari PBO sebenarnya terletak pada kemampuan untuk mengab-

straksikan berbagai obyek ke dalam kelas (yang terdiri atas properti serta method).Paradigma PBO biasanya juga mencakup inheritance atau pewarisan (sehingga terben-tuk skema yang terdiri atas superclass dan subclass). Ciri lainnya adalah polymorphismdan encapsulation / pengkapsulan.JavaScript adalah bahasa pemrograman yang mendukung PBO dan merupakan im-

plementasi dari ECMAScript. Implementasi PBO di JavaScript adalah prototype-basedprogramming yang merupakan salah satu subset dari PBO. Pada prototype-based pro-gramming, kelas / class tidak ada. Pewarisan diimplementasikan melalui prototype.

3.2.2. Definisi Obyek

Definisi obyek dilakukan dengan menggunakan definisi function, sementara this digu-nakan di dalam definisi untuk menunjukkan ke obyek tersebut. Sementara itu, Ke-las.prototype.namaMethod digunakan untuk mendefinisikan method dengan nama methodnamaMethod pada kelas Kelas. Perhatikan contoh pada listing berikut.

1 var u r l = r equ i r e ( ’url’ ) ;23 // Definisi obyek4 function Halaman( alamatUrl ) {5 this . u r l = alamatUrl ;6 conso l e . l og ( "Mengakses alamat " + alamatUrl ) ;7 }89 Halaman . prototype . getDomainName = function ( ) {

10 return u r l . parse ( this . ur l , true ) . host ;11 }12 // sampai disini definisi obyek13 // Halaman.prototype.getDomainName => menetapkan method getDomainName14 // untuk obyek1516 var halSatu = new Halaman( "http :// nodejs.org/api/http.html" ) ;

Page 52: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

3.2. Pemrograman Berorientasi Obyek 41

17 var halDua = new Halaman( "http :// bpdp.name/login?fromHome" ) ;1819 conso l e . l og ( "Alamat URL yang diakses oleh halSatu = " + halSatu . u r l ) ;20 conso l e . l og ( "Alamat URL yang diakses oleh halDua = " + halDua . u r l ) ;2122 conso l e . l og ( "Nama domain halDua = " + halDua . getDomainName ( ) ) ;2324 // hasil:25 // Mengakses alamat http :// nodejs.org/api/http.html26 // Mengakses alamat http :// bpdp.name/login?fromHome27 // Alamat URL yang diakses oleh halSatu = http :// nodejs.org/api/http.html28 // Alamat URL yang diakses oleh halDua = http :// bpdp.name/login?fromHome29 // Nama domain halDua = bpdp.name

Listing 3.5: Definisi obyek di JavaScript

3.2.3. Inheritance / Pewarisan

Pewarisan di JavaScript bisa dicapai menggunakan prototype. Listing program berikutmemperlihatkan bagaimana pewarisan diimplementasikan di JavaScript.

1 // Definisi obyek2 function Kelas (param) {3 this . property1 = new St r ing (param ) ;4 }56 Kelas . prototype . methodSatu = function ( ) {7 return this . property1 ;8 }9

10 var ke la sSatu = new Kelas ( "ini parameter 1 dari kelas 1" ) ;1112 conso l e . l og ( "Property 1 dari kelasSatu = " + ke lasSatu . property1 ) ;13 conso l e . l og ( "Property 1 dari kelasSatu , diambil dari method = " + ke lasSatu . methodSatu ( ) ) ;1415 // Definisi inheritance:16 // SubKelas merupakan anak dari Kelas yang didefinisikan17 // di atas.1819 SubKelas . prototype = new Kelas ( ) ;20 SubKelas . prototype . c on s t ruc to r = SubKelas ;2122 function SubKelas (param) {23 this . property1 = new St r ing (param ) ;24 }2526 // method overriding27 SubKelas . prototype . methodSatu = function ( keHurufBesar ) {28 conso l e . l og ( "Ubah ke huruf besar? = " + keHurufBesar ) ;29 i f ( keHurufBesar ) {30 return this . property1 . toUpperCase ( ) ;31 } else {32 return this . property1 . toLowerCase ( ) ;33 }34 }3536 SubKelas . prototype . methodDua = function ( ) {37 conso l e . l og ( "Berada di method dua dari SubKelas" ) ;38 }39

Page 53: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

3.2. Pemrograman Berorientasi Obyek 42

40 // mari diuji41 var subKelasSatu = new SubKelas ( "Parameter 1 Dari Sub Kelas 1" ) ;4243 conso l e . l og ( "Property 1 dari sub kelas 1 = " + subKelasSatu . property1 ) ;44 conso l e . l og ( "Property 1 dari sub kelas 1, dr method+param = " + subKelasSatu . methodSatu ( true ) ) ;45 conso l e . l og ( "Property 1 dari sub kelas 1, dr method+param = " + subKelasSatu . methodSatu ( fa l se ) ) ;4647 conso l e . l og ( subKelasSatu . methodDua ( ) ) ;48 // hasil:49 //50 // Property 1 dari kelasSatu = ini parameter 1 dari kelas 151 // Property 1 dari kelasSatu , diambil dari method = ini52 // parameter 1 dari kelas 153 // Property 1 dari sub kelas 1 = Parameter 1 Dari Sub Kelas 154 //Ubah ke huruf besar? = true55 // Property 1 dari sub kelas 1, dr method+param =56 // PARAMETER 1 DARI SUB KELAS 157 //Ubah ke huruf besar? = false58 // Property 1 dari sub kelas 1, dr method+param =59 // parameter 1 dari sub kelas 160 // Berada di method dua dari SubKelas

Listing 3.6: Pewarisan di PBO JavaScript

Page 54: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

BAB 4

Mengelola Paket Menggunakan npm

4.1. Apakah npm Itu?

Node.js memungkinkan developer untuk mengembangkan aplikasi secara modular denganmemisahkan berbagai komponen reusable code ke dalam pustaka (library). Berbagaipustaka tersebut bisa diperoleh di http://npmjs.org. Node.js menyediakan perintahnpm untuk mengelola paket pustaka di repositori tersebut. Untuk menggunakan utilitasini, pemrogram harus terkoneksi dengan Internet.

4.2. Menggunakan npm

Saat melakukan instalasi Node.js, secara otomatis npm akan disertakan. Dengan perin-tah npm tersebut, seorang pemrogram bisa mengelola pustaka yang tersedia di reposi-tori. Jika pemrogram mempunya pustakan yang bisa digunakan oleh orang lain, makapemrogram yang bersangkutan juga bisa menyimpan pustaka tersebut ke dalam reposi-tori sehingga memungkinkan untuk diinstall oleh pemrogram-pemrogram lain di seluruhdunia. Sintaksis lengkap dari penggunaan perintah npm ini adalah sebagai berikut1:

1 $ npm −−help23 Usage : npm <command>45 where <command> i s one o f :6 add−user , adduser , apihe lp , author , bin , bugs , c , cache ,7 completion , con f i g , ddp , dedupe , deprecate , docs , ed i t ,8 explore , faq , f ind , f ind−dupes , get , help , help−search ,9 home , i , in fo , i n i t , i n s t a l l , i s n t a l l , i s s u e s , la , l ink ,

10 l i s t , l l , ln , l og in , l s , outdated , owner , pack , p r e f i x ,11 prune , publ i sh , r , rb , r ebu i ld , remove , r e s t a r t , rm , root ,12 run−s c r i p t , s , se , search , set , show , shrinkwrap , s tar ,

1beberapa bagian tertulis spesifik lokasi direktori di komputer yang digunakan penulis

43

Page 55: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

4.2. Menggunakan npm 44

13 s ta r s , s t a r t , stop , submodule , tag , test , t s t , un ,14 un i n s t a l l , unl ink , unpublish , unstar , up , update , ver s ion ,15 view , whoami1617 npm <cmd> −h quick help on <cmd>18 npm − l d i sp l ay f u l l usage i n f o19 npm faq commonly asked que s t i on s20 npm help <term> search for help on <term>21 npm help npm invo lved overview2223 Spec i f y c on f i g s in the in i−formatted f i l e :24 /home/bpdp / . npmrc25 or on the command l i n e v ia : npm <command> −−key value26 Config i n f o can be viewed v ia : npm help c on f i g2728 npm@1. 2 . 1 8 /home/bpdp/ so f tware /node−v0 .10.5− l inux−x86/ l i b /node_modules/npm

Listing 4.1: Sintaksis lengkap perintah npm

Pada bagian berikut, kita akan membahas lebih lanjut penggunaan perintah npm terse-but.

4.2.1. Instalasi Paket

npm sebenarnya bukan merupakan singkatan dari Node Package Manager, meskipunseringkali orang menterjemahkan dengan singkatan tersebut dan npm seharusnya ditulisdalam huruf kecil semua seperti yang dijelaskan pada FAQ (Frequently Asked Questions)2.npm merupakan bilah alat berbasis baris perintah, dijalankan melalui shell atau commandprompt. Sama seperti kebanyakan bilah alat berbasis baris perintah lain, npm memilikistruktur perintah npm perintah argumen. Installasi paket pustaka dilakukan denganperintah berikut :

1 $ npm i n s t a l l namapaket

Listing 4.2: Cara install paket menggunakan npm

Perintah diatas akan memasang versi terakhir dari paket “namapaket”. Selain itu npmjuga dapat memasang paket langsung pada sebuah folder, tarball atau tautan untuksebuah tarball.

4.2.2. Struktur Instalasi Paket Node.js

Dalam installasi paket pustaka, berkas-berkas akan terletak dalam folder lokal aplikasinode_modules. Pada mode installasi paket pustaka global (dengan -g atau –globaldibelakang baris perintah), paket pustaka akan dipasang pada /usr/lib/node_modules(dengan lokasi installasi Node.js standar). Mode global memungkinkan paket pustakadigunakan tanpa memasang paket pustaka pada setiap folder lokal aplikasi. Mode globalini juga membutuhkan hak administrasi lebih (sudo atau root) dari pengguna agar dapatmenulis pada lokasi standar.

2https://npmjs.org/doc/faq.html

Page 56: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

4.2. Menggunakan npm 45

Jika berada pada direktori $HOME, maka paket-paket npm tersebut akan terinstall di$HOME/.npm, sedangkan jika kita berada di luar direktori $HOME, maka paket-pakettersebut akan terinstall di $CWD/node_modules ($CWD = Current Working Directory -direktori aktif saat ini). Daftar paket pustaka yang terpasang dapat dilihat menggunakanperintah berikut:

1 $ npm l s2 −−> untuk mel ihat pada $CWD3 atau4 $ npm l s −g5 −−> untuk mel ihat pada d i r e k t o r i g l oba l

Listing 4.3: Argumen npm untuk melihat daftar paket terpasang

Selain melihat daftar paket pustaka yang digunakan dalam aplikasi maupun global,perintah diatas juga akan menampilkan paket dependensi dalam struktur pohon. Jikakita belum menginstall paket-paket yang diperlukan, akan muncul peringatan. Berikutini adalah contoh peringatan dari paket-paket yang belum terinstall di aplikasi hello-express saat mengerjakan perintah “npm ls” di direktori tempat aplikasi tersebut berada(lihat bab 1):

1 $ npm l s2 npm WARN package . j son hel lo@0 . 0 . 1 No README.md f i l e found !3 hel lo@0 . 0 . 1 /home/bpdp/ ker jaan / g i t−repos /buku−cloud−node j s / s r c /bab−01/ h e l l o4 +−− UNMET DEPENDENCY expre s s 3 . 2 . 25 +−− UNMET DEPENDENCY jade ∗67 npm ERR! miss ing : express@3 . 2 . 2 , r equ i r ed by hel lo@0 . 0 . 18 npm ERR! miss ing : jade@ ∗ , r equ i r ed by hel lo@0 . 0 . 19 npm ERR! not ok code 0

10 $

Listing 4.4: npm ls pada aplikasi yang paket-paketnya belum terinstall

Jika sudah terinstall, perintah “npm ls” akan menampilkan struktur dari paket yangtelah terinstall dalam bentuk struktur pohon seperti pada Gambar 4.1.

4.2.3. Menghapus Paket / Uninstall

Menghapus paket pustaka menggunakan npm pada dasarnya hampir sama dengan saatmemasang paket, namun dengan perintah uninstall. Berikut perintah lengkapnya.

1 $ npm un i n s t a l l namapaket2 −−> un i n s t a l l namapaket d i $CWD/node_modules3 atau4 $ npm un i n s t a l l namapaket −g5 −−> un i n s t a l l paket d i d i r g l oba l

Listing 4.5: Perintah menghapus paket di npm

4.2.4. Mencari Paket

Untuk mencari paket, gunakan argumen search dan nama atau bagian dari nama paketyang dicari. Contoh berikut ini akan mencari paket dengan kata kunci ’sha512’ (tampilanberikut merupakan tampilan yang terpotong):

Page 57: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

4.2. Menggunakan npm 46

Gambar 4.1.: Tampilan “npm ls” pada direktori proyek dengan paket terinstall lengkap

1 $ npm search sha5122 npm http GET https : // r e g i s t r y . npmjs . org/−/ a l l / s . . .3 npm http 200 https : // r e g i s t r y . npmjs . org/−/ a l l / s . . .4 NAME DESCRIPTION . . .5 j s ha she s A f a s t and independent hashing l i b r a r . . .6 krypto High−l e v e l crypto l i b r a ry , making the . . .7 passhash Eas i l y and s e cu r e l y hash passwords wi . . .8 pwhash Generate password hashes from the com . . .

Listing 4.6: Perintah menghapus paket di npm

Setelah menemukan paketnya, pemrogram bisa menginstall langsung ataupun melihatinformasi lebih lanjut tentang pustakan tersebut.

4.2.5. Menampilkan Informasi Paket

Setelah mengetahui nama paket, pemrogram bisa memperoleh informasi lebih lanjutdalam format JSON menggunakan parameter view. Contoh dibawah ini menampilkanrincian dalam format JSON dari paket arango.client :

1 $ npm view arango . c l i e n t2 npm http GET https : // r e g i s t r y . npmjs . org /arango . c l i e n t3 npm http 200 https : // r e g i s t r y . npmjs . org /arango . c l i e n t45 { name : ’ arango . c l i e n t ’ ,6 d e s c r i p t i o n : ’ArangoDB j a v a s c r i p t c l i e n t ’ ,7 ’ d i s t−tags ’ : { l a t e s t : ’ 0 . 5 . 6 ’ } ,8 v e r s i o n s :9 [ ’ 0 . 3 . 1 ’ ,

Page 58: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

4.2. Menggunakan npm 47

10 ’ 0 . 3 . 2 ’ ,11 ’ 0 . 4 . 0 ’ ,12 ’ 0 . 5 . 0 ’ ,13 ’ 0 . 5 . 1 ’ ,14 ’ 0 . 5 . 4 ’ ,15 ’ 0 . 5 . 6 ’ ] ,16 mainta iner s : ’ kaerus <anders@kaerus . com> ’ ,17 time :18 { ’ 0 . 3 . 1 ’ : ’2012−08−09T12 : 0 4 : 3 4 . 5 9 4Z ’ ,19 ’ 0 . 3 . 2 ’ : ’2012−08−09T12 : 4 9 : 0 2 . 3 2 2Z ’ ,20 ’ 0 . 4 . 0 ’ : ’2012−09−17T10 : 4 4 : 4 3 . 1 8 7Z ’ ,21 ’ 0 . 5 . 0 ’ : ’2012−10−01T14 : 5 1 : 3 2 . 6 6 8Z ’ ,22 ’ 0 . 5 . 1 ’ : ’2012−10−03T22 : 1 1 : 5 8 . 3 7 6Z ’ ,23 ’ 0 . 5 . 4 ’ : ’2012−10−16T09 : 4 5 : 3 7 . 4 7 7Z ’ ,24 ’ 0 . 5 . 6 ’ : ’2012−10−26T17 : 3 4 : 2 8 . 4 9 1Z ’ } ,25 author : ’ Kaerus <contact@kaerus . com> ( http :// kaerus . com) ’ ,26 r epo s i t o r y :27 { type : ’ g i t ’ ,28 u r l : ’ g i t : // github . com/kaerus /arango−c l i e n t . g i t ’ } ,29 ve r s i on : ’ 0 . 5 . 6 ’ ,30 keywords :31 [ ’ arangodb ’ ,32 ’ nosql ’ ,33 ’ qunit ’ ,34 ’amd’ ] ,35 c on t r i bu t o r s : ’ anders e l o <anders@kaerus . com> ’ ,36 dependenc ies : { amdefine : ’ >=0.0.2 ’ } ,37 devDependencies : { r e q u i r e j s : ’ >=2.0.6 ’ } ,38 bugs : { u r l : ’ ht tps : // github . com/kaerus /arango−c l i e n t / i s s u e s ’ } ,39 main : ’ index . j s ’ ,40 l i c e n s e : ’MIT’ ,41 d i s t :42 { shasum : ’48279 e7cf9ea0b4b6766f09671224c46d6e716b0 ’ ,43 t a r b a l l : ’ http :// r e g i s t r y . npmjs . org /arango . c l i e n t /−/arango . c l i e n t −0 . 5 . 6 . tgz ’ } ,44 d i r e c t o r i e s : {} }4546 $

Listing 4.7: Menampilkan rincian suatu paket dalam format JSON

4.2.6. Memperbaharui Paket

Jika terdapat versi baru, kita bisa memperbaharui secara otomatis menggunakan argu-men update berikut ini:

1 $ npm update2 −−> update paket d i $CWD/node_modules3 $ npm update −g4 −−> update paket g l oba l

Listing 4.8: Memperbaharui paket

Page 59: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

BAB 5

Node.js dan Web: Teknik Pengembangan Aplikasi

5.1. Pendahuluan

Pada saat membangun aplikasi Cloud dengan antarmuka web menggunakan Node.js, adabeberapa teknik pemrograman yang bisa digunakan. Bab ini akan membahas berbagaiteknik tersebut. Untuk mengerjakan beberapa latihan di bab ini, digunakan suatu filedengan format JSON. File pegawai.json berikut ini akan digunakan dalam pembahasanselanjutnya.

1 {2 "pegawai" : [3 {4 "id" : "1" ,5 "nama" : "Zaky" ,6 "alamat" : "Purwomartani"7 } ,8 {9 "id" : "2" ,

10 "nama" : "Ahmad" ,11 "alamat" : "Kalasan"12 } ,13 {14 "id" : "3" ,15 "name" : "Aditya" ,16 "alamat" : "Sleman"17 }18 ]19 }

Listing 5.1: pegawai.json

Jika ingin memeriksa validitas dari data berformat JSON, pemrogram bisa menggu-nakan validator di http://jsonlint.com.

48

Page 60: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

5.2. Event-Driven Programming dan EventEmitter 49

5.2. Event-Driven Programming dan EventEmitter

Event-Driven Programming (selanjutnya akan disebut EDP) atau sering juga disebutEvent-Based Programming merupakan teknik pemrograman yang menggunakan eventatau suatu kejadian tertentu sebagai pemicu munculnya suatu aksi serta aliran program.Contoh event misalnya adalah sebagai berikut:

X Menu dipilih.

X Tombol "Submit" di klik.

X Server menerima permintaan dari klien.

Pada dasarnya ada beberapa bagian yang harus disiapkan dari paradigma dan teknikpemrograman ini:

X main loop atau suatu konstruksi utama program yang menunggu dan mengirimkansinyal event.

X definisi dari berbagai event yang mungkin muncul

X definisi event-handler untuk menangani event yang muncul dan dikirimkan olehmain loop

Node.js merupakan peranti pengembangan yang menggunakan teknik pemrograman ini.Pada Node.js, EDP ini semua dikendalikan oleh kelas events.EventEmitter. Jika inginmenggunakan kelas ini, gunakan require(’events’). Dalam terminologi Node.js, jika suatuevent terjadi, maka dikatakan sebagai emits an event, sehingga kelas yang digunakanuntuk menangani itu disebut dengan events.EventEmitter. Pada dasarnya banyak eventyang digunakan oleh berbagai kelas lain di Node.js. Contoh kecil dari penggunaan itudiantaranya adalah net.Server yang meng-emit event "connection", "listening", "close",dan "error".Untuk memahami mekanisme ini, pahami dua kode sumber berikut:

X server.js: mengaktifkan server http (diambil dari manual Node.js)

X server-on-error.js: mencoba mengaktifkan server pada host dan port yang samadengan server.js. Aktivasi ini akan menyebabkan Node.js meng-emit event ’error’karena host dan port sudah digunakan di server.js.

File server.js dijalankan lebih dulu, setelah itu baru menjalankan server-on-error.js.1 var http = r equ i r e ( ’http’ ) ;23 http . c r e a t eS e rv e r ( function ( req , r e s ) {45 r e s . writeHead (200 , {’Content -Type’ : ’text/plain ’ } ) ;6 r e s . end ( ’Hello World\n’ ) ;78 } ) . l i s t e n (1337 , ’127.0.0.1 ’ ) ;9

10 conso l e . l og ( ’Server running at http ://127.0.0.1:1337/ ’ ) ;

Listing 5.2: server.js

Page 61: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

5.3. Asynchronous / Non-blocking IO dan Callback 50

1 var net = r equ i r e ( ’net’ ) ;23 var s e r v e r = net . c r e a t eS e rv e r ( function ( sock ) {45 // Event dan event -handler6 // ’data’ => jika ada data yang dikirimkan dari klien7 sock . on ( ’data’ , function ( data ) {8 conso l e . l og ( ’data ’ + sock . remoteAddress + ’: ’ + data ) ;9 } ) ;

1011 // ’close’ => jika koneksi ditutup12 sock . on ( ’close ’ , function ( data ) {13 conso l e . l og ( ’koneksi ditutup ’ ) ;14 } ) ;1516 } ) ;1718 s e r v e r . l i s t e n (1337 , function ( ) {19 conso l e . l og ( ’Server aktif di 127.0.0.1:1337 ’ ) ;20 } ) ;2122 s e r v e r . on ( ’error ’ , function ( e ) {2324 i f ( e . code == ’EADDRINUSE ’ ) {25 conso l e . l og ( ’Error: host dan port sudah digunakan.’ ) ;26 }2728 } ) ;

Listing 5.3: server-on-error.js

5.3. Asynchronous / Non-blocking IO dan Callback

Asynchronous input/output merupakan suatu bentuk pemrosesan masukan/keluaran yangmemungkinkan pemrosesan dilanjutkan tanpa menunggu proses tersebut selesai. Saatpemrosesan masukan/keluaran tersebut selesai, hasil akan diberikan ke suatu fungsi.Fungsi yang menangani hasil pemrosesan saat pemrosesan tersebut selesai disebut call-back (pemanggilan kembali). Jadi, mekanismenya adalah: proses masukan/keluaran -lanjut ke alur berikutnya - panggil kembali fungsi pemroses jika proses masukan/kelu-aran sudah selesai.

1 var f s = r equ i r e ( ’fs’ ) ;2 var sys = r equ i r e ( ’sys’ ) ;34 sys . puts ( ’Mulai baca file’ ) ;5 data = f s . readFi l eSync ( ’./ pegawai.json’ , "utf -8" ) ;6 conso l e . l og ( data ) ;7 sys . puts ( ’Baris setelah membaca file’ ) ;89 // hasil:

10 //Mulai baca file11 //{12 // "pegawai ": [13 // {14 // "id": "1",15 // "nama": "Zaky",

Page 62: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

5.3. Asynchronous / Non-blocking IO dan Callback 51

16 // "alamat ": "Purwomartani"17 // },18 // {19 // "id": "2",20 // "nama": "Ahmad",21 // "alamat ": "Kalasan"22 // },23 // {24 // "id": "3",25 // "name": "Aditya",26 // "alamat ": "Sleman"27 // }28 // ]29 //}30 //31 //Baris setelah membaca file

Listing 5.4: Membaca file secara synchronous

1 var f s = r equ i r e ( ’fs’ ) ;2 var sys = r equ i r e ( ’sys’ ) ;34 sys . puts ( ’Mulai baca file’ ) ;5 f s . r e adF i l e ( ’./ pegawai.json’ , "utf -8" , function ( err , data ) {6 i f ( e r r ) throw e r r ;7 conso l e . l og ( data ) ;8 })9 sys . puts ( ’Baris setelah membaca file’ ) ;

1011 // hasil:12 //Mulai baca file13 //Baris setelah membaca file14 //{15 // "pegawai ": [16 // {17 // "id": "1",18 // "nama": "Zaky",19 // "alamat ": "Purwomartani"20 // },21 // {22 // "id": "2",23 // "nama": "Ahmad",24 // "alamat ": "Kalasan"25 // },26 // {27 // "id": "3",28 // "name": "Aditya",29 // "alamat ": "Sleman"30 // }31 // ]32 //}

Listing 5.5: Membaca file secara asynchronous

Page 63: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

BAB 6

Mengakses Basis Data NoSQL: mongoDB

6.1. Apa itu Basis Data NoSQL?

Pada awalnya, istilah NoSQL digunakan oleh Carlo Strozzi untuk menyebut nama soft-ware basis data yang dibuat olehnya. Software basis data tersebut tidak mengikutistandar SQL, sehingga dia menyebut software tersebut dengan "NoSQL"1. Setelah itu,istilah NoSQL dipopulerkan oleh Eric Evans untuk menyebut jenis software basis datayang tidak menggunakan standar SQL. Dalam perkembangan berikutnya, NoSQL inilebih diarahkan pada "Not Only SQL" dan digunakan untuk kategorisasi basis datanon-relational (misalnya OODBMS, Graph Database, Document-oriented, dan lain-lain).Meski ada usaha untuk menstandarkan bahasa query untuk NoSQL (UnQL - Unstruc-tured Query Language), sampai saat ini usaha tersebut tidak menghasilkan sesuatu halyang disepakati bersama karena dunia NoSQL memang kompleks sekali. Untuk melihatdaftar dari basis data NoSQL, anda bisa melihat ke http://nosql-databases.org.

6.2. Mengenal mongoDB dan Fitur-fiturnya

mongoDB adalah salah satu software NoSQL yang termasuk dalam kategori DocumentStore / Document-Oriented Database, yaitu data disimpan dalam bentuk dokumen. Su-atu dokumen bisa diibaratkan seperti suatu record dalam basis data relasional dan isidari masing-masing dokumen tersebut bisa berbeda-beda dan ada pula yang sama. Halini berbeda dengan basis data relasional yang menetapkan keseragaman kolom serta tipedata dengan data yang NULL jika tidak terdapat data. mongoDB menyimpan datadalam bentuk dokumen dengan menggunakan format JSON. Berikut adalah fitur darimongoDB:

1http://www.strozzi.it/cgi-bin/CSA/tw7/I/en_US/nosql/Home%20Page

52

Page 64: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

6.2. Mengenal mongoDB dan Fitur-fiturnya 53

X menggunakan format JSON dalam penyimpanan data

X mendukung indeks

X mendukung replikasi

X auto-sharding untuk skalabilitas horizontal

X query yang lengkap

X pembaruan data yang cepat

X mendukung Map/Reduce

X mendukung GridFS

6.2.1. Memulai Server

Seperti halnya basis data relasional seperti MySQL, PostgreSQL, dan lain-lain, mongoDBjuga memulai dengan menjalankan server yang memungkinkan server tersebut melayanipermintaan akses data dokumen melalui klien. Untuk memulai server, siapkan direk-tori yang akan menjadi tempat menyimpan data (defaultnya adalah /data/db). Jikamenginginkan lokasi lain, gunakan argumen –dbpath saat menjalankan server sebagaiberikut (buat direktorinya jika belum ada):

1 $ mkdir data2 $ mongod −−r e s t −−dbpath . / data3 Sun May 5 22 : 4 7 : 0 5 . 4 954 Sun May 5 22 : 4 7 : 0 5 . 4 95 warning : 32−b i t s e r v e r s don ’ t have j ou rna l i n g5 enabled by de f au l t . P lease use −−j ou rna l i f you want du r ab i l i t y .6 Sun May 5 22 : 4 7 : 0 5 . 4 957 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] MongoDB s t a r t i n g : pid=29948 port=27017 dbpath=./data 32−b i t host=bpdp−arch9 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ]

10 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] ∗∗ NOTE: This i s a 32 b i t11 MongoDB binary .12 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] ∗∗ 32 b i t bu i l d s are13 l im i t ed to l e s s than 2GB of data ( or l e s s with −−j ou rna l ) .14 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] ∗∗ Note that j ou rna l i n g15 d e f a u l t s to o f f for 32 b i t and i s cu r r en t l y o f f .16 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] ∗∗ See17 http :// dochub . mongodb . org / core /32 b i t18 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ]19 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] db ve r s i on v2 .4.4− pre−20 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] g i t v e r s i on : nog i t v e r s i on21 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] bu i ld i n f o : Linux fyan22 3.8.3−2−ARCH #1 SMP PREEMPT Sun Mar 17 13:04:22 CET 201323 i686 BOOST_LIB_VERSION=1_5324 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] a l l o c a t o r : system25 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] opt ions : { dbpath :26 "./data" , r e s t : true }27 Sun May 5 22 : 4 7 : 0 5 . 7 89 [ F i l eA l l o c a t o r ] a l l o c a t i n g new d a t a f i l e28 . / data/ local . ns , f i l l i n g with z e r o e s . . .29 Sun May 5 22 : 4 7 : 0 5 . 7 90 [ F i l eA l l o c a t o r ] c r e a t i n g d i r e c t o r y30 . / data/_tmp31 Sun May 5 22 : 4 7 : 0 5 . 9 97 [ F i l eA l l o c a t o r ] done a l l o c a t i n g d a t a f i l e32 . / data/ local . ns , s i z e : 16MB, took 0 .088 s e c s

Page 65: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

6.2. Mengenal mongoDB dan Fitur-fiturnya 54

33 Sun May 5 22 : 4 7 : 0 5 . 9 98 [ F i l eA l l o c a t o r ] a l l o c a t i n g new d a t a f i l e34 . / data/ local . 0 , f i l l i n g with z e r o e s . . .35 Sun May 5 22 : 4 7 : 0 6 . 0 86 [ F i l eA l l o c a t o r ] done a l l o c a t i n g d a t a f i l e36 . / data/ local . 0 , s i z e : 16MB, took 0 .088 s e c s37 Sun May 5 22 : 4 7 : 0 6 . 0 91 [ i n i t a n d l i s t e n ] command local . $cmd command:38 { c r e a t e : "startup_log" , s i z e : 10485760 , capped : true }39 ntoreturn : 1 keyUpdates : 0 r e s l e n :37 301ms40 Sun May 5 22 : 4 7 : 0 6 . 0 93 [ i n i t a n d l i s t e n ] wa i t ing for connect i ons41 on port 2701742 Sun May 5 22 : 4 7 : 0 6 . 0 93 [ websvr ] admin web conso l e wa i t ing for43 connect i ons on port 28017

Listing 6.1: Menjalankan server MongoDB (mongod)

Untuk mengakhiri server, tekan Ctrl-C, mongoDB akan mengakhiri server sebagaiberikut:

1 ^CSun May 5 22 : 5 2 : 5 2 . 3 44 [ s i gna lProce s s ingThread ] got2 s i g n a l 2 ( In t e r rup t ) , w i l l terminate a f t e r cur r ent cmd ends3 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] now ex i t i n g4 Sun May 5 22 : 5 2 : 5 2 . 3 45 dbex i t :5 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] shutdown :6 going to c l o s e l i s t e n i n g so cke t s . . .7 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] c l o s i n g8 l i s t e n i n g socke t : 79 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] c l o s i n g

10 l i s t e n i n g socke t : 811 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] c l o s i n g12 l i s t e n i n g socke t : 913 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] removing14 socke t f i l e : /tmp/mongodb−27017. sock15 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] shutdown :16 going to f l u s h d i ag l og . . .17 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] shutdown :18 going to c l o s e s o cke t s . . .19 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] shutdown :20 wai t ing for f s p r e a l l o c a t o r . . .21 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] shutdown :22 c l o s i n g a l l f i l e s . . .23 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] c l o s e A l l F i l e s ( )24 f i n i s h e d25 Sun May 5 22 : 5 2 : 5 2 . 3 46 [ s i gna lProce s s ingThread ] shutdown :26 removing f s l o ck . . .27 Sun May 5 22 : 5 2 : 5 2 . 3 46 dbex i t : r e a l l y e x i t i n g now

Listing 6.2: Mengakhiri server MongoDB (mongod)

6.2.2. Klien dan Shell mongoDB

Setelah server hidup, pemrogram bisa menggunakan antarmuka administrasi web maupunmenggunakan shell. Admin web console bisa diakses menggunakan port 28017 sepertipada gambar 6.1. Sementara itu, untuk mengakses server menggunakan shell, bisa digu-nakan perintah mongo sebagai berikut:

1 mongo2 MongoDB s h e l l v e r s i on : 2.4.4− pre−3 connect ing to : test4 Server has s ta r tup warnings :

Page 66: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

6.2. Mengenal mongoDB dan Fitur-fiturnya 55

Gambar 6.1.: Admin web console untuk mongoDB

5 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ]6 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ] ∗∗ NOTE: This i s7 a 32 b i t MongoDB binary .8 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ] ∗∗ 32 b i t9 bu i l d s are l im i t ed to l e s s than 2GB of data ( or l e s s

10 with −−j ou rna l ) .11 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ] ∗∗ Note that12 j ou rna l i n g d e f a u l t s to o f f for 32 b i t and i s cu r r en t l y o f f .13 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ] ∗∗ See14 http :// dochub . mongodb . org / core /32 b i t15 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ]16 >

Listing 6.3: Shell mongoDB (mongo)

Page 67: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

6.2. Mengenal mongoDB dan Fitur-fiturnya 56

6.2.3. Documents dan Collections

Konsep dasar yang harus dipahami dalam mongoDB sebagai document-oriented databaseadalah documents dan collections. Sama halnya dengan basis data relasional, mongoDBmenyimpan data dalam suatu basis data. Di dalam basis data tersebut terdapat col-lections yang bisa diibaratkan seperti tabel dalam basis data relasional. Collectionsdigunakan untuk menyimpan dokumen (documents). Dalam istilah basis data relasional,documents adalah records. Kerjakan latihan berikut untuk memahami pengertian daridocuments dan collections.

1 $ mongo2 MongoDB s h e l l v e r s i on : 2.4.4− pre3 connect ing to : test4 . . .5 . . . [ jgn pedul ikan warning i n i ]6 . . .7 . . .8 > db9 test

10 > use mydb11 switched to db mydb12 > show dbs13 local ( empty )14 > emp1 = { name : "Zaky" , address : "Griya Purwa Asri" }15 { "name" : "Zaky" , "address" : "Griya Purwa Asri" }16 > emp2 = { name : "Ahmad" , address : "Purwomartani" , emai l : "[email protected]" }17 {18 "name" : "Ahmad" ,19 "address" : "Purwomartani" ,20 "email" : "[email protected]"21 }22 > emp3 = { name : "Aditya" , address : "Kalasan" , phone : "08787878787" }23 { "name" : "Aditya" , "address" : "Kalasan" , "phone" : "08787878787" }24 > db . employees . i n s e r t ( emp1 )25 > db . employees . i n s e r t ( emp2 )26 > db . employees . i n s e r t ( emp3 )27 > show dbs28 local ( empty )29 mydb 0.0625GB30 > db31 mydb32 > show c o l l e c t i o n s33 employees34 system . indexes35 > db . employees . f i nd ( )36 { "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) , "name" : "Zaky" , "address" :37 "Griya Purwa Asri" }38 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "name" : "Ahmad" , "address" :39 "Purwomartani" , "email" : "[email protected]" }40 { "_id" : ObjectId ( "50 c74b79a7f83cba11e6b220" ) , "name" : "Aditya" , "address" :41 "Kalasan" , "phone" : "08787878787" }42 > db . employees . f i nd ( {name : "Ahmad"} )43 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "name" : "Ahmad" , "address" :44 "Purwomartani" , "email" : "[email protected]" }45 > db . employees . findOne ( )46 {47 "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) ,48 "name" : "Zaky" ,49 "address" : "Griya Purwa Asri"50 }

Page 68: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

6.3. Node.js dan MongoDB 57

51 > db . employees . f i nd ( ) . l im i t (2 )52 { "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) , "name" : "Zaky" , "address" :53 "Griya Purwa Asri" }54 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "name" : "Ahmad" , "address" :55 "Purwomartani" , "email" : "[email protected]" }56 >

Listing 6.4: Sesi dalam shell mongoDB

Basis data mongoDB hanya akan dibuat jika sudah dilakukan perintah untuk meny-isipkan atau mengisikan data documents ke dalam collections seperti perintah di atas.

6.3. Node.js dan MongoDB

6.3.1. Node-gyp

Node-gyp merupakan native add-on build tool, berfungsi untuk membantu proses kom-pilasi modul add-on native di Node.js. Node-gyp merupakan software bebas dan bisadiinstall menggunakan npm:

1 $ npm i n s t a l l −g node−gyp

Listing 6.5: Instalasi node-gyp

Node-gyp ini diinstall pada lokasi global. Pada materi ini, Node-gyp diperlukan untukmembangun driver dari mongoDB sehingga mongoDB bisa diakses oleh Node.js.

6.3.2. Driver Node.js untuk mongoDB

Mengakses mongoDB dari Node.js bisa dilakukan dengan menggunakan driver atauberbagai wrapper serta solusi sejenis ORM Object-Relational Mapping. Salah satu solusiyang tersedia adalah paket mongodb.

1 $ npm i n s t a l l mongodb2 npm http GET https : // r e g i s t r y . npmjs . org /mongodb3 npm http 200 https : // r e g i s t r y . npmjs . org /mongodb4 npm http GET https : // r e g i s t r y . npmjs . org /mongodb/−/mongodb−1 . 3 . 0 . tgz5 npm http 200 https : // r e g i s t r y . npmjs . org /mongodb/−/mongodb−1 . 3 . 0 . tgz6 npm http GET https : // r e g i s t r y . npmjs . org / kerbero s7 npm http GET https : // r e g i s t r y . npmjs . org /bson /0 . 1 . 88 npm http 200 https : // r e g i s t r y . npmjs . org / kerberos9 npm http GET https : // r e g i s t r y . npmjs . org / kerbero s/−/kerberos −0 . 0 . 2 . tgz

10 npm http 200 https : // r e g i s t r y . npmjs . org /bson /0 . 1 . 811 npm http GET https : // r e g i s t r y . npmjs . org /bson/−/bson −0 . 1 . 8 . tgz12 npm http 200 https : // r e g i s t r y . npmjs . org / kerberos/−/kerberos −0 . 0 . 2 . tgz13 npm http 200 https : // r e g i s t r y . npmjs . org /bson/−/bson −0 . 1 . 8 . tgz1415 > kerberos@0 . 0 . 2 i n s t a l l /home/bpdp/ ker jaan / g i t−repos /buku−cloud−node j s /16 s r c /bab−06/node_modules/mongodb/node_modules/ ke rbero s17 > ( node−gyp r ebu i l d 2> bu i l d e r r o r . l og ) | | ( exit 0)181920 > bson@0 . 1 . 8 i n s t a l l /home/bpdp/ ker jaan / g i t−repos /buku−cloud−node j s / s r c /21 bab−06/node_modules/mongodb/node_modules/bson22 > ( node−gyp r ebu i l d 2> bu i l d e r r o r . l og ) | | ( exit 0)23

Page 69: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

6.3. Node.js dan MongoDB 58

24 mongodb@1 . 3 . 0 node_modules/mongodb25 +−− bson@0 . 1 . 826 +−− kerberos@0 . 0 . 227 $

Listing 6.6: Instalasi driver mongoDB

Solusi lain yang bisa digunakan antara lain adalah:

X Mongoose (http://mongoosejs.com/)

X Mongojs (https://github.com/gett/mongojs)

X Mongolia (https://github.com/masylum/mongolia)

X Mongoskin (https://github.com/kissjs/node-mongoskin)

6.3.3. Mengakses mongoDB dari Node.js

Dengan menggunakan collections dan documents di atas, kita akan mengakses data terse-but menggunakan Node.js. Untuk lebih menyederhanakan, kita akan menggunakan wrap-per dari mongoDB native driver, yaitu Mongojs. Install Mongojs lebih dahulu menggu-nakan npm:

1 $ npm i n s t a l l mongojs2 npm http GET https : // r e g i s t r y . npmjs . org /mongojs3 npm http 200 https : // r e g i s t r y . npmjs . org /mongojs4 npm http GET https : // r e g i s t r y . npmjs . org /mongojs/−/mongojs −0 . 7 . 4 . tgz5 npm http 200 https : // r e g i s t r y . npmjs . org /mongojs/−/mongojs −0 . 7 . 4 . tgz6 npm http GET https : // r e g i s t r y . npmjs . org / readable−stream7 npm http GET https : // r e g i s t r y . npmjs . org /thunky8 npm http 200 https : // r e g i s t r y . npmjs . org / readable−stream9 npm http 200 https : // r e g i s t r y . npmjs . org /thunky

10 mongojs@0 . 7 . 4 node_modules/mongojs11 +−− thunky@0 . 1 . 012 +−− readable−stream@1 . 0 . 213 $

Listing 6.7: Instalasi wrapper mongojs

Setelah itu, buat program sesuai dengan listing program berikut.1 var databaseUrl = "localhost/mydb" ;2 var c o l l e c t i o n s = [ "employees" ] ;3 var db = r equ i r e ( "mongojs" ) . connect ( databaseUrl , c o l l e c t i o n s ) ;45 // mencari pegawai bernama Aditya6 db . employees . f i nd ({name : "Aditya" } , function ( err , employees ) {7 i f ( e r r | | ! employees ) con so l e . l og ( "Tidak ada pegawai dengan nama Aditya" ) ;8 else employees . forEach ( function ( emps ) {9 conso l e . l og ( emps ) ;

10 } ) ;11 } ) ;1213 // menyimpan data pegawai baru : Bambang14 db . employees . save ({name : "Bambang" , address : "Yogyakarta" , password : "ealhadalah" ,15 sex : "male" } , function ( err , saved ) {16 i f ( e r r | | ! saved ) conso l e . l og ( "Pegawai ’Bambang ’ gagal disimpan" ) ;

Page 70: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 59

17 else conso l e . l og ( "Data pegawai ’Bambang ’ tersimpan" ) ;18 } ) ;1920 // mengupdate data pegawai : Ahmad21 db . employees . update ({name : "Ahmad" } , { $ s e t : { address : "Finlandia" }} ,22 function ( err , updated ) {23 i f ( e r r | | ! updated ) conso l e . l og ( "Data ’Ahmad ’ gagal diperbaharui" ) ;24 else conso l e . l og ( "Data ’Ahmad ’ berhasil diperbaharui" ) ;25 } ) ;2627 // Has i l :28 //{ _id : 50 c74b79a7f83cba11e6b220 ,29 // name : ’ Aditya ’ ,30 // address : ’ Kalasan ’ ,31 // phone : ’08787878787 ’ }32 //Data pegawai ’Bambang ’ ters impan33 //Data ’Ahmad’ b e r h a s i l d ipe rbaharu i34 //35 // Has i l d i db :36 //> db . employees . f i nd ( )37 //{ "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) , "name" :38 //"Zaky" , "address" : "Griya Purwa Asri" }39 //{ "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "address" :40 //"Finlandia" , "email" : "[email protected]" , "name" : "Ahmad" }41 //{ "_id" : ObjectId ( "50 c74b79a7f83cba11e6b220" ) , "name" :42 //"Aditya" , "address" : "Kalasan" , "phone" : "08787878787" }43 //{ "name" : "Bambang" , "address" : "Yogyakarta" , "password" :44 //"ealhadalah" , "sex" : "male" , "_id" :45 // ObjectId ( "50 c75d43c111384846000001" ) }46 //>47 //

Listing 6.8: Mengakses mongoDB dari Node.js

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB

Contoh aplikasi web berikut hanya digunakan untuk mengambil data dari mongoDBkemudian menampilkannya di web. Data diambil dari basis data mongoDB yang sudahdibuat sebelumnya (mydb). Untuk keperluan ini, kita akan menggunakan frameworkExpress (http://expressjs.com). Install Express di level global dengan npm install -gexpress. Setelah terinstall, buat subdirektori baru (lokasi bebas) yang akan digunakanuntuk menyimpan aplikasi web. Setelah itu, masuk ke direktori tersebut kemudian buatkerangka aplikasi di subdirektori tersebut menggunakan perintah “express” (lihat bab 1).Berikut ini adalah beberapa perubahan yang dilakukan untuk rerangka aplikasi yang

dihasilkan dari perintah express tersebut.12 /**3 * Module dependencies.4 */56 var expre s s = r equ i r e ( ’express ’ )7 , r oute s = r equ i r e ( ’./ routes ’ )8 , user = r equ i r e ( ’./ routes/employee ’ )9 , http = r equ i r e ( ’http’ )

10 , path = r equ i r e ( ’path’ ) ;

Page 71: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 60

1112 var app = expre s s ( ) ;1314 // all environments15 app . s e t ( ’port’ , p ro c e s s . env .PORT | | 3000 ) ;16 app . s e t ( ’views’ , __dirname + ’/views ’ ) ;17 app . s e t ( ’view engine ’ , ’jade’ ) ;18 app . use ( expre s s . f av i con ( ) ) ;19 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;20 app . use ( expre s s . bodyParser ( ) ) ;21 app . use ( expre s s . methodOverride ( ) ) ;22 app . use ( app . rou te r ) ;23 app . use ( expre s s . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;2425 // development only26 i f ( ’development ’ == app . get ( ’env’ ) ) {27 app . use ( expre s s . e r rorHandle r ( ) ) ;28 }2930 app . get ( ’/’ , r ou t e s . index ) ;31 app . get ( ’/employees ’ , employee . l i s t ) ;3233 http . c r e a t eS e rv e r ( app ) . l i s t e n ( app . get ( ’port’ ) , function ( ){34 conso l e . l og ( ’Express server listening on port ’ + app . get ( ’port’ ) ) ;35 } ) ;

Listing 6.9: Express+MongoDB web: app.js

1 {2 "name" : "show -employees" ,3 "version" : "0.0.1" ,4 "private" : true ,5 "scripts" : {6 "start" : "node app.js"7 } ,8 "dependencies" : {9 "express" : "3.2.2" ,

10 "jade" : "*" ,11 "mongojs" : "latest"12 }13 }

Listing 6.10: Express+MongoDB web: package.json

12 /*3 * GET home page.4 */56 export s . index = function ( req , r e s ){7 r e s . render ( ’index’ , { t i t l e : ’Contoh Express+mongoDB ’ } ) ;8 } ;

Listing 6.11: Express+MonggoDB web: routes/index.js

Selain itu, ada beberapa tambahan file (routes/employee.js dan views/employee.jade),penghapusan file (routes/user.js), dan perubahan yang cukup signifikan pada file views/in-dex.jade.

1 i /*

Page 72: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 61

2 * GET employees listing.3 */45 var databaseUrl = "localhost/mydb" ;6 var c o l l e c t i o n s = [ "employees" ] ;7 var db = r equ i r e ( "mongojs" ) . connect ( databaseUrl , c o l l e c t i o n s ) ;89 export s . l i s t = function ( req , r e s ){

1011 // mencari dan menampilkan semua pegawai12 db . employees . f i nd ( function ( err , employees ) {13 r e s . render ( ’employee ’ , { l i s tOfEmployee : employees , t i t l e : ’Daftar pegawai ’ } ) ;14 } ) ;1516 } ;

Listing 6.12: Express+MongoDB web: routes/employee.js

1 extends layout23 block content4 h1= t i t l e5 p #{ t i t l e }67 each employee in l i s tOfEmployee8 p #{employee . name}

Listing 6.13: Express+MongoDB web: views/employee.jade

1 extends layout23 block content4 h1= t i t l e5 p6 | Selamat datang d i #{ t i t l e } . Ap l i ka s i i n i hanya sekedar contoh7 a p l i k a s i web dengan mongoDB sebaga i backend . Untuk saat i n i hanya8 t e r s e d i a f a s i l i t a s untuk mel ihat9 a ( h r e f="/employees" ) da f t a r pegawai .

Listing 6.14: views/index.jade

Page 73: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

BAB 7

Pola Arsitektur Aplikasi Web: MVC dan ExpressJS

7.1. Apa itu Pola Arsitektur?

Pola arsitektur (architectural pattern) adalah konsep dan standar arsitektur yang mem-bentuk suatu aplikasi. Pola disini mengacu pada best practices atau praktik-praktikterbaik yang terutama terkait dengan arsitektur dari software aplikasi. Pola arsitekturterdiri atas elemen-elemen software, properti dari elemen-elemen tersebut, serta hubun-gan antar elemen-elemen tersebut.

7.2. Pola Arsitektur MVC

MVC (Model-View-Controller) merupakan pola arsitektur aplikasi Web yang memisahkanaplikasi Web menjadi 3 komponen:

X Model: basis data

X View: tampilan antarmuka aplikasi Web, biasanya berisi semacam template danisi-isi dinamis dari tampilan antarmuka tersebut.

X Controller: menerima requests atau permintaan dari browser kemudian mengarahkanke event-handler untuk diproses. Proses tersebut bisa saja berupa langsung meng-hasilkan view (X)HTML atau format lainnya, atau bisa juga diproses terlebihdahulu di model dan kemudian hasilnya akan dikirimkan ke view untuk diisikanke isi-isi dinamis serta membentuk file (X)HTML untuk ditampilkan di browser(sebenarnya tidak selalu perlu harus (X)HTML).

Jika digambarkan dalam suatu diagram, pola arsitektur MVC ditampilkan pada gam-bar 7.1Pola ini dikenal juga dengan istilah Model 2 dan dipopulerkan oleh JavaEE.

62

Page 74: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

7.2. Pola Arsitektur MVC 63

Gambar 7.1.: Pola arsitektur MVC

Page 75: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 64

7.3. Implementasi Pola Arsitektur MVC MenggunakanExpressJS

Sebenarnya ExpressJS bukan merupakan framework MVC, meskipun demikian karenaframework ini sangat fleksibel, maka pemrogram bisa mengatur sendiri lokasi dari file /direktori serta berbagai konfigurasi lainnya. Contoh implementasi disini adalah aplikasisederhana untuk menampilkan data yang tersimpan dalam basis data mongoDB ke dalamformat JSON yang bisa diakses dari browser.

7.3.1. Struktur Aplikasi

Setelah membuat kerangka aplikasi menggunakan ExpressJS, ada beberapa perubahanyang harus dilakukan. Perubahan ini terutama dilakukan untuk mengikuti pola ar-sitektur MVC (terutama peletakan file dan direktori). Pola asli dari kerangka aplikasiExpressJS adalah sebagai berikut:

1 $ t r e e .2 .3 |−− app . j s4 |−− package . j son5 |−− pub l i c6 | |−− images7 | |−− j a v a s c r i p t s8 | ‘−− s t y l e s h e e t s9 | ‘−− s t y l e . c s s

10 |−− route s11 | |−− index . j s12 | ‘−− user . j s13 ‘−− views14 |−− index . jade15 ‘−− l ayout . jade1617 6 d i r e c t o r i e s , 7 f i l e s18 $

Listing 7.1: Struktur direktori asli aplikasi ExpressJS

Struktur direktori tersebut akan diubah sesuai dengan pola MVC:1 $ t r e e .2 .3 +−− app . j s4 |−− c o n t r o l l e r s5 | +−− index . j s6 | +−− user . j s7 |−− models8 | +−− db . j s9 |−− package . j son

10 |−− pub l i c11 | +−− images12 | |−− j a v a s c r i p t s13 | +−− s t y l e s h e e t s14 | +−− s t y l e . c s s15 +−− views16 +−− index . jade17 +−− l ayout . jade18

Page 76: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 65

19 7 d i r e c t o r i e s , 8 f i l e s20 $

Listing 7.2: Struktur direktori ExpressJS sesuai pola MVC

Beberapa perubahan terhadap struktur direktori:

X direktori routes diubah menjadi controllers

X membuat direktori models untuk mendefinisikan skema basis data

7.3.2. File-file yang Diperlukan

Beberapa file diubah isinya dan ada juga file yang baru.12 /**3 * Module dependencies.4 */56 var expre s s = r equ i r e ( ’express ’ )7 , r oute s = r equ i r e ( ’./ controllers ’ )8 , user = r equ i r e ( ’./ controllers/user’ )9 , http = r equ i r e ( ’http’ )

10 , path = r equ i r e ( ’path’ ) ;1112 var mongoose = r equ i r e ( ’mongoose ’ ) ;1314 var app = expre s s ( ) ;1516 // all environments17 app . s e t ( ’port’ , p ro c e s s . env .PORT | | 3000 ) ;18 app . s e t ( ’views’ , __dirname + ’/views ’ ) ;19 app . s e t ( ’view engine ’ , ’jade’ ) ;20 app . use ( expre s s . f av i con ( ) ) ;21 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;22 app . use ( expre s s . bodyParser ( ) ) ;23 app . use ( expre s s . methodOverride ( ) ) ;24 app . use ( app . rou te r ) ;25 app . use ( expre s s . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;2627 // development only28 i f ( ’development ’ == app . get ( ’env’ ) ) {29 app . use ( expre s s . e r rorHandle r ( ) ) ;30 }3132 app . get ( ’/’ , c o n t r o l l e r s . index ) ;33 app . get ( ’/users ’ , u se r . l i s t ) ;3435 http . c r e a t eS e rv e r ( app ) . l i s t e n ( app . get ( ’port’ ) , function ( ){36 conso l e . l og ( ’Express server listening on port ’ + app . get ( ’port’ ) ) ;37 } ) ;

Listing 7.3: app.js

1 /*2 * GET employees listing.3 */45 var Employee = r equ i r e ( ’../ models/db.js’ ) ;

Page 77: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya 66

67 export s . l i s t = function ( req , r e s ){8 Employee . f i nd ( function ( err , employees ) {9 r e s . send ( employees ) ;

10 } ) ;11 } ;

Listing 7.4: controllers/user.js

1 var mongoose = r equ i r e ( ’mongoose ’ )2 , Schema = mongoose . Schema ;34 var employeeSchema = new Schema({5 name : Str ing ,6 address : Str ing ,7 phone : Str ing ,8 emai l : S t r ing9 } ) ;

1011 module . export s = mongoose . model ( ’Employee ’ , employeeSchema ) ;

Listing 7.5: models/db.js

1 {2 "name" : "express -mvc" ,3 "version" : "0.0.1" ,4 "private" : true ,5 "scripts" : {6 "start" : "node app.js"7 } ,8 "dependencies" : {9 "express" : "latest" ,

10 "jade" : "*" ,11 "mongoose" : "latest"12 }13 }

Listing 7.6: package.json

7.3.3. Hasil

Setelah server dieksekusi (menggunakan perintah node app.js), maka hasilnya akan bisadiakses di http://localhost:3000/users. Hasil di browser bisa dilihat di gambar 7.2

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya

MVC bukan satu-satu pola arsitektur aplikasi Web. Berikut ini adalah beberapa daftarpola arsitektur aplikasi Web serta implementasinya di Node.js dan/atau JavaScript disisi klien:

X MVP (Model-View-Presenter): Google GWT.

X MVVM (Model-View-ViewModel): Batman.js (http://batmanjs.org) dan Knock-out.js (http://knockoutjs.com)

Page 78: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya 67

Gambar 7.2.: Pola arsitektur MVC

X RVP (Resource-View-Presenter): Flatiron (http://flatironjs.org)

X MVA (Model-View-Adapter).

X Hierarchical MVC

X Presentation-Abstract-Control.

Page 79: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

BAB 8

Real-time Web Menggunakan Socket.io

8.1. Apa itu Real-time Web?

Real-time Web menunjukkan suatu pola interaksi aplikasi Web yang memungkinkan ke-dua sisi saling mengirimkan data saat terjadi perubahan, jadi tidak seperti pola interaksiyang menghendaki pemakai untuk me-refresh browser jika menginginkan data / infor-masi / update terbaru dari sisi server. Contoh dari real-time Web adalah Facebook danTwitter. Pemakai akan mendapatkan update secara langsung saat terjadi perubahan (ko-mentar baru, pesan masuk, permintaan pertemanan, retweet, dan lain-lain), tanpa perlume-refresh halaman.

8.2. Teknologi Pendukung Real-time Web

Real-time Web merupakan hal yang relatif kompleks. Terdapat beberapa teknologi yangbisa digunakan untuk mewujudkan real-time Web tersebut. Beberapa diantaranya meru-pakan standar (atau akan menjadi standar), sedangkan lainnya bukan merupakan stan-dar.

8.2.1. Ajax Technology

Teknologi Ajax (kadang juga ditulis AJAX, singkatan dari Asynchronous JavaScriptand XML adalah sekumpulan teknologi yang pertama kali dicetuskan oleh Jesse JamesGarrett. Ajax memungkinkan browser untuk mengirim data dan mengambil data dariserver secara asynchronous (di latar belakang) tanpa mengganggu keseluruhan tampilanhalaman Web. Kumpulan teknologi yang digunakan adalah:

X (X)HTML dan CSS untuk presentasi halaman Web

68

Page 80: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

8.2. Teknologi Pendukung Real-time Web 69

X DOM (Document Object Model) untuk menampilkan data secara dinamis

X XML dan XSLT untuk pertukaran data (seringkali tidak menggunakan XML tetapiJSON).

X Obyek XMLHttpRequest untuk komunikasi asynchronous

X JavaScript

8.2.2. Comet dan Push Technology

Comet merupakan istilah payung yang merangkum berbagai teknologi push, yaitu teknologiyang memungkinkan server untuk mengirimkan data ke browser tanpa diminta olehbrowser.

SSE (Server-Sent Events)

SSE merupakan bagian dari spesifikasi standar HTML5 (bisa diakses di http://dev.w3.org/html5/eventsource/. Spesifikasi ini memungkinkan server untuk mem-push data kehalaman Web menggunakan protokol HTTP. Meski masih dalam pengembangan, tetapibeberapa browser sudah mendukung (misalnya Google Chrome / Chromium) serta Safari.Beberapa peranti pengembangan di sisi server juga sudah mendukung spesifikasi ini.Pada Node.js, pemrogram bisa menggunakan paket sse, nsse, atau EventSource.

Bayeux Protocol

Protokol ini dikembangkan oleh the Dojo Foundation yang mengembangkan softwareDojo Toolkit. Protokol ini digunakan sebagai transport untuk pesan-pesan asynchronousmelalui HTTP dengan latensi yang rendah antara klien dengan server. Pesan-pesantersebut di-rute-kan melalui channel-channel yang diberi nama dan bisa dikirimkan ke:

X server ke klien

X klien ke server

X klien ke klien (melalui server)

Spesifikasi lengkap dari protokol ini bisa dilihat di http://svn.cometd.com/trunk/bayeux/bayeux.html.

BOSH Protocol

BOSH (Bidirectional-streams Over Synchronous HTTP) adalah protokol transport yangmengemulasi stream dua arah antara dua entitas (misalnya antara klien dengan server)dengan menggunakan banyak HTTP req/resp yang synchronous tanpa memerlukan pollingyang sering atau respon yang terpotong-potong. Spesifikasi ini dikembangkan oleh ko-munitas serta yayasan XMPP dan bisa dilihat secara lengkap di http://xmpp.org/extensions/xep-0124.html

Page 81: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

8.3. Socket.io 70

8.2.3. WebSocket

WebSocket merupakan teknologi Web yang menyediakan saluran komunikasi full du-plex pada satu koneksi TCP. Protokol WebSocket distandarkan oleh IETF di RFC 6455sedangkap API (Application Programming Interface) dikembangkan dan distandarkanoleh W3C sebagai bagian dari HTML5. Komunikasi antara klien dengan server dilak-sanakan menggunakan TCP dengan nomor port 80.WebSocket diimplementasikan di sisi server dan klien dan memungkinkan adanya in-

teraksi yang lebih real-time daripada teknologi push karena protokol dan API ini di-implementasikan dan bisa digunakan di sisi klien maupun server. Browser yang sudahmendukung protokol dan API WebSocket ini adalah Chrome, Firefox, Safari, Opera, danInternet Explorer.Perkembangan dari WebSocket bisa dilihat dan diikuti di http://www.websocket.

org/

8.3. Socket.io

8.3.1. Apa itu Socket.io?

Socket.io adalah pustaka JavaScript yang merupakan implementasi dari protokol Web-Socket serta berbagai improvisasi lain yang diperlukan untuk real-time web (heartbeats,timeouts, dan disconnection). Protokol transport yang didukung adalah sebagai berikut:

X WebSocket

X Adobe Flash Socket

X AJAX long polling

X AJAX multipart streaming

X Forever Iframe

X JSONP Polling

Pustaka ini terdiri atas pustaka untuk sisi klien (browser) dan server (menggunakanNode.js). Browser yang didukung adalah:

X Internet Explorer 5.5+ (desktop)

X Safari 3+ (desktop)

X Google Chrome 4+ (desktop)

X Firefox 3+ (desktop)

X Opera 10.61+ (desktop)

X iPhone Safari (mobile)

Page 82: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

8.3. Socket.io 71

X iPad Safari (mobile)

X Android WebKit (mobile)

X WebOs WebKit (mobile)

8.3.2. Menggunakan Socket.io untuk Real-time Web

Socket.io melibatkan sisi klien dan sisi server. Pada sisi server, paket yang diperlukanadalah cocket.io, sementara untuk sisi klien (browser), diperlukan socket.io-client. Paketsocket.io-client tidak diperlukan langsung pada sisi node_modules, tetapi ada beberapafile yang harus ditempatkan pada akses publik dengan maksud supaya bisa digunakanoleh browser.

Tentang Aplikasi

Aplikasi ini hanya merupakan contoh kecil dari real-time Web. Aplikasi terdiri atas sisiserver dan klien/browser. Pada sisi server, aplikasi ini akan mengirimkan data ke browser(push). Sementara itu, browser akan menerima hasil push tersebut dan menampilkannyakemudian mengirimkan data ke server tanpa perlu melakukan proses refresh. Serverhanya akan menampilkan data yang dikirimkan browser.

Membuat Kerangka Aplikasi dengan ExpressJS

Untuk membuat aplikasi ini, kita akan menggunakan ExpressJS dan Socket.io. Padaawalnya, kita akan membuat kerangka aplikasi menggunakan express (jika ExpressJSbelum terinstall, install dengan menggunakan npm install -g express. Jika sudah terin-stall, buat direktori baru, kemudian buatlah kerangka aplikasi menggunakan express padadirektori tersebut: “express<Enter>”.Pada pembahasan berikutnya, kita akan mengadakan berbagai perubahan yang diper-

lukan.

Instalasi Paket yang Diperlukan

File package.json berisi beberapa informasi tentang aplikasi ini serta beberapa paketyang diperlukan. Isi dari file ini adalah sebagai berikut:

1 {2 "name" : "socket.io -expressjs" ,3 "version" : "0.0.1" ,4 "author" : "Bambang Purnomosidi D. P." ,5 "private" : true ,6 "scripts" : {7 "start" : "node app"8 } ,9 "dependencies" : {

10 "express" : "latest" ,11 "jade" : "*" ,12 "socket.io" : "latest" ,13 "socket.io-client" : "latest"

Page 83: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

8.3. Socket.io 72

14 }15 }

Listing 8.1: package.json

Setelah itu. install paket-paket tersebut dengan menggunakan perintah npm install didirektori tersebut.

Konfigurasi JavaScript untuk Browser

Browser juga memerlukan pustaka untuk Socket.io yang diperoleh dari paket socket.io-client. Pada paket tersebut, terdapat direktori dist :

1 $ l s −l a node_modules/ socke t . io−c l i e n t / d i s t /2 t o t a l 4963 drwxr−xr−x 2 bpdp bpdp 4096 May 6 00 :00 .4 drwxr−xr−x 7 bpdp bpdp 4096 May 6 00 :01 . .5 −rw−r−−r−− 1 bpdp bpdp 101222 Nov 2 2012 socket . i o . j s6 −rw−r−−r−− 1 bpdp bpdp 44789 Nov 2 2012 socket . i o . min . j s7 −rw−r−−r−− 1 bpdp bpdp 175953 Mar 28 2012 WebSocketMainInsecure . swf8 −rw−r−−r−− 1 bpdp bpdp 175830 Mar 28 2012 WebSocketMain . swf9 $

Listing 8.2: Isi direktori dist di socket.io-client

Copy-kan file-file tersebut ke direktori public/javascripts.

Hapus File yang Tidak Diperlukan

Ada beberapa file yang tidak diperlukan dan harus dihapus:

X routes/user.js

Ubah File-file Tertentu

Beberapa file akan diedit. Beberapa diantaranya akan diuraikan di bagian ini.12 /**3 * Module dependencies.4 */56 var expre s s = r equ i r e ( ’express ’ )7 , app = expre s s ( )8 , r oute s = r equ i r e ( ’./ routes ’ )9 , http = r equ i r e ( ’http’ )

10 , path = r equ i r e ( ’path’ )11 , s e r v e r = http . c r e a t eS e rv e r ( app )12 , i o = r equ i r e ( ’socket.io’ ) . l i s t e n ( s e r v e r ) ;1314 s e r v e r . l i s t e n ( 8 0 ) ;1516 // all environments17 app . s e t ( ’views’ , __dirname + ’/views ’ ) ;18 app . s e t ( ’view engine ’ , ’jade’ ) ;19 app . use ( expre s s . f av i con ( ) ) ;20 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;

Page 84: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

8.3. Socket.io 73

21 app . use ( expre s s . bodyParser ( ) ) ;22 app . use ( expre s s . methodOverride ( ) ) ;23 app . use ( app . rou te r ) ;24 app . use ( expre s s . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;2526 app . get ( ’/’ , r ou t e s . index ) ;2728 i o . s o cke t s . on ( ’connection ’ , function ( socke t ) {29 socket . emit ( ’kirim ke browser ’ , {30 ka l imatDar iServer : ’Kalimat ini dikirim dari server ’ } ) ;31 socket . on ( ’dari browser ’ , function ( data ) {32 conso l e . l og ( data . kal imatDariBrowser ) ;33 } ) ;34 } ) ;

Listing 8.3: app.js

1 extends layout23 block content4 h1= t i t l e5 p #{ t i t l e }6 s c r i p t ( s r c="/javascripts/socket.io.js" )7 s c r i p t8 var socke t = io . connect ( ’ http :// l o c a l ho s t ’ ) ;9 socke t . on ( ’ k i r im ke browser ’ , f unc t i on ( data ) {

10 document . getElementById ( "container" ) . innerHTML=11 "<p>" + data . ka l imatDar iServer + "</p>" ;12 socke t . emit ( ’ da r i browser ’ , {13 kal imatDariBrowser : ’ Kalimat i n i d ik i r im dar i browser ’ } ) ;14 } ) ;15 #conta ine r16 p #{ t i t l e }

Listing 8.4: views/index.jade

1 /∗2 ∗ GET home page .3 ∗/45 export s . index = func t i on ( req , r e s ){6 r e s . render ( ’ index ’ , { t i t l e : ’ Contoh Socket . i o + Express ’ } ) ;7 } ;

Listing 8.5: routes/index.js

Menjalankan Server Socket.io

Server socket.io menggunakan port 80 sehingga harus dijalankan oleh root.1 i n f o − socke t . i o s t a r t ed2 GET / 200 141ms − 628b3 GET / s t y l e s h e e t s / s t y l e . c s s 304 3ms4 GET / j a v a s c r i p t s / socke t . i o . j s 200 9ms − 98 .85 kb5 debug − c l i e n t author i zed6 i n f o − handshake author i zed LOoIlHJJjOl1g34JtLnP7 debug − s e t t i n g r eque s t GET / socket . i o /1/ websocket /LOoIlHJJjOl1g34JtLnP8 debug − set heartbeat i n t e r v a l for c l i e n t LOoIlHJJjOl1g34JtLnP9 debug − c l i e n t author i zed for

Page 85: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

8.3. Socket.io 74

10 debug − websocket wr i t i ng 1 : :11 debug − websocket wr i t i ng 5 : : : { "name" : "kirim ke browser" , "args" :12 [ { "kalimatDariServer" : "Kalimat ini dikirim dari server" } ]}13 Kalimat i n i d ik i r im dar i browser14 GET / 200 4ms − 628b15 i n f o − t r anspo r t end ( socke t end )16 debug − set c l o s e timeout for c l i e n t LOoIlHJJjOl1g34JtLnP17 debug − c l e a r ed c l o s e timeout for c l i e n t LOoIlHJJjOl1g34JtLnP18 debug − c l e a r ed heartbeat i n t e r v a l for c l i e n t LOoIlHJJjOl1g34JtLnP19 debug − d i s c a rd i ng t ranspo r t20 GET / s t y l e s h e e t s / s t y l e . c s s 304 1ms21 GET / j a v a s c r i p t s / socke t . i o . j s 304 1ms22 debug − c l i e n t author i zed23 i n f o − handshake author i zed ijvgksAoa−BWm7uytLnQ24 debug − s e t t i n g r eque s t GET / socket . i o /1/ websocket / i jvgksAoa−BWm7uytLnQ25 debug − set heartbeat i n t e r v a l for c l i e n t i jvgksAoa−BWm7uytLnQ26 debug − c l i e n t author i zed for27 debug − websocket wr i t i ng 1 : :28 debug − websocket wr i t i ng 5 : : : { "name" : "kirim ke browser" , "args" :29 [ { "kalimatDariServer" : "Kalimat ini dikirim dari server" } ]}30 Kalimat i n i d ik i r im dar i browser31 debug − emit t ing heartbeat for c l i e n t i jvgksAoa−BWm7uytLnQ32 debug − websocket wr i t i ng 2 : :33 debug − set heartbeat timeout for c l i e n t i jvgksAoa−BWm7uytLnQ34 debug − got heartbeat packet35 debug − c l e a r ed heartbeat timeout for c l i e n t i jvgksAoa−BWm7uytLnQ36 debug − set heartbeat i n t e r v a l for c l i e n t i jvgksAoa−BWm7uytLnQ

Listing 8.6: Menjalankan server Socket.io

Keluaran pada sisi server tersebut merupakan keluaran yang sudah termasuk aksesdari browser. Setelah server dijalankan, buka browser kemudian akses URL http://localhost. Setelah diakses melalui browser, server akan mengirimkan kode sumberHTML sebagai berikut:

1 <!DOCTYPE html>2 <html>3 <head>4 <t i t l e>Contoh Socket . i o + Express</ t i t l e>5 <l ink rel="stylesheet" href="/stylesheets/style.css">6 </head>7 <body>8 <h1>Contoh Socket . i o + Express</h1>9 <p>Contoh Socket . i o + Express</p>

10 <script src="/javascripts/socket.io.js"></ script>11 <script>12 var socke t = io . connect ( ’ http :// l o c a l ho s t ’ ) ;13 socke t . on ( ’ k i r im ke browser ’ , f unc t i on ( data ) {14 document . getElementById ( "container" ) . innerHTML=15 "<p>" + data . ka l imatDar iServer + "</p>" ;16 socke t . emit ( ’ da r i browser ’ , {17 kal imatDariBrowser : ’ Kalimat i n i d ik i r im dar i browser ’ } ) ;18 } ) ;19 </ script>20 <div id="container">21 <p>Contoh Socket . i o + Express</p>22 </div>23 </body>24 </html>

Listing 8.7: Kode sumber di browser

Page 86: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

8.3. Socket.io 75

Gambar 8.1.: Hasil di browser dari ExpressJS + Socket.io

Tampilan di browser bisa dilihat pada gambar 8.1Contoh pada materi ini merupakan contoh sederhana, tetapi diharapkan bisa dengan

mudah dipahami untuk membuat aplikasi Web real-time.

Page 87: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Daftar Pustaka

[1] Anonim, Mozilla Developer Network - JavaScript, https://developer.mozilla.org/en-US/docs/JavaScript.

[2] Cody Lindley, JavaScript Enlightenment, http://javascriptenlightenment.com,2012.

[3] David Flanagan, JavaScript: The Definitive Guide, 4th Edition, O’Reilly, 2001.

[4] Don Nguyen, Jump Start Node.js, SitePoint, 2012.

[5] Douglas Crockford, JavaScript: The Good Parts, O’Reilly, 2008.

[6] Marijn Haverbeke, Eloquent JavaScript: A Modern Introduction to Programming,No Starch Press, 2011.

[7] Shelley Powers, Learning Node, O’Reilly, 2012.

[8] Tom Hughes-Croucher, Mike Wilson, Node: Up and Running, O’Reilly, 2012.

76

Page 88: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Lampiran

77

Page 89: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

LAMPIRAN A

Gaya Penulisan Kode / Coding Style

A.1. Tentang Gaya Penulisan Kode

Pada saat seseorang berada pada proses pembuatan kode sumber (coding), apapun gayapenulisan programnya, tidak akan bermasalah jika program itu hanya dia buat untuksi pemrogram itu sendiri. Meski demikian, hal tersebut jarang terjadi karena biasanyaselalu ada kerja kelompok atau setidaknya program tersebut akan digunakan oleh pi-hak lain yang suatu saat perlu memahami apa yang tertulis di kode sumber tersebut.Untuk keperluan itu, biasanya diperlukan suatu gaya penulisan kode. Saat ini banyaksekali gaya penulisan kode untuk JavaScript / Node.js, biasanya tergantung pada kesepa-katan anggota-anggota dalam kelompok pengembang dan berdasarkan pada pengalamanmereka tersebut. Pada lampiran ini, gaya penulisan kode dari NPM akan dituliskansecara utuh (dalam bahasa aslinya dengan harapan bisa bermanfaat untuk penyeraga-man dan kemudahan membaca atau menelusuri bugs/errors). Gaya penulisan kode inidiambil dari https://npmjs.org/doc/coding-style.html.

A.2. npm’s Coding Style

npm’s "funny" coding style

A.2.1. DESCRIPTION

npm’s coding style is a bit unconventional. It is not different for difference’s sake, butrather a carefully crafted style that is designed to reduce visual clutter and make bugsmore apparent.If you want to contribute to npm (which is very encouraged), you should make your

code conform to npm’s style.

78

Page 90: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

A.2. npm’s Coding Style 79

A.2.2. Line Length

Keep lines shorter than 80 characters. It’s better for lines to be too short than to be toolong. Break up long lists, objects, and other statements onto multiple lines.

A.2.3. Indentation

Two-spaces. Tabs are better, but they look like hell in web browsers (and on github),and node uses 2 spaces, so that’s that.Configure your editor appropriately.

A.2.4. Curly braces

Curly braces belong on the same line as the thing that necessitates them. Bad:1 function ( )2 {

Listing A.1: Bad curly braces placement - 1

Good:1 function ( ) {

Listing A.2: Good curly braces placement - 1

If a block needs to wrap to the next line, use a curly brace. Don’t use it if it doesn’t.Bad:

1 i f ( foo ) { bar ( ) }2 while ( foo )3 bar ( )

Listing A.3: Bad curly braces placement - 2

Good:1 i f ( foo ) bar ( )2 while ( foo ) {3 bar ( )4 }

Listing A.4: Good curly braces placement - 2

A.2.5. Semicolons

Don’t use them except in four situations:

X for (;;) loops. They’re actually required.

X null loops like: while (something) ; (But you’d better have a good reason fordoing that.)

X case "foo": doSomething(); break

Page 91: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

A.2. npm’s Coding Style 80

X In front of a leading ( or [ at the start of the line. This prevents the expressionfrom being interpreted as a function call or property access, respectively.

Some examples of good semicolon usage:1 ; ( x | | y ) . doSomething ( )2 ; [ a , b , c ] . forEach ( doSomething )3 f o r (var i = 0 ; i < 10 ; i ++) {4 switch ( s t a t e ) {5 case "begin" : s t a r t ( ) ; cont inue6 case "end" : f i n i s h ( ) ; break7 d e f au l t : throw new Error ( "unknown state" )8 }9 end ( )

10 }

Listing A.5: Good semicolon usage

Note that starting lines with - and + also should be prefixed with a semicolon, butthis is much less common.

A.2.6. Comma First

If there is a list of things separated by commas, and it wraps across multiple lines, putthe comma at the start of the next line, directly below the token that starts the list. Putthe final token in the list on a line by itself. For example:

1 var magicWords = [ "abracadabra"2 , "gesundheit"3 , "ventrilo"4 ]5 , s p e l l s = { "fireball" : function ( ) { setOnFire ( ) }6 , "water" : function ( ) { putOut ( ) }7 }8 , a = 19 , b = "abc"

10 , e t c11 , somethingElse

Listing A.6: Comma first

A.2.7. Whitespace

Put a single space in front of ( for anything other than a function call. Also use a singlespace wherever it makes things more readable.Don’t leave trailing whitespace at the end of lines. Don’t indent empty lines. Don’t

use more spaces than are helpful.

A.2.8. Functions

Use named functions. They make stack traces a lot easier to read.

Page 92: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

A.2. npm’s Coding Style 81

A.2.9. Callbacks, Sync/async Style

Use the asynchronous/non-blocking versions of things as much as possible. It might makemore sense for npm to use the synchronous fs APIs, but this way, the fs and http andchild process stuff all uses the same callback-passing methodology.The callback should always be the last argument in the list. Its first argument is the

Error or null.Be very careful never to ever ever throw anything. It’s worse than useless. Just send

the error message back as the first argument to the callback.

A.2.10. Errors

Always create a new Error object with your message. Don’t just return a string messageto the callback. Stack traces are handy.

A.2.11. Logging

Logging is done using the npmlog utility.Please clean up logs when they are no longer helpful. In particular, logging the same

object over and over again is not helpful. Logs should report what’s happening so thatit’s easier to track down where a fault occurs.Use appropriate log levels. See config(1) and search for "loglevel".

A.2.12. Case, naming, etc.

X Use lowerCamelCase for multiword identifiers when they refer to objects, func-tions, methods, members, or anything not specified in this section.

X Use UpperCamelCase for class names (things that you’d pass to "new").

X Use all-lower-hyphen-css-case for multiword filenames and config keys.

X Use named functions. They make stack traces easier to follow.

X Use CAPS_SNAKE_CASE for constants, things that should never change andare rarely used.

X Use a single uppercase letter for function names where the function would normallybe anonymous, but needs to call itself recursively. It makes it clear that it’s a"throwaway" function.

A.2.13. null, undefined, false, 0

X Boolean variables and functions should always be either true or false. Don’t setit to 0 unless it’s supposed to be a number.

X When something is intentionally missing or removed, set it to null.

Page 93: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

A.2. npm’s Coding Style 82

X Don’t set things to undefined. Reserve that value to mean "not yet set to any-thing."

X Boolean objects are verboten.

Selain gaya penulisan kode dari NPM ini, ada beberapa lagi lainnya yang bisa dilihat,antara lain:

X Spludo http://spludo.com/source/coding-standards/

X Google JavaScript Style Guide (http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml)

X Felix’s Node.js Style Guide (http://nodeguide.com/style.html)

Page 94: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

LAMPIRAN B

Commit History dari Penulis Utama dan Kontributor

Buku ini merupakan hasil karya bersama dari beberapa penulis. Peran masing-masingpenulis bisa dilihat pada bagian ringkasan dari sejarah commit. Penulis utama adalahsaya (Bambang Purnomosidi D. P), sementara pada bab 5 ada kontribusi dari Aji KisworoMukti. Hasil log dari git menunjukkan peran masing-masing penulis (git shortlog):

1 Aj i Kisworo Mukti ( 3 ) :2 Bab 5 − Struktur I n s t a l l a s i Paket Node . j s3 Bab 5 − I n s t a l l a s i Paket4 Bab 5 − Menghapus Paket56 Bambang Purnomosidi D. P ( 7 7 ) :7 I n i t i a l commit8 F i r s t commit − i n i t i a l i z i n g empty repo9 Merge branch ’ master ’ o f https : // github . com/bpdp/buku−cloud−node j s

10 Menambahkan l i n k ke teks bahasa Indones ia untuk l i s e n s i CC−BY−SA11 Menambahkan l i n k ke teks bahasa Indones ia untuk l i s e n s i CC−BY−SA12 Menambahkan l i n k ke teks bahasa Indones ia untuk l i s e n s i CC−BY−SA13 Menambahkan t i p s untuk indeks14 Melengkapi bab 1 , terutama tentang t e o r i Cloud Computing15 kesa lahan k e c i l , t idak menutup t e x t i t dengan { tap i |16 Menambahkan indeks da r i Bab 117 Bab 1 s e l e s a i18 Bab 2 − bagian REPL s e l e s a i19 Edit bagian i n s t a l a s i F l a t i r on − h a s i l d i r e k t o r i20 Menambahkan tentang penu l i s buku21 Bab 1 − s e d i k i t keterangan t tg Node . j s , Bab 2 − awal dasar2 JavaScr ipt22 Penambahan i s i d i bab 2 dan 723 Update bab 5 −> mengubah NPM mjd npm dan menambahkan ’Apakah npm i tu ? ’24 Make f i l e => buat c lean−a l l dan clean−without−pdf , bab 2 s e l e s a i Readl ine25 t r i v i a l changes26 Penambahan di bab 2 , menetapkan shadowbox untuk ’ catatan ’27 Bab 2 : n i l a i , t i p e data , dan va r i ab e l . Menambahkan utk catatan ke t i p s28 Penambahan tentang L i t e r a l dan r e o r g a n i s a s i sub bab ( f ung s i )29 Bab 2 : Pembahasan ’ Fungsi ’ s e l e s a i .30 Bab 2 − L i t e r a l , s e l e s a i31 Bab 2 − Pernyataan kond i s i i f . . else i f . . else : s e l e s a i32 Bab 2 − JSON, switch , dan loop ing for −− s e l e s a i

83

Page 95: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

B. Commit History dari Penulis Utama dan Kontributor 84

33 Memperbaiki s e d i k i t typo , kurang satu { d i f oo tno t e wik iped ia utk JSON34 Bab 2 s e l e s a i35 Bab 3 − penger t ian PBO dan d e f i n i s i obyek −> s e l e s a i36 Menambahkan Aj i Kisworo Mukti ke kont r ibuto r d i README.md37 Minor r e v i s i o n d i bab 5 , menambahkan gambar npmls ( soa lnya kode ASCII38 keluarannya kacau di LaTex dan saya blm tau workaround−nya39 Mengubah cover −> l eb i h umum, gant i dg logo NodeJS , menambahkan Aj i ke40 kontr ibutor , appendix B −> commit h i s t da r i kont r ibuto r41 Menambahkan mater i PBO => melengkapi d e f i n i s i obyek s e r t a i nh e r i t an c e .42 Contoh i nh e r i t an c e . j s ditambahkan43 Bab 3 − Pemrograman fung s i ona l d i JS => penge r t i a + beberapa po int yg44 akan dibahas45 Menambahkan i n f o tentang koma−s c r i p t d i README.md dan Make f i l e v e r s i46 t e r akh i r47 Menambahkan nested func t i on s d i bab 248 Menambahkan source code nested . j s ( bab 2)49 Bab 3 − beberapa penambahan di pemrograman fung s i ona l50 Bab 3 − Lambda Express ion + contoh51 Higher−order function − Bab 352 Menyelesaikan Closure dan Currying d i Bab 3 . Bab 3 sudah s e l e s a i .53 Mengganti s t ruk tu r − bab 4 −> 5 dan seba l i knya . Bab 4 s e l e s a i , Bab 354 minor rev55 Bab 5 −> (A) Synchronous programming56 Bab 5 −> reo r g an i s a s i , minor r e v i s i o n57 Bab 5 : Event−Driven Programming menggunakan events . EventEmitter .58 => Bab 5 s e l e s a i59 Bab 6 : S ed i k i t pen j e l a san tentang db NoSQL60 Bab 6 − menambahkan pen j e l a san t tg mongoDB: f i t u r , s e rver , c l i e n t web61 Bab 6 : node−gyp dan i n s t a l a s i d r i v e r mongodb62 Bab 6 : menambahkan i n s t a l a s i npm untuk mongodb63 Bab 6 : i n s t a l l mongojs , akses mongojs da r i Node . j s . Kurang a p l i k a s i web64 Bab 4 : menambahkan i n f o t tg i n s t a l l ke homedir ( j i k a berada dlm home)65 dan node_modules ( j i k a d i l ua r home)66 Bab 6 : memulai a p l i k a s i web dengan node j s+exp r e s s j s+mongodb67 Bab 6 : s r c code utk a p l i k a s i web node j s+expre s s+mongoDB s e l e s a i68 Bab 6 s e l e s a i69 Reorgan i sa s i bab 7 dan 8 , menghapus db mongoDB, menambahkan README.md70 utk l a t i han2 d i bab 671 Edit README.md bab 672 Menambah i s i bab 7 dan 873 Bab 8 : source code utk socke t . i o74 Bab 8 s e l e s a i , menambahkan contoh a p l i k a s i Socket . i o75 S e l e s a i . s e d i k i t pembenahan . ha r i i n i bab 7 dan 8 s e l e s a i76 Rev i s i minor bab 6 dan 877 Menambahkan da f t a r pustaka yang digunakan78 Rev i s i minor d i bbrp bab , terutama t e r k a i t margin kanan yg t e r l a l u79 bablas80 Menambahkan indeks81 Edit Appendiks B ( history commit ) dan README.md (menambah s ta tu s −82 buku sudah s e l e s a i )83 Menambahkan l i n k ke f i l e PDF di README.md84 Memperbaharui s e s u a i dengan v e r s i so f tware terbaru (7 Jan 2013)+kata85 pengantar86 update README.md untuk mere f l ek s i kan kond i s i t e rbaru87 Cover : menambah l i s e n s i dan lambang , Bab 1 diubah menyesauikan dgn88 Node 0 . 1 0 . 0 dan vmc 0 . 5 . 089 Menyesuaikan dengan semua v e r s i so f tware t g l 22 Maret 201390 Menambahkan s t a tu s d i README.md ( as o f March 22 , 2013) , memasukkan91 commit history92 Edit README.md − minor rev93 l i s t i n g dan tampilan2 teks l aya r skrg diambi l dengan \ l s t i n p u t l i s t i n g −94 bab 1 s e l e s a i

Page 96: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

B. Commit History dari Penulis Utama dan Kontributor 85

95 Bab 2 s e l e s a i di−migras i l s t i n p u t l i s t i n g , rename d i r utk k on s i s t e n s i96 d i s r c /97 Mengedit s r c /README.md agar s e s u a i kond i s i saat i n i98 Memperbarui semua v e r s i so f tware as o f May 6 , 2013 . Clean up junk ie s ,99 typos . Semua source code dan tampilan . txt d ip i sahkan dar i f i l e 2

100 LaTeX utk modular i tas101 Lihat Changelogs . txt − tangga l 6 Mei 2013102103 Bambang Purnomosidi D. P. ( 1 ) :104 Merge pu l l r eque s t #1 from adzymaniac/master

Listing B.1: Commit history

Page 97: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Indeks

AJAX, 68Aliran kendali, 31Array, 28Asynchronous, 50

Bayeux Protocol, 69Boolean, 29BOSH, 69

Callback, 50Closure, 39Cloud Computing, 1

Definisi, 1Karakteristik, 1Model layanan, 3Private, 3Public, 3

CloudFoundry, 4vmc, 4

Comet, 69CommonJS, 23Currying, 39

Dynamically typed, 24

ECMAScript, 23Ekspresi Lambda, 37Event-Driven, 49events.EventEmitter, 49

Floating-point, 29

Fungsi, 26Fungsi Anonim, 27Fungsi rekursif, 27

Higher-order Function, 38

Identifier, 25if, 31Integer, 29

JSON, 30Validator, 48

Konstanta, 25

Literal, 28Looping, 33

mongoDB, 52Driver, 57

Multitenancy, 3MVC, 62

dan ExpressJS, 64

Nested functions, 27Node-gyp, 57Node.js, 4

Hosting, 4Non-blocking IO, 50NOSQL, 52npm, 43

Cari paket, 45

86

Page 98: Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

Indeks 87

Hapus paket, 45Info paket, 46install paket, 44Struktur paket, 44Update paket, 47

Obyek, 29, 40

PBO, 40Penanganan error, 35Pewarisan, 41Pola arsitektur, 62

Readline, 23Real-time Web, 68REPL, 21

Server-Sent Events, 69Socket.io, 70String, 29switch, 32

Tipe data, 24

Variabel, 25

WebSocket, 70