Está en la página 1de 93

Pengembangan Aplikasi Cloud Computing Menggunakan Node.

js

Oleh:

Bambang Purnomosidi D. P. (http://bpdp.name) Aji Kisworo Mukti (http://adzymaniac.web.id)

December 26, 2012

Kata Pengantar Selamat datang pada workshop Pengambangan Aplikasi Cloud Computing Menggunakan Node.js. Workshop ini merupakan workshop yang dirancang untuk keperluan memberikan pengetahuan mendasar pengembangan aplikasi berbasis Cloud Computing. Untuk mengikuti materi yang ada pada workshop ini, peserta diwajibkan membawa laptop yang telah terisi berbagai software infrastruktur yang diperlukan dan peserta diwajibkan mengetahui penggunaan software-software tersebut: Sistem operasi Linux (distribusi apa saja) Git (untuk SCM) Ruby dan Rubygem mongoDB (basis data NOSQL) Vim (untuk mengedit source code) Software utama untuk keperluan workshop ini yaitu Node.js serta command line tools dari provider Cloud Computing (materi ini menggunakan fasilitas dari CloudFoundry), akan dibahas pada workshop. Materi akan lebih banyak berorientasi ke command line / shell sehingga para peserta sebaiknya sudah memahami cara-cara menggunakan shell di Linux. Have fun!

Daftar Isi

Kata Pengantar Daftar Gambar Listing Program Daftar Tabel

i iii iv v

1. Pengenalan Cloud Computing dan Infrastruktur Pengembangan Aplikasi Berbasis Node.js 1 1.1. Apa itu Cloud Computing? . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2. Karakteristik Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3. Public dan Private Cloud Computing . . . . . . . . . . . . . . . . . . . . . 3 1.4. Model Layanan Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . 3 1.5. Pengembangan Aplikasi di Cloud Computing . . . . . . . . . . . . . . . . 3 1.6. Node.js dan Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.7. Layanan Hosting Aplikasi: CloudFoundry . . . . . . . . . . . . . . . . . . 4 1.7.1. Pendaftaran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.7.2. Instalasi Command Line Utilities . . . . . . . . . . . . . . . . . . . 4 1.7.3. Kongurasi di Server Cloud . . . . . . . . . . . . . . . . . . . . . . 9 1.7.4. Instalasi dan Kongurasi Node.js di Komputer Lokal . . . . . . . . 10 1.8. Pengelolaan Aplikasi di Cloud . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.8.1. Push, Delete, Update Aplikasi . . . . . . . . . . . . . . . . . . . . . 11 1.8.2. Menggunakan Framework ExpressJS . . . . . . . . . . . . . . . . . 11 1.8.3. Tanpa Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2. REPL dan Dasar-dasar JavaScript di Node.js 17 2.1. REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.1.1. Mengaktifkan REPL . . . . . . . . . . . . . . . . . . . . . . . . . . 17

ii

Daftar Isi 2.1.2. Perintah-perintah REPL . . . . . . . . . . . . . . . . . . . . 2.2. Dasar-dasar JavaScript di Node.js . . . . . . . . . . . . . . . . . . . 2.2.1. Membaca Masukan dari Stream / Masukan Standar (stdin) 2.2.2. Nilai/Value dan Tipe Data . . . . . . . . . . . . . . . . . . 2.2.3. Variabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.4. Konstanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.5. Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pengertian Fungsi . . . . . . . . . . . . . . . . . . . . . . . Denisi Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . Fungsi Anonim . . . . . . . . . . . . . . . . . . . . . . . . . Fungsi Rekursif . . . . . . . . . . . . . . . . . . . . . . . . . Fungsi di dalam Fungsi / Nested Functions . . . . . . . . . 2.2.6. Literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literal Array . . . . . . . . . . . . . . . . . . . . . . . . . . Literal Boolean . . . . . . . . . . . . . . . . . . . . . . . . . Literal Integer . . . . . . . . . . . . . . . . . . . . . . . . . Literal Floating-point . . . . . . . . . . . . . . . . . . . . . Literal Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . Literal String . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.7. Struktur Data dan Representasi JSON . . . . . . . . . . . . 2.2.8. Aliran Kendali . . . . . . . . . . . . . . . . . . . . . . . . . Pernyataan Kondisi if .. else if .. else . . . . . . . . . . . . Pernyataan switch . . . . . . . . . . . . . . . . . . . . . . . Looping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.9. Penanganan Error . . . . . . . . . . . . . . . . . . . . . . . 3. Paradigma Pemrograman di JavaScript 3.1. Pemrograman Fungsional . . . . . . 3.1.1. Ekspresi Lambda . . . . . . . 3.1.2. Higher-order Function . . . . 3.1.3. Closure . . . . . . . . . . . . 3.1.4. Currying . . . . . . . . . . . . 3.2. Pemrograman Berorientasi Obyek . . 3.2.1. Pengertian . . . . . . . . . . . 3.2.2. Denisi Obyek . . . . . . . . 3.2.3. Inheritance / Pewarisan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

iii 18 19 19 20 21 21 22 22 22 23 23 23 24 24 24 24 25 25 25 26 27 27 27 28 31 32 32 32 33 34 34 35 35 35 36 38 38 38 39 39 40 40

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

4. Mengelola Paket Menggunakan npm 4.1. Apakah npm Itu? . . . . . . . . . . . . . 4.2. Menggunakan npm . . . . . . . . . . . . 4.2.1. Instalasi Paket . . . . . . . . . . 4.2.2. Struktur Instalasi Paket Node.js 4.2.3. Menghapus Paket / Uninstall . . 4.2.4. Mencari Paket . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

Daftar Isi

iv

4.2.5. Menampilkan Informasi Paket . . . . . . . . . . . . . . . . . . . . . 41 4.2.6. Memperbaharui Paket . . . . . . . . . . . . . . . . . . . . . . . . . 42 5. Node.js dan Web: Teknik Pengembangan Aplikasi 5.1. Pendahuluan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Event-Driven Programming dan EventEmitter . . . . . . . . . . . . . . . . 5.3. Asynchronous / Non-blocking IO dan Callback . . . . . . . . . . . . . . . 6. Mengakses Basis Data NoSQL: mongoDB 6.1. Apa itu Basis Data NoSQL? . . . . . . . . . . . . . 6.2. Mengenal mongoDB dan Fitur-turnya . . . . . . . 6.2.1. Memulai Server . . . . . . . . . . . . . . . . 6.2.2. Klien dan Shell mongoDB . . . . . . . . . . 6.2.3. Documents dan Collections . . . . . . . . . 6.3. Node.js dan MongoDB . . . . . . . . . . . . . . . . 6.3.1. Node-gyp . . . . . . . . . . . . . . . . . . . 6.3.2. Driver Node.js untuk mongoDB . . . . . . . 6.3.3. Mengakses mongoDB dari Node.js . . . . . 6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 43 43 44 45 47 47 47 48 49 49 51 51 52 53 54 58 58 58 60 60 61 62 62 64 64 64 64 65 65 65 65 66 66 66 67 67 67 68

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

7. Pola Arsitektur Aplikasi Web: MVC dan ExpressJS 7.1. Apa itu Pola Arsitektur? . . . . . . . . . . . . . . . . . . . . . 7.2. Pola Arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . 7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 7.3.1. Struktur Aplikasi . . . . . . . . . . . . . . . . . . . . . 7.3.2. File-le yang Diperlukan . . . . . . . . . . . . . . . . . 7.3.3. Hasil . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya . . . 8. Real-time Web Menggunakan Socket.io 8.1. Apa itu Real-time Web? . . . . . . . . . . . . . . . . . 8.2. Teknologi Pendukung Real-time Web . . . . . . . . . . 8.2.1. Ajax Technology . . . . . . . . . . . . . . . . . 8.2.2. Comet dan Push Technology . . . . . . . . . . . SSE (Server-Sent Events) . . . . . . . . . . . . Bayeux Protocol . . . . . . . . . . . . . . . . . BOSH Protocol . . . . . . . . . . . . . . . . . . 8.2.3. WebSocket . . . . . . . . . . . . . . . . . . . . 8.3. Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1. Apa itu Socket.io? . . . . . . . . . . . . . . . . 8.3.2. Menggunakan Socket.io untuk Real-time Web . Tentang Aplikasi . . . . . . . . . . . . . . . . . Membuat Kerangka Aplikasi dengan ExpressJS Instalasi Paket yang Diperlukan . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

Daftar Isi Kongurasi JavaScript untuk Browser Hapus File yang Tidak Diperlukan . . Ubah File-le Tertentu . . . . . . . . . Menjalankan Server Socket.io . . . . . Daftar Pustaka Lampiran A. Gaya Penulisan Kode / Coding Style A.1. Tentang Gaya Penulisan Kode . . . A.2. npms Coding Style . . . . . . . . . A.2.1. DESCRIPTION . . . . . . A.2.2. Line Length . . . . . . . . . A.2.3. Indentation . . . . . . . . . A.2.4. Curly braces . . . . . . . . A.2.5. Semicolons . . . . . . . . . A.2.6. Comma First . . . . . . . . A.2.7. Whitespace . . . . . . . . . A.2.8. Functions . . . . . . . . . . A.2.9. Callbacks, Sync/async Style A.2.10. Errors . . . . . . . . . . . . A.2.11. Logging . . . . . . . . . . . A.2.12. Case, naming, etc. . . . . . A.2.13. null, undened, false, 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

v 68 68 69 70 72 74 74 74 74 74 75 75 75 75 76 76 76 77 77 77 77 77 79 80

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

B. Commit History dari Penulis Utama dan Kontributor Indeks

Daftar Gambar

1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.8.

Model Cloud Computing . . . . . . . . . . . . . . . Pendaftaran di CF . . . . . . . . . . . . . . . . . . Hasil proses pendaftaran di CF . . . . . . . . . . . E-mail persetujuan dan pemberitahuan credentials Hasil push ke server . . . . . . . . . . . . . . . . . Hasil update dengan menyertakan versi Node.js . . Deployement menggunakan versi runtime tertentu . Hasil deployement app.js tanpa framework . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

2 5 6 7 14 15 15 16

4.1. Hasil perintah npm ls

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

6.1. Admin web console untuk mongoDB . . . . . . . . . . . . . . . . . . . . . 50 7.1. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 7.2. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 8.1. Hasil di browser dari ExpressJS + Socket.io . . . . . . . . . . . . . . . . . 71

vi

Listing Program

1.1. Instalasi vmc . . . . . . . . . . . . . . . . . . . . . . 1.2. Hasil gem yang terinstall . . . . . . . . . . . . . . . . 1.3. Mengaktifkan direktori "bin" hasil instalasi gem . . . 1.4. Hasil opsi help dari vmc . . . . . . . . . . . . . . . . 1.5. Mengubah target server . . . . . . . . . . . . . . . . 1.6. Login ke server . . . . . . . . . . . . . . . . . . . . . 1.7. Mengubah password server . . . . . . . . . . . . . . . 1.8. Hasil dari download Node.js . . . . . . . . . . . . . . 1.9. Ekstraksi Node.js . . . . . . . . . . . . . . . . . . . . 1.10. Kongurasi variabel lingkungan Node.js . . . . . . . 1.11. Instalasi ExpressJS menggunakan npm . . . . . . . . 1.12. package.json untuk ExpressJS . . . . . . . . . . . . . 1.13. app.js untuk ExpressJS . . . . . . . . . . . . . . . . 1.14. Deployment aplikasi ExpressJS ke CF . . . . . . . . 1.15. Update: menambahkan versi Node.js ke app.js . . . . 1.16. Mengupdate aplikasi di server . . . . . . . . . . . . . 1.17. Menghapus aplikasi yang di-deploy di CF . . . . . . 1.18. Deployment ke CF dengan memilih runtime Node.js 1.19. app.js tanpa framework . . . . . . . . . . . . . . . . 1.20. Deployment app.js tanpa framework . . . . . . . . . 2.1. 2.2. 2.3. 2.4. 2.5. 2.6. 2.7.

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

5 5 6 7 9 9 10 10 11 11 12 13 13 13 14 14 15 15 16 16 17 18 18 20 20 21 21

Node.js REPL . . . . . . . . . . . . . . . . . . . . . . . . . Contoh penggunaan .load dalam REPL . . . . . . . . . . . Contoh penggunaan perintah .save di sesi REPL . . . . . readline.js: penggunaan pustaka Readline untuk masukan Hasil eksekusi readline.js . . . . . . . . . . . . . . . . . . . Fitur dynamically typed language . . . . . . . . . . . . . . Contoh konstanta dalam JavaScript . . . . . . . . . . . . .

vii

Listing Program 2.8. Sintaksis Fungsi dalam JavaScript . . . . . . . 2.9. Pemanggilan Fungsi dalam JavaScript . . . . 2.10. Contoh deklarasi fungsi dan pemanggilannya 2.11. Fungsi anonim . . . . . . . . . . . . . . . . . 2.12. Fungsi rekursif untuk menghitung faktorial . 2.13. Fungsi di dalam Fungsi . . . . . . . . . . . . . 2.14. Array di JavaScript . . . . . . . . . . . . . . . 2.15. Representasi JSON . . . . . . . . . . . . . . . 2.16. Pernyataan if .. else if .. else . . . . . . . . . 2.17. Pernyataan if .. else if .. else . . . . . . . . . 2.18. Pernyataan for . . . . . . . . . . . . . . . . . 2.19. Pernyataan for .. in . . . . . . . . . . . . . . 2.20. Pernyataan do .. while . . . . . . . . . . . . . 2.21. Pernyataan while . . . . . . . . . . . . . . . . 2.22. Pernyataan break dan continue . . . . . . . . 2.23. Pernyataan break dengan label . . . . . . . . 2.24. Pernyataan break dengan label . . . . . . . . 2.25. Pernyataan break dengan label . . . . . . . . 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 4.8. 5.1. 5.2. 5.3. 5.4. 5.5. 6.1. 6.2. 6.3. 6.4. Ekspresi Lambda di JavaScript . . . Higher-order Function di JavaScript Closure di JavaScript . . . . . . . . . Currying di JavaScript . . . . . . . . Denisi obyek di JavaScript . . . . . Pewarisan di PBO JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

viii 22 22 22 23 23 23 24 26 27 27 28 28 29 29 30 30 31 31 33 33 34 34 35 36 38 39 40 40 40 41 42 42 43 44 45 45 46 48 49 49 49

Sintaksis lengkap perintah npm . . . . . . . . . . . . . Cara install paket menggunakan npm . . . . . . . . . . Argumen npm untuk melihat daftar paket terpasang . Perintah menghapus paket di npm . . . . . . . . . . . Perintah menghapus paket di npm . . . . . . . . . . . Menampilkan rincian suatu paket dalam format JSON Memperbaharui paket lokal . . . . . . . . . . . . . . . Memperbaharui paket secara global . . . . . . . . . . . pegawai.json . . . . . . . . . . . . . server.js . . . . . . . . . . . . . . . server-on-error.js . . . . . . . . . . Membaca le secara synchronous . Membaca le secara asynchronous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Menjalankan server MongoDB (mongod) Mengakhiri server MongoDB (mongod) . Shell mongoDB (mongo) . . . . . . . . . Sesi dalam shell mongoDB . . . . . . . .

Listing Program 6.5. Instalasi node-gyp . . . . . . . . . 6.6. Instalasi driver mongoDB . . . . . 6.7. Instalasi driver mongoDB . . . . . 6.8. Mengakses mongoDB dari Node.js 6.9. Mengakses mongoDB dari Node.js 6.10. app.js . . . . . . . . . . . . . . . . 6.11. package.json . . . . . . . . . . . . . 6.12. routes/employee.js . . . . . . . . . 6.13. views/employee.jade . . . . . . . . 6.14. views/index.jade . . . . . . . . . . 7.1. 7.2. 7.3. 7.4. 7.5. 7.6. 8.1. 8.2. 8.3. 8.4. 8.5. 8.6. 8.7. 8.8. A.1. A.2. A.3. A.4. A.5. A.6. Struktur direktori Struktur direktori app.js . . . . . . controllers/user.js models/db.js . . package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

ix 51 52 53 53 54 55 56 56 56 57 60 60 61 61 62 62 67 68 68 69 69 69 70 70 75 75 75 75 76 76

asli aplikasi ExpressJS . . . . ExpressJS sesuai pola MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Membuat kerangka aplikasi dengan ExpressJS package.json . . . . . . . . . . . . . . . . . . . Isi direktori dist di socket.io-client . . . . . . app.js . . . . . . . . . . . . . . . . . . . . . . views/index.jade . . . . . . . . . . . . . . . . routes/index.js . . . . . . . . . . . . . . . . . Menjalankan server Socket.io . . . . . . . . . Kode sumber di browser . . . . . . . . . . . . Bad curly braces placement - 1 . Good curly braces placement - 1 Bad curly braces placement - 2 . Good curly braces placement - 2 Good semicolon usage . . . . . . Comma rst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

B.1. Commit history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

Daftar Tabel

BAB

Pengenalan Cloud Computing dan Infrastruktur Pengembangan Aplikasi Berbasis Node.js

1.1. Apa itu Cloud Computing?


Cloud Computing, atau sering diterjemahkan sebagai Komputasi Awan dalam bahasa Indonesia mempunyai berbagai denisi: Wikipedia: penggunaan sumber daya komputasi (peranti keras dan peranti lunak) yang berfungsi untuk memberikan layanan melalui suatu jaringan (pada umumnya Internet)1 . NIST2 : model yang memungkinkan akses jaringan ubiquitous (dari mana saja), nyaman, on-demand (saat ada permintaan) ke sekumpulan sumber daya komputasi yang dikongurasi untuk berbagi (jaringan, server, penyimpanan, dan berbagai layanan lain) yang dapat dengan cepat ditetapkan dan dirilis dengan usaha yang minimal 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:

1 2

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

1.2. Karakteristik Cloud Computing

Gambar 1.1.: Model Cloud Computing On-demand self-service: layanan bisa diperoleh pada saat diminta, tanpa intervensi atau interaksi manusia di sisi penyedia jasa. Broad network access: tersedia melalui jaringan dengan berbagai peranti yang umum (komputer, tablet, HP, dan lain-lain) Resource pooling: sumber daya komputasi dari penyedia jasa terkumpul untuk melayani. Rapid elasticity: skalabilitas. Measured service: penggunaan sumber daya bisa diukur, di-monitor, dikendalikan, dan dilaporkan. Karakteristik lain yang tidak kalah penting adalah multitenancy. Multitenancy merupakan suatu prinsip dalam arsitektur software. Pada arsitektur tersebut, satu instan dari software berjalan pada server, melayani banyak organisasi klien. Aplikasi dirancang untuk mempartisi data dan kongurasinya secara virtual dan setiap organisasi klien tersebut

1.3. Public dan Private Cloud Computing bekerja dengan instan aplikasi virtual tersebut5 .

1.3. Public dan Private Cloud Computing


Cloud Computing bisa dibangun untuk keperluan pribadi suatu organisasi dan (secara legal) hanya bisa diakses oleh organisasi yang bersangkutan. Tipe tersebut dikenal dengan Private Cloud Computing. Sementara itu, jika sumber daya Cloud Computing bisa diakses oleh publik (dengan hak akses yang sesuai), maka model tersebut dikenal sebagai Public Cloud Computing. Pembahasan di buku ini adalah pembahasan tentang Public Cloud Computing dan semua referensi tentang Cloud Computing di buku ini akan menunjuk pada Public Cloud Computing kecuali dinyatakan lain.

1.4. Model Layanan Cloud Computing


Model layanan pada Cloud Computing akan berkembang sesuai kebutuhan konsumen serta inovasi dari berbagai penyedia layanan. Saat ini, pada umumnya, ada tiga model layanan: SaaS (Software as a Service): layanan berupa aplikasi yang ditempatkan pada infrastruktur penyedia layanan, siap digunakan oleh konsumen. PaaS (Platform as a Service): menyediakan layanan ke konsumen berupa platform untuk men-deploy aplikasi. IaaS (Infrastructure as a Service): menyediakan layanan ke konsumen berupa berbagai sumber daya komputasi (pemrosesam, penyimpanan, jaringan, dan sumber daya fundamental lainnya). Meski sampai saat ini, umumnya terdapat tiga model tersebut, beberapa model kelihatannya sudah mulai muncul, misalnya STaaS (Storage as a Service), SECaaS (Security as a Service), DaaS (Data as a Service), TEaaS (Test Environment as a Service), Desktop Virtualization, APIaaS (API as a Service).

1.5. Pengembangan Aplikasi di Cloud Computing


Pada umumnya, para pengembang aplikasi di Cloud Computing juga menggunakan pendekatan Agile Software Development yang berbasis pada pengembangan secara iteratif untuk setiap milestone (dalam iterasi analisis-desain-coding-testing-debugging) mulai dari milestone paling awal sampai software dirilis. Perbedaan paling mendasar hanyalah pada platform 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 keperluan ini. Pada dasarnya pengembangan aplikasi akan meliputi siklus berikut:
5

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

1.6. Node.js dan Cloud Computing Coding Test di komputer lokal

Upload ke server (dalam Cloud Computing, proses ini diistilahkan dengan push Edit - push Jika pengembangan aplikasi dilakukan oleh tim, maka perlu adanya software untuk version control, misalnya Git, mercurial, dan lain-lain. Setelah itu, aktivitas yang dilakukan 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 membuat aplikasi berbasis Cloud. Node.js dikembangkan dari engine JavaScript yang dibuat oleh Google untuk browser Chrome / Chromium (V8) ditambah dengan libUV serta beberapa pustaka internal lainnya. Dengan menggunakan Node.js, semua pengembangan akan dilakukan menggunakan JavaScript, baik pada sisi klien maupun server. Node.js dibuat pertama kali oleh Ryan Dahl (twitter.com/ryah) dan sampai saat ini dikembangkan oleh komunitas sebagai software bebas dengan pendanaan utama dari Joyent, perusahaan tempat Ryan Dahl bekerja.

1.7. Layanan Hosting Aplikasi: CloudFoundry


Saat ini, mulai banyak penyedia layanan Cloud yang mendukung Node.js, diantaranya adalah CloudFoundry (http://www.cloudfoundry.com, selanjutnya akan kita sebut dengan CF). Buku ini akan menggunakan fasilitas dari CF. Daftar lengkap dari penyedia 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: //mycloudfoundry.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 dikirimkan 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 / command line / command prompt. CLU untuk CF ini dibuat dengan menggunakan Ruby dan didistribusikan dalam bentuk gem sehingga untuk instalasi ini diperlukan ruby dan rubygem. Berikut adalah perintah untuk instalasi vmc (CLU dari CF).

1.7. Layanan Hosting Aplikasi: CloudFoundry

Gambar 1.2.: Pendaftaran di CF

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

$ gem s e a r c h vmc remote | g r e p " \bvmc\ s " vmc ( 0 . 3 . 2 1 ) $ gem i n s t a l l vmc F e t c h i n g : m u l t i _ j s o n 1 . 3 . 6 . gem (100%) F e t c h i n g : c f o u n d r y 0 . 3 . 3 4 . gem (100%) F e t c h i n g : vmc 0 . 3 . 2 1 . gem (100%) S u c c e s s f u l l y i n s t a l l e d multi_json 1.3.6 S u c c e s s f u l l y i n s t a l l e d cfoundry 0.3.34 S u c c e s s f u l l y i n s t a l l e d vmc 0 . 3 . 2 1 3 gems i n s t a l l e d I n s t a l l i n g r i documentation f o r m u l t i _ j s o n 1 . 3 . 6 . . . I n s t a l l i n g r i documentation f o r c f o u n d r y 0 . 3 . 3 4 . . . I n s t a l l i n g r i documentation f o r vmc 0 . 3 . 2 1 . . . I n s t a l l i n g RDoc documentation f o r m u l t i _ j s o n 1 . 3 . 6 . . . I n s t a l l i n g RDoc documentation f o r c f o u n d r y 0 . 3 . 3 4 . . . I n s t a l l i n g RDoc documentation f o r vmc 0 . 3 . 2 1 . . . $

Listing 1.1: Instalasi vmc Hasil dari instalasi tersebut adalah sebagai berikut:
1 2 3 4 5 $ gem l i s t LOCAL GEMS addressable (2.2.8)

1.7. Layanan Hosting Aplikasi: CloudFoundry

Gambar 1.3.: Hasil proses pendaftaran di CF

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

af ( 0 . 3 . 1 8 . 6 ) bigdecimal ( 1 . 1 . 0 ) cfoundry ( 0 . 3 . 3 4 ) interact (0.4.8) i o c o n s o l e ( 0 . 3 ) json ( 1 . 5 . 4 ) json_pure ( 1 . 6 . 7 ) mimet y p e s ( 1 . 1 9 ) minitest (2.5.1) multi_json ( 1 . 3 . 6 ) rake ( 0 . 9 . 2 . 2 ) rbr e a d l i n e ( 0 . 4 . 2 ) rdoc ( 3 . 9 . 4 ) r e s t c l i e n t ( 1 . 6 . 7 ) rubyzip ( 0 . 9 . 9 ) t e r m i n a l t a b l e ( 1 . 4 . 5 ) uuidtools (2.1.3) vmc ( 0 . 3 . 2 1 ) $

Listing 1.2: Hasil gem yang terinstall Setelah itu, tambahkan baris berikut di $HOME/.bashrc (catatan: "/home/bpdp/" adalah direktori $HOME saya, silahkan sesuaikan dengan tempat anda):
1 export PATH =$PATH: / home/bpdp / . gem/ ruby / 1 . 9 . 1 / b i n

Listing 1.3: Mengaktifkan direktori "bin" hasil instalasi gem Periksa dengan menjalankan opsi help dari vmc:

1.7. Layanan Hosting Aplikasi: CloudFoundry

Gambar 1.4.: E-mail persetujuan dan pemberitahuan credentials

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

$ vmc h e l p Usage : vmc [ o p t i o n s ] command [< a r g s >] [ command_options ] Try vmc h e l p [command] o r vmc h e l p o p t i o n s f o r more i n f o r m a t i o n . C u r r e n t l y a v a i l a b l e vmc commands a r e : Getting Started target [ url ] login [ e m a i l ] [e m a i l , passwd ] info Applications apps Application Creation push [ appname ] push [ appname ] path push [ appname ] u r l push [ appname ] i n s t a n c e s <N > push [ appname ] mem M push [ appname ] r u n t i m e RUNTIME push [ appname ] debug [MODE]

R e p o r t s c u r r e n t t a r g e t o r s e t s a new t a r g e t Login System and a c c o u n t i n f o r m a t i o n

L i s t deployed a p p l i c a t i o n s

Create , push , map , and s t a r t a new a p p l i c a t i o n Push a p p l i c a t i o n from s p e c i f i e d path Set the u r l for the a p p l i c a t i o n S e t t h e e x p e c t e d number <N o f i n s t a n c e s > S e t t h e memory r e s e r v a t i o n f o r t h e a p p l i c a t i o n Set the runtime to use for the a p p l i c a t i o n Push a p p l i c a t i o n and s t a r t i n a debug mode

1.7. Layanan Hosting Aplikasi: CloudFoundry


push [ appname ] nos t a r t Application Operations s t a r t <appname> [debug [MODE] ] s t o p <appname> r e s t a r t <appname> [debug [MODE] ] d e l e t e <appname> A p p l i c a t i o n Updates update <appname> [path ,debug [MODE] ] mem <appname> [ memsize ] map <appname> <u r l > unmap <appname> <u r l > i n s t a n c e s <appname> <num | d e l t a > Application Information c r a s h e s <appname> c r a s h l o g s <appname> l o g s <appname> [ a l l ] f i l e s <appname> [ path ] [ a l l ] s t a t s <appname> i n s t a n c e s <appname> A p p l i c a t i o n Environment env <appname> envadd <appname> <v a r i a b l e [ = ] v a l u e > envd e l <appname> <v a r i a b l e > Services services c r e a t e s e r v i c e <s e r v i c e > [name,bind ] c r e a t e s e r v i c e <s e r v i c e > <name> c r e a t e s e r v i c e <s e r v i c e > <name> <app> d e l e t e s e r v i c e [ s e r v i c e n a m e ] binds e r v i c e <s e r v i c e n a m e > <appname> unbinds e r v i c e <s e r v i c e n a m e > <appname> c l o n e s e r v i c e s <s r c app> <d e s t app> t u n n e l <s e r v i c e n a m e > [ p o r t ] t u n n e l <s e r v i c e n a m e > <c l i e n t c m d >

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

Do not autos t a r t t h e a p p l i c a t i o n

Start the a p p l i c a t i o n Stop t h e a p p l i c a t i o n Restart the a p p l i c a t i o n Delete the a p p l i c a t i o n

Update t h e a p p l i c a t i o n b i t s Update t h e memory r e s e r v a t i o n f o r an a p p l i c a t i o n R e g i s t e r the a p p l i c a t i o n to the u r l U n r e g i s t e r t h e a p p l i c a t i o n from t h e u r l S c a l e t h e a p p l i c a t i o n i n s t a n c e s up o r down

List recent application crashes Display l o g information for crashed a p p l i c a t i o n s Display l o g information for the a p p l i c a t i o n D i s p l a y d i r e c t o r y l i s t i n g o r f i l e download f o r [ path ] Display r e s o u r c e usage for the a p p l i c a t i o n List application instances

L i s t a p p l i c a t i o n e n vi r o nm e n t v a r i a b l e s Add an e nv i r o nm e n t v a r i a b l e t o an a p p l i c a t i o n D e l e t e an e n v ir o n me n t v a r i a b l e t o an a p p l i c a t i o n

L i s t s o f s e r v i c e s a v a i l a b l e and p r o v i s i o n e d Create a p r o v i s i o n e d s e r v i c e C r e a t e a p r o v i s i o n e d s e r v i c e and a s s i g n i t <name> C r e a t e a p r o v i s i o n e d s e r v i c e and a s s i g n i t <name>, and bind t o <app> Delete a provisioned s e r v i c e Bind a s e r v i c e t o an a p p l i c a t i o n Unbind s e r v i c e from t h e a p p l i c a t i o n Clone s e r v i c e b i n d i n g s from <s r c app> a p p l i c a t i o n t o <d e s t app> Create a local tunnel to a s e r v i c e C r e a t e a l o c a l t u n n e l t o a s e r v i c e and s t a r t a local c l i e n t

Administration user passwd logout addu s e r [e m a i l , passwd ] d e l e t e u s e r <u s e r >

Display user account information Change t h e password f o r t h e c u r r e n t u s e r Logs c u r r e n t u s e r out o f t h e t a r g e t system R e g i s t e r a new u s e r ( r e q u i r e s admin p r i v i l e g e s ) D e l e t e a u s e r and a l l apps and s e r v i c e s ( r e q u i r e s admin p r i v i l e g e s )

System runtimes frameworks

Display the supported runtimes of the t a r g e t system D i s p l a y t h e r e c o g n i z e d frameworks o f t h e t a r g e t system

Micro Cloud Foundry micro s t a t u s micro o f f l i n e micro o n l i n e

D i s p l a y Micro Cloud Foundry VM s t a t u s C o n f i g u r e Micro Cloud Foundry VM f o r o f f l i n e mode C o n f i g u r e Micro Cloud Foundry VM f o r o n l i n e mode

1.7. Layanan Hosting Aplikasi: CloudFoundry

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

[vmx f i l e ] [vmrun e x e c u t a b l e ] [password c l e a r t e x t ] [ s a v e ] Misc aliases a l i a s <a l i a s [ = ]command > unalias <a l i a s > targets

Path t o micro . vmx Path t o vmrun e x e c u t a b l e C l e a r t e x t password f o r g u e s t VM vcap u s e r Save c l e a r t e x t password i n ~ / . vmc_micro

List aliases C r e a t e an a l i a s f o r a command Remove an a l i a s L i s t known t a r g e t s and a s s o c i a t e d a u t h o r i z a t i o n tokens

Help h e l p [command] help options $

Get g e n e r a l h e l p o r h e l p on a s p e c i f i c command Get h e l p on a v a i l a b l e o p t i o n s

Listing 1.4: Hasil opsi help dari vmc

1.7.3. Kongurasi di Server Cloud


Pada dasarnya, yang diperlukan hanyalah mengubah target ke server cloud dari CF dan kemudian mengubah password.
1 2 3 4 5 6 7 8 9 10 11 12 $ vmc t a r g e t [ h t t p : / / a p i . vcap . me ] $ vmc t a r g e t a p i . c l o u d f o u n d r y . com S u c c e s s f u l l y t a r g e t e d t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] $ vmc t a r g e t [ h t t p : / / a p i . c l o u d f o u n d r y . com ] $

Listing 1.5: Mengubah target server Setelah itu, setiap kali kita akan melakukan berbagai proses yang melibatkan server ini, kita harus melakukan proses login terlebih dahulu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ vmc l o g i n Attempting l o g i n t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] Email : bambangpdp@yahoo . com Password : S u c c e s s f u l l y l o g g e d i n t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] $ vmc i n f o VMware s Cloud A p p l i c a t i o n P l a t f o r m For s u p p o r t v i s i t h t t p : / / s u p p o r t . c l o u d f o u n d r y . com T arg et : Client : User : Usage : h t t p : / / a p i . c l o u d f o u n d r y . com ( v0 . 9 9 9 ) v0 . 3 . 2 1 bambangpdp@yahoo . com Memory ( 0B o f 2 . 0G t o t a l )

1.7. Layanan Hosting Aplikasi: CloudFoundry

10

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

S e r v i c e s ( 0 o f 16 t o t a l ) Apps ( 0 o f 20 t o t a l ) $ vmc r u n t i m e s ++++ | Name | Description | Version | ++++ | java | Java 6 | 1.6 | | java7 | Java 7 | 1.7 | | node | Node . j s | 0.4.12 | | node06 | Node . j s | 0.6.8 | | node08 | Node . j s | 0.8.2 | | ruby18 | Ruby 1 . 8 | 1.8.7 | | ruby19 | Ruby 1 . 9 | 1 . 9 . 2 p180 | ++++ $

Listing 1.6: Login ke server Untuk mengubah password:


1 2 3 4 5 6 7 8 $ vmc passwd Changing password f o r bambangpdp@yahoo . com New Password : V e r i f y Password : S u c c e s s f u l l y changed password $

Listing 1.7: Mengubah password server

1.7.4. Instalasi dan Kongurasi 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 dari Node.js dan jika kita menggunakan manajemen paket dari distro Linux, kita hanya bisa menginstall 1 versi saja. Sebagai contoh, di Arch Linux, paket Node.js bisa diinstrall dengan perintah pacman -S nodejs tetapi hanya pada versi resmi di repo Arch (saat buku ini ditulis - awal Oktober 2012), paket resmi dari Arch adalah 0.8.11. Langkah instalasi berikut ini adalah langkah untuk instalasi tanpa manajemen paket dari distro Linux. Ambil paket binary executable dari http://nodejs/download atau langsung ke http://nodejs.org/dist/. Versi yang digunakan disini adalah 0.8.11.
1 2 3 4 5 6 $ l s l a t o t a l 4320 drwxrxrx 2 bpdp u s e r s 4096 Oct drwxrxrx 22 bpdp u s e r s 4096 Oct rwrr 1 bpdp u s e r s 4406113 Oct $

3 06:08 . 3 16:17 . . 3 0 6 : 1 9 nodev0 . 8 . 1 1 l i n u x x86 . t a r . gz

Listing 1.8: Hasil dari download Node.js

1.8. Pengelolaan Aplikasi di Cloud Ekstrak ke direktori yang diinginkan:


1 2 3 4 5 6 7 8 9 10

11

$ t a r x z v f ~/ master / n o d e j s / nodev0 . 8 . 1 1 l i n u x x86 . t a r . gz $ l n s nodev0 . 8 . 1 1 l i n u x x86 n o d e j s $ l s l a .... .... drwxrxrx 6 bpdp u s e r s 4096 Aug 16 0 6 : 1 8 nodev0 . 8 . 1 1 l i n u x x86 lrwxrwxrwx 1 bpdp u s e r s 21 Aug 17 0 6 : 3 7 n o d e j s > nodev0 . 8 . 1 1 l i n u x x86 .... .... $

Listing 1.9: Ekstraksi Node.js Kongurasi variabel lingkungan. Sebaiknya disimpan pada suatu le (pada buku ini, kongurasi akan disimpan di $HOME/environment/nodejs):
1 2 3 4 5 6 7 8 9 10 11 12 13 NODEJS_HOME=/home/bpdp/ s o f t w a r e / n o d e j s PATH =$PATH :$NODEJS_HOME/ b i n MANPATH $MANPATH:$NODEJS_HOME/ s h a r e /man = LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NODEJS_HOME/ l i b C_INCLUDE_PATH=$C_INCLUDE_PATH:$NODEJS_HOME/ i n c l u d e CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$NODEJS_HOME/ i n c l u d e export export export export export PATH MANPATH LD_LIBRARY_PATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH

Listing 1.10: Kongurasi variabel lingkungan Node.js Setiap akan menggunakan Node.js, yang diperlukan adalah men-source le kongurasi tersebut: source /environment/nodejs.

1.8. Pengelolaan Aplikasi di Cloud


Aplikasi yang dibuat nantinya akan di-deploy ke server CF. Pada umumnya, developer akan melakukan proses untuk upload (push), menghapus (delete), serta memperbaharui (update) aplikasi di server.

1.8.1. Push, Delete, Update Aplikasi


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

1.8.2. Menggunakan Framework ExpressJS

1.8. Pengelolaan Aplikasi di Cloud

12

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

[ bpdp@bpdpa r c h modul 1] $ mkdir h e l l o [ bpdp@bpdpa r c h modul 1] $ cd h e l l o / [ bpdp@bpdpa r c h h e l l o ] $ source ~/ en v i r on m e nt / n o d e j s [ bpdp@bpdpa r c h h e l l o ] $ npm i n s t a l l e x p r e s s npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / e x p r e s s npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / e x p r e s s npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / e x p r e s s // e x p r e s s 3 . 0 . 0 r c 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / e x p r e s s // e x p r e s s 3 . 0 . 0 r c 4 . t g z npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c o n n e c t / 2 . 4 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / send / 0 . 0 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g /commander / 0 . 6 . 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / rangep a r s e r / 0 . 0 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c r c / 0 . 2 . 0 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / mkdirp / 0 . 3 . 3 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / f r e s h / 0 . 1 . 0 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / methods / 0 . 0 . 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / debug npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c o o k i e / 0 . 0 . 4 npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c r c / 0 . 2 . 0 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c r c // c r c 0 . 2 . 0 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / rangep a r s e r / 0 . 0 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / rangep a r s e r //rangep a r s e r 0 . 0 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g /commander / 0 . 6 . 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g /commander//commander 0 . 6 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c o n n e c t / 2 . 4 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c o n n e c t // c o n n e c t 2 . 4 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / send / 0 . 0 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / send //send 0 . 0 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / mkdirp / 0 . 3 . 3 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / mkdirp//mkdirp 0 . 3 . 3 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / f r e s h / 0 . 1 . 0 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / f r e s h // f r e s h 0 . 1 . 0 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / methods / 0 . 0 . 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / methods//methods 0 . 0 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c o o k i e / 0 . 0 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c o o k i e // c o o k i e 0 . 0 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c r c // c r c 0 . 2 . 0 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / rangep a r s e r //rangep a r s e r 0 . 0 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / debug npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g /commander//commander 0 . 6 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c o n n e c t // c o n n e c t 2 . 4 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / send //send 0 . 0 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / mkdirp//mkdirp 0 . 3 . 3 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / f r e s h // f r e s h 0 . 1 . 0 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / methods//methods 0 . 0 . 1 . t g z npm WARN package . j s o n methods@0 . 0 . 1 No README. md f i l e found ! npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c o o k i e // c o o k i e 0 . 0 . 4 . t g z npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g /mime / 1 . 2 . 6 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / qs / 0 . 4 . 2 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / b y t e s / 0 . 1 . 0 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / f o r m i d a b l e / 1 . 0 . 1 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / pause / 0 . 0 . 1 npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / qs / 0 . 4 . 2 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / qs //qs 0 . 4 . 2 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g /mime / 1 . 2 . 6 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g /mime//mime 1 . 2 . 6 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / pause / 0 . 0 . 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / pause //pause 0 . 0 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / f o r m i d a b l e / 1 . 0 . 1 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / f o r m i d a b l e // f o r m i d a b l e 1 . 0 . 1 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / b y t e s / 0 . 1 . 0

1.8. Pengelolaan Aplikasi di Cloud


npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / b y t e s // b y t e s 0 . 1 . 0 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g /mime//mime 1 . 2 . 6 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / qs //qs 0 . 4 . 2 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / pause //pause 0 . 0 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / f o r m i d a b l e // f o r m i d a b l e 1 . 0 . 1 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / b y t e s // b y t e s 0 . 1 . 0 . t g z e x p r e s s @ 3 . 0 . 0 r c 4 node_modules / e x p r e s s methods@0 . 0 . 1 fresh@0 . 1 . 0 rangep a r s e r @ 0 . 0 . 4 cookie@0 . 0 . 4 crc@0 . 2 . 0 commander@0 . 6 . 1 debug@0 . 7 . 0 mkdirp@0 . 3 . 3 send@0 . 0 . 4 ( mime@1 . 2 . 6 ) connect@2 . 4 . 4 ( pause@0 . 0 . 1 , bytes@0 . 1 . 0 , qs@0 . 4 . 2 , f o r m i d a b l e @ 1 . 0 . 1 1 ) [ bpdp@bpdpa r c h h e l l o ] $ l s l a t o t a l 12 drwxrxrx 3 bpdp u s e r s 4096 Sep 25 2 2 : 3 1 . drwxrxrx 3 bpdp u s e r s 4096 Sep 25 2 2 : 3 1 . . drwxrxrx 4 bpdp u s e r s 4096 Sep 25 2 2 : 3 1 node_modules

13

62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

Listing 1.11: Instalasi ExpressJS menggunakan npm Aplikasi yang dibuat terdiri atas package.json untuk mendenisikan aplikasi serta dependensi-nya dan app.js yang merupakan le utama untuk dijalankan pada server.
1 2 3 4 5 6 7 { " name " : " hello - node " , " version " : " 0.0.1 " , " dependencies " : { " express " : " " } }

Listing 1.12: package.json untuk ExpressJS


1 2 3 4 5 var app = r e q u i r e ( express ) . c r e a t e S e r v e r ( ) ; app . g e t ( / , function ( req , r e s ) { r e s . send ( Hello from Cloud Foundry ) ; }); app . l i s t e n ( 3 0 0 0 ) ;

Listing 1.13: app.js untuk ExpressJS Proses deployment digambarkan sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 $ vmc t a r g e t a p i . c l o u d f o u n d r y . com S u c c e s s f u l l y t a r g e t e d t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] $ vmc l o g i n Attempting l o g i n t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] Email : bambangpdp@yahoo . com Password : S u c c e s s f u l l y l o g g e d i n t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] $ vmc push Would you l i k e t o d e p l o y from t h e c u r r e n t d i r e c t o r y ? [ Yn ] : Y A p p l i c a t i o n Name : modul1h e l l o D e t e c t e d a Node . j s A p p l i c a t i o n , i s t h i s c o r r e c t ? [ Yn ] : Y

1.8. Pengelolaan Aplikasi di Cloud

14

Gambar 1.5.: Hasil push ke server


14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 A p p l i c a t i o n Deployed URL [ modul1h e l l o . c l o u d f o u n d r y . com ] : Memory r e s e r v a t i o n ( 1 2 8M, 256M, 512M, 1G, 2G) [ 6 4M] : How many i n s t a n c e s ? [ 1 ] : C r e a t e s e r v i c e s t o bind t o modul1h e l l o ? [ yN ] : Would you l i k e t o s a v e t h i s c o n f i g u r a t i o n ? [ yN ] : N C r e a t i n g A p p l i c a t i o n : OK Uploading A p p l i c a t i o n : Checking f o r a v a i l a b l e r e s o u r c e s : OK P r o c e s s i n g r e s o u r c e s : OK Packing a p p l i c a t i o n : OK Uploading ( 4 1K) : OK Push S t a t u s : OK S t a g i n g A p p l i c a t i o n modul1h e l l o : OK S t a r t i n g A p p l i c a t i o n modul1h e l l o : OK $

Listing 1.14: Deployment aplikasi ExpressJS ke CF Hasilnya terlihat pada tampilan browser di Gambar 1.5 Aplikasi yang sudah dibuat seringkali diubah, oleh karena itu vmc juga menyediakan fasilitas untuk Mengupdate aplikasi.
1 2 3 4 5 6 7 8 var e x p r e s s = r e q u i r e ( " express " ) ; var app = e x p r e s s ( ) ; app . g e t ( / , function ( req , r e s ) { r e s . send ( Hello from Cloud Foundry with NodeJS + p r o c e s s . v e r s i o n ) ; }); app . l i s t e n ( 3 0 0 0 ) ; $

Listing 1.15: Update: menambahkan versi Node.js ke app.js


1 2 3 4 5 6 7 8 9 10 11 12 $ vmc update modul1h e l l o Uploading A p p l i c a t i o n : Checking f o r a v a i l a b l e r e s o u r c e s : OK P r o c e s s i n g r e s o u r c e s : OK Packing a p p l i c a t i o n : OK Uploading ( 1 5K) : OK Push S t a t u s : OK S t o p p i n g A p p l i c a t i o n modul1h e l l o : OK S t a g i n g A p p l i c a t i o n modul1h e l l o : OK S t a r t i n g A p p l i c a t i o n modul1h e l l o : OK $

Listing 1.16: Mengupdate aplikasi di server Hasilnya bisa dilihat di Gambar 1.6

1.8. Pengelolaan Aplikasi di Cloud

15

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

Gambar 1.7.: Deployement menggunakan versi runtime tertentu Untuk menghapus aplikasi:
1 2 3 4 $ vmc d e l e t e modul1h e l l o D e l e t i n g a p p l i c a t i o n [ modul1h e l l o ] : OK $

Listing 1.17: Menghapus aplikasi yang di-deploy di CF Pada saat deployment, kita juga bisa memilih versi Node.js (runtime) sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [ bpdp@bpdpa r c h h e l l o ] $ vmc push r u n t i m e=node08 Would you l i k e t o d e p l o y from t h e c u r r e n t d i r e c t o r y ? [ Yn ] : Y A p p l i c a t i o n Name : bpdpm1h e l l o D e t e c t e d a Node . j s A p p l i c a t i o n , i s t h i s c o r r e c t ? [ Yn ] : Y A p p l i c a t i o n Deployed URL [ bpdpm1h e l l o . c l o u d f o u n d r y . com ] : Memory r e s e r v a t i o n ( 1 2 8M, 256M, 512M, 1G, 2G) [ 6 4M] : How many i n s t a n c e s ? [ 1 ] : C r e a t e s e r v i c e s t o bind t o bpdpm1h e l l o ? [ yN ] : N Would you l i k e t o s a v e t h i s c o n f i g u r a t i o n ? [ yN ] : N C r e a t i n g A p p l i c a t i o n : OK Uploading A p p l i c a t i o n : Checking f o r a v a i l a b l e r e s o u r c e s : OK P r o c e s s i n g r e s o u r c e s : OK Packing a p p l i c a t i o n : OK Uploading ( 1 5K) : OK Push S t a t u s : OK S t a g i n g A p p l i c a t i o n bpdpm1h e l l o : OK S t a r t i n g A p p l i c a t i o n bpdpm1h e l l o : OK $

Listing 1.18: Deployment ke CF dengan memilih runtime Node.js Hasilnya bisa dilihat di Gambar 1.7

1.8.3. Tanpa Framework


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

1.8. Pengelolaan Aplikasi di Cloud

16

Gambar 1.8.: Hasil deployement app.js tanpa framework

1 2 3 4 5 6 7 8 9 10 11 12 13 14

var h t t p = r e q u i r e ( http ) ; var u r l = r e q u i r e ( " url " ) ; h t t p . c r e a t e S e r v e r ( function ( req , r e s ) { var pathname = u r l . p a r s e ( r e q . u r l ) . pathname ; res res res res . writeHead ( 2 0 0 , { Content - Type : text / html } ) ; . w r i t e ( " Hello NodeJS <u > " + p r o c e s s . v e r s i o n + " </u > " ) ; . w r i t e ( " < br / > Request for <b > " + pathname + " </b > received . " ) ; . end ( ) ;

}). listen (1337);

Listing 1.19: app.js tanpa framework Proses deployement adalah sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ vmc push r u n t i m e=node08 Would you l i k e t o d e p l o y from t h e c u r r e n t d i r e c t o r y ? [ Yn ] : Y A p p l i c a t i o n Name : bpdpm1h e l l o n o f r a m e w o r k D e t e c t e d a Node . j s A p p l i c a t i o n , i s t h i s c o r r e c t ? [ Yn ] : Y A p p l i c a t i o n Deployed URL [ bpdpm1h e l l o n o f r a m e w o r k . c l o u d f o u n d r y . com ] : Memory r e s e r v a t i o n ( 1 2 8M, 256M, 512M, 1G, 2G) [ 6 4M] : How many i n s t a n c e s ? [ 1 ] : C r e a t e s e r v i c e s t o bind t o bpdpm1h e l l o n o f r a m e w o r k ? [ yN ] : N Would you l i k e t o s a v e t h i s c o n f i g u r a t i o n ? [ yN ] : N C r e a t i n g A p p l i c a t i o n : OK Uploading A p p l i c a t i o n : Checking f o r a v a i l a b l e r e s o u r c e s : OK Packing a p p l i c a t i o n : OK Uploading ( 0K) : OK Push S t a t u s : OK S t a g i n g A p p l i c a t i o n bpdpm1h e l l o n o f r a m e w o r k : OK S t a r t i n g A p p l i c a t i o n bpdpm1h e l l o n o f r a m e w o r k : OK $

Listing 1.20: Deployment app.js tanpa framework Hasilnya bisa dilihat pada Gambar 1.8

BAB

REPL dan Dasar-dasar JavaScript di Node.js

2.1. REPL
REPL adalah lingkungan pemrograman interaktif, tempat developer bisa mengetikkan program per baris dan langsung mengeksekusi hasilnya. Biasanya ini digunakan untuk menguji perintah-perintah yang cukup dijalankan pada satu baris atau satu blok segmen kode sumber saja. Karena fungsinya itu, maka istilah yang digunakan adalah REPL (read-eval-print-loop), yaitu loop atau perulangan baca perintah - evaluasi perintah - tampilkan hasil. REPL sering juga disebut sebagai interactive top level atau language shell. Tradisi ini sudah dimulai sejak jaman LISP di mesin UNIX di era awal pengembangan development tools. Saat ini hampir semua interpreter/compiler mempunyai REPL, misalnya Python, Ruby, Scala, PHP, berbagai interpreter/compiler LISP, dan tidak ketinggalan Node.js.

2.1.1. Mengaktifkan REPL


Untuk mengaktifkan REPL dari Node.js, executable command line program-nya adalah node. Jika node dipanggil dengan argumen nama le JavaScript, maka le JavaScript tersebut akan dieksekusi, sementara jika tanpa argumen, akan masuke ke REPL:
1 2 3 4 5 6 7 8 9 $ node > . help . break . clear . exit . help . load . save >

Sometimes you g e t s t u c k , t h i s g e t s you out A l i a s f o r . break Exit the r e p l Show r e p l o p t i o n s Load JS from a f i l e i n t o t h e REPL s e s s i o n Save a l l e v a l u a t e d commands i n t h i s REPL s e s s i o n t o a f i l e

Listing 2.1: Node.js REPL

17

2.1. REPL

18

Tanda > adalah tanda bahwa REPL Node.js siap untuk menerima perintah. Untuk melihat perintah-perintah REPL, bisa digunakan .help.

2.1.2. Perintah-perintah REPL


Pada sesi REPL, kita bisa memberikan perintah internal REPL maupun perintah-perintah lain yang sesuai dan dikenali sebagai perintah JavaScript. Perintah internal REPL Node.js terdiri atas: .break: keluar dan melepaskan diri dari "keruwetan" baris perintah di REPL. .clear: alias untuk .break .exit: keluar dari sesi REPL (bisa juga dengan menggunakan Ctrl-D) .help: menampilkan pertolong perintah internal REPL .load: membaca dan mengeksekusi perintah-perintah JavaScript yang terdapat pada suatu le. .save: menyimpan sesi REPL ke dalam suatu le. Contoh untuk .load:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 > . l o a d /home/bpdp/ k e r j a a n / s r c / j a v a s c r i p t / n o d e j s / s e r v e r . j s > var h t t p = r e q u i r e ( http ) ; undefined > h t t p . c r e a t e S e r v e r ( function ( req , r e s ) { ... r e s . writeHead ( 2 0 0 , { Content - Type : text / plain } ) ; ... r e s . end ( Hello , world !\ n ) ; . . . } ) . l i s t e n ( 8 1 2 4 , " 127.0.0.1 " ) ; { _connections : 0 , connections : [ Getter / S e t t e r ] , a l l o w H a l f O p e n : true , _handle : null , _events : { r e q u e s t : [ Function ] , c o n n e c t i o n : [ Function : c o n n e c t i o n L i s t e n e r ] } , httpAllowHalfOpen : f a l s e } > c o n s o l e . l o g ( Server running at http : / / 1 2 7 . 0 . 0 . 1 : 8 1 2 4 / ) ; S e r v e r r u n n i n g a t h t t p : // 1 27 . 0. 0 .1 :8 1 24 / undefined >

Listing 2.2: Contoh penggunaan .load dalam REPL Setelah keluar dari sesi REPL, maka port akan ditutup dan hasil eksekusi di atas akan dibatalkan. Untuk menyimpan hasil sesi REPL menggunakan .save, jika tanpa menyebutkan direktori, maka akan disimpan di direktori aktif saat itu. Contoh:
1 2 3 4 5 $ node > c o n s o l e . l o g ( " Selamat datang di Node . js " ) Selamat datang d i Node . j s undefined > . s a v e /home/bpdp/ k e r j a a n / s r c / j a v a s c r i p t / n o d e j s / h e l l o . j s

2.2. Dasar-dasar JavaScript di Node.js

19

6 7 8

S e s s i o n s a v e d t o : / home/bpdp/ k e r j a a n / s r c / j a v a s c r i p t / n o d e j s / h e l l o . j s > [ bpdp@bpdpa r c h ~ ] $ cat /home/bpdp/ k e r j a a n / s r c / j a v a s c r i p t / n o d e j s / h e l l o . j s c o n s o l e . l o g ( " Selamat datang di Node . js " )

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 bahasa pemrograman JavaScript. Spesikasi JavaScript yang diimplementasikan merupakan spesikasi resmi dari ECMAScript serta CommonJS (http://commonjs.org). Dengan demikian, jika anda sudah pernah mempelajari JavaScript sebelumnya, tata bahasa dari perintah 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, seringkali kita perlu melakukan simulasi pertanyaan - proses - keluaran jawaban. Proses akan kita pelajari seiring dengan materi-materi berikutnya, sementara untuk keluaran, kita bisa menggunakan console.log. Bagian ini akan menjelaskan sedikit tentang masukan. Perintah untuk memberi masukan di Node.js sudah tersedia pada pustaka API Readline 1 . Pola dari masukan ini adalah sebagai berikut: me-require pustaka Readline membuat interface untuk masukan dan keluaran .. gunakan interface .. .. gunakan interface .. .. gunakan interface .. .. gunakan interface .. .. .. tutup interface Implementasi dari pola diatas bisa dilihat pada kode sumber berikut ini (diambil dari manual Node.js):

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

2.2. Dasar-dasar JavaScript di Node.js

20

1 2 3 4 5 6 7 8 9 10 11 12

var r e a d l i n e = r e q u i r e ( readline ) ; var r l = r e a d l i n e . c r e a t e I n t e r f a c e ( { input : process . stdin , o ut pu t : p r o c e s s . s t d o u t }); r l . q u e s t i o n ( " What do you think of node . js ? " , function ( answer ) { c o n s o l e . l o g ( " Thank you for your valuable feedback : " , answer ) ; rl . close (); });

Listing 2.4: readline.js: penggunaan pustaka Readline untuk masukan Hasilnya adalah sebagai berikut:
1 2 3 4 [ bpdp@bpdpa r c h modul 2] $ node r e a d l i n e . j s What do you t h i n k o f node . j s ? awesome ! Thank you f o r your v a l u a b l e f e e d b a c k : awesome ! [ bpdp@bpdpa r c h modul 2] $

Listing 2.5: Hasil eksekusi readline.js

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

2.2.2. Nilai/Value dan Tipe Data


Program dalam JavaScript akan berhubungan dengan data atau nilai. Setiap nilai mempunyai tipe tertentu. JavaScript mengenali berbagai tipe berikut ini: Angka: bulat (misalnya 4) atau pecahan (misalnya 3.75) Boolean: nilai benar (true) dan salah (false) String: diapit oleh tanda petik ganda ("contoh string") atau tunggal (contoh string) null undened JavaScript adalah bahasa pemrograman yang mengijinkan pemrogram untuk tidak mendenisikan tipe data pada saat deklarasi, atau sering juga disebut sebagai dynamically typed language:

2.2. Dasar-dasar JavaScript di Node.js

21

1 2 3

var jumlahMahasiswa = 30 c o n s o l e . l o g ( Jumlah mahasiswa dalam satu kelas = + jumlahMahasiswa ) ; // Jumlah mahasiswa dalam satu kelas = 30

Listing 2.6: Fitur dynamically typed language Pada contoh di atas, kita bisa melihat bahwa data akan dikonversi secara otomatis pada saat program dieksekusi.

Catatan: Khusus untuk operator "+", JavaScript akan melakukan penggabungan string (string concatenation), tetapi untuk operator lain, akan dilakukan operasi matematis sesuai operator tersebut (-,/,*). Konversi string ke tipe numerik bisa dilakukan dengan parseInt(string) (jika bilangan bulat) dan parseFloat(string) (jika bilangan pecahan).

2.2.3. Variabel
Variabel adalah suatu nama yang didenisikan untuk menampung suatu nilai. Nama ini akan digunakan sebagai referensi yang akan menunjukkan ke nilai yang ditampungnya. Nama variabel disebut dengan identier / pengenal. Ada beberapa syarat pemberian nama identier di JavaScript: Dimulai dengan huruf, underscore (_), atau tanda dollar ($). Karakter berikutnya bisa berupa angka, selain ketentuan pertama di atas. Membedakan huruf besar - kecil. Konvensi yang digunakan oleh pemrogram JavaScript terkait dengan penamaan ini adalah variasi 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-ubah setelah ditetapkan. Untuk menetapkan konstanta di JavaScript, digunakan kata kunci const. Contoh:
1 c o n s t DEFAULT\_MENU = Home ;

Listing 2.7: 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 (artinya berlaku juga untuk Node.js).

2.2. Dasar-dasar JavaScript di Node.js

22

2.2.5. Fungsi
Pengertian Fungsi Fungsi merupakan subprogram atau suatu bagian dari keseluruhan program yang ditujukan untuk mengerjakan suatu pekerjaan tertentu dan (biasanya) menghasilkan suatu nilai kembalian. Subprogram ini relatif independen terhadap bagian-bagian lain sehingga memenuhi kaidah "bisa-digunakan-kembali" atau reusable pada beberapa program yang memerlukan fungsionalitasnya. Fungsi dalam ilmu komputer sering kali juga disebut dengan prcedure, routine, atau method. Denisi Fungsi Denisi fungsi dari JavaScript di Node.js bisa dilakukan dengan sintaksis berikut ini:
1 2 3 4 5 6 7 8 function namaFungsi ( argumen1 , argumen2 , .. J a v a S c r i p t code . . J a v a S c r i p t code . . J a v a S c r i p t code . . J a v a S c r i p t code . . .. } ... , argumentN ) {

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

Listing 2.9: Pemanggilan Fungsi dalam JavaScript Contoh dalam program serta pemanggilannya adalah sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ node > function addX ( angka ) { . . . c o n s o l e . l o g ( angka + 1 0 ) ; ... } undefined > addX ( 2 0 ) ; 30 undefined > > function add2Numbers ( angka1 , angka2 ) { . . . return angka1 + angka2 ; ... } undefined > c o n s o l e . l o g ( " 232 + 432 = " + add2Numbers ( 2 3 2 , 4 3 2 ) ) ; 232 + 432 = 664 undefined >

Listing 2.10: Contoh deklarasi fungsi dan pemanggilannya

2.2. Dasar-dasar JavaScript di Node.js Fungsi Anonim

23

Fungsi anonim adalah fungsi tanpa nama, pemrogram tidak perlu memberikan nama ke fungsi. Biasanya fungsi anonimus ini hanya digunakan untuk fungsi yang dikerjakan pada suatu bagian program saja dan tidak dengan maksud untuk dijadikan komponen yang bisa dipakai di bagian lain dari program (biasanya untuk menangani event atau callback ). Untuk mendeklarasikan fungsi ini, digunakan literal function.
1 2 3 var pangkat = function ( angka ) { return angka angka } ; c o n s o l e . l o g ( pangkat ( 1 0 ) ) ; // output : 100

Listing 2.11: Fungsi anonim

Fungsi Rekursif Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri. Contoh dari aplikasi fungsi rekursif adalah pada penghitungan faktorial berikut:
1 2 3 4 5 6 function f a c t o r i a l ( n ) { i f ( ( n == 0 ) | | ( n == 1 ) ) return 1 ; else return ( n f a c t o r i a l ( n 1 ) ) ; }

Listing 2.12: Fungsi rekursif untuk menghitung faktorial

Fungsi di dalam Fungsi / Nested Functions Saat mendenisikan fungsi, di dalam fungsi tersebut pemrogram bisa mendenisikan fungsi lainnya. Meskipun demikian, fungsi yang terletak dalam suatu denisi fungsi tidak bisa diakses dari luar fungsi tersebut dan hanya tersedia untuk fungsi yang didenisikan.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 function induk ( ) { var awal = 0 ; function tambahkan ( ) { awal++; } tambahkan ( ) ; tambahkan ( ) ; c o n s o l e . l o g ( Nilai = + awal ) ; } induk ( ) ; tambahkan ( ) ; // // // // // // // // Hasil : Nilai = 2 / home / bpdp / kerjaan / git - repos / buku - cloud - nodejs / src / modul -2/ nested . js :12 tambahkan (); ^ Ref erence Error : tambahkan is not defined at Object . < anonymous > (/ home / bpdp / kerjaan / git - repos / buku - cloud - nodejs /

2.2. Dasar-dasar JavaScript di Node.js

24

22 23 24 25 26 27 28 29

// // // // // // // //

at at at at at at

src / modul -2/ nested . js :12:1) Module . _compile ( module . js :449:26) Object . Module . _extensions .. js ( module . js :467:10) Module . load ( module . js :356:32) Function . Module . _load ( module . js :312:12) Module . runMain ( module . js :492:10) process . startup . pr o ce ss N ex t Ti ck . process . _tickCallback ( node . js :244:9)

Listing 2.13: Fungsi di dalam Fungsi

2.2.6. Literal
Literal digunakan untuk merepresentasikan nilai dalam JavaScript. Ada beberapa tipe literal. Literal Array Array atau variabel berindeks adalah penampung untuk obyek yang menyerupai list atau daftar. Obyek array juga menyediakan berbagai fungsi dan metode untuk mengolah anggota yang terdapat dalam daftar tersebut (terutama untuk operasi traversal dan permutasi. Listing berikut menunjukkan beberapa operasi untuk literal array.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var arrMembers = [ one , two , , three , ] ; // sengaja ada koma di bagian akhir c o n s o l e . l o g ( arrMembers [ 0 ] ) ; // hasil : one c o n s o l e . l o g ( arrMembers [ 2 ] ) ; // hasil : undefined c o n s o l e . l o g ( arrMembers [ 3 ] ) ; // hasil : three c o n s o l e . l o g ( arrMembers [ 4 ] ) ; // hasil : undefined - karena tidak ada c o n s o l e . l o g ( arrMembers . l e n g t h ) ; // hasil : 4 var m u l t i A r r a y = [ [ 0 -0 , 0 -1 , 0 -2 ] , [ 1 -0 , 1 -1 , 1 -2 ] , [ 2 -0 , 2 -1 , 2 -2 ] ] ; c o n s o l e . log ( multiArray [ 0 ] [ 2 ] ) ; // hasil : 0 -2 c o n s o l e . log ( multiArray [ 1 ] [ 2 ] ) ; // hasil : 1 -2

Listing 2.14: 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 bulangan bulat dalam JavaScript bisa dalam bentuk:

2.2. Dasar-dasar JavaScript di Node.js decimal (basis 10): digit tanpa awalan nol. octal (basis 8): digit diawali dengan 1 angka nol.2 hexadecimal (basis 16): digit diawali dengan 0x. Literal Floating-point

25

Literal ini digunakan untuk mengekspresikan nilai bilangan pecahan, misalnya 0.4343 atau bisa juga menggunakan E/e (nilai eksponensial), misalnya -3.1E12. Literal Obyek Literal ini akan dibahas di bab yang menjelaskan tentang paradigma pemrograman berorientasi obyek di JavaScript. Literal String Literal string mengekspresikan suatu nilai dalam bentuk sederetan karakter dan berada dalam tanda petik (ganda/ maupun tunggal/). Contoh: Kembali ke halaman utama Lisensi Hari ini, Jumat, tanggal 21 November 1234.543 baris pertama \n baris kedua Contoh terakhir di atas menggunakan karakter khusus (\n). Beberapa karakter khusus lainnya adalah: \b: Backspace \f: Form feed \n: New line \r: Carriage return \t: Tab \v: Vertical tab \: Apostrophe atau single quote \": Double quote
2

pada ECMA-262, bilangan octal ini sudah tidak digunakan lagi.

2.2. Dasar-dasar JavaScript di Node.js \\: Backslash (\).

26

\XXX: Karakter dengan pengkodean Latin-1 dengan tiga digit octal antara 0 and 377. (misal, \251 adalah simbol hak cipta). \xXX: seperti di atas, tetapi hexadecimal (2 digit). \uXXXX: Karakter Unicode dengan 3 digit karakter hexadecimal. Backslash sendiri sering digunakan sebagai escape character, misalnya NaN sering disebut juga sebagai \Not a Number\.

2.2.7. Struktur Data dan Representasi JSON


JSON (JavaScript Object Notation) adalah subset dari JavaScript dan merupakan struktur data native di JavaScript. Bentuk dari representasi struktur data JSON adalah sebagai berikut3 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 { " firstName " : " John " , " lastName " : " Smith " , " age " : 2 5 , " address " : { " streetAddress " : " 21 2 nd Street " , " city " : " New York " , " state " : " NY " , " postalCode " : " 10021 " }, " phoneNumber " : [ { " type " : " home " , " number " : " 212 555 -1234 " }, { " type " : " fax " , " number " : " 646 555 -4567 " } ] }

Listing 2.15: Representasi JSON Dari representasi di atas, kita bisa membaca: Nilai data rstname adalah John Data address terdiri atas sub data streetAddress, city, state, dan postalCode yang masing-masing mempunyai nilai data sendiri-sendiri. dan seterusnya

http://en.wikipedia.org/wiki/JSON

2.2. Dasar-dasar JavaScript di Node.js

27

2.2.8. Aliran Kendali


Alur program dikendalikan melalui pernyataan-pernyataan untuk aliran kendali. Ada beberapa pernyataan aliran kendali yang akan dibahas. Pernyataan Kondisi if .. else if .. else Pernyataan ini digunakan untuk mengerjakan atau tidak mengerjakan suatu bagian atau blok program berdasarkan hasil evaluasi kondisi tertentu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 var k o n d i s i = f a l s e ; if ( kondisi ) { c o n s o l e . l o g ( hanya dikerjakan jika kondisi bernilai benar / true ) ; }; // hasil : n /a , tidak ada hasilnya var k o n d i s i = true ; if ( kondisi ) { c o n s o l e . l o g ( hanya dikerjakan jika kondisi bernilai benar / true ) ; }; // hasil : hanya dikerjakan jika kondisi bernilai benar / true // // Contoh berikut lebih kompleks , melibatkan input var r e a d l i n e = r e q u i r e ( readline ) ; var r l = r e a d l i n e . c r e a t e I n t e r f a c e ( { input : process . stdin , ou tp ut : p r o c e s s . s t d o u t }); r l . q u e s t i o n ( " Masukkan angka nilai : " , function ( answer ) { i f ( answer > 8 0 ) { c o n s o l e . l o g ( " Nilai : A " ) ; } e l s e i f ( answer > 7 0 ) { c o n s o l e . l o g ( " Nilai : B " ) ; } e l s e i f ( answer > 4 0 ) { c o n s o l e . l o g ( " Nilai : C " ) ; } e l s e i f ( answer > 3 0 ) { c o n s o l e . l o g ( " Nilai : D " ) ; } else { c o n s o l e . l o g ( " Tidak lulus " ) ; } rl . close (); });

Listing 2.16: Pernyataan if .. else if .. else

Pernyataan switch Pernyataan ini digunakan untuk mengevaluasi suatu ekspresi dan membandingkan sama atau tidaknya dengan suatu label tertentu di dalam struktur pernyataan switch, serta mengeksekusi perintah-perintah sesuai dengan label yang cocok.
1 2 3 4 5 var r e a d l i n e = r e q u i r e ( readline ) ; var r l = r e a d l i n e . c r e a t e I n t e r f a c e ( { input : process . stdin , ou tp ut : p r o c e s s . s t d o u t

2.2. Dasar-dasar JavaScript di Node.js

28

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

}); c o n s o l e . l o g ( " Menu " ) ; c o n s o l e . l o g ( " ==== " ) ; c o n s o l e . l o g ( " 1. Mengisi data " ) ; c o n s o l e . l o g ( " 2. Mengedit data " ) ; c o n s o l e . l o g ( " 3. Menghapus data " ) ; c o n s o l e . l o g ( " 4. Mencari data " ) ; r l . q u e s t i o n ( " Masukkan angka pilihan anda : " , function ( answer ) { c o n s o l e . l o g ( " Pilihan anda : " + answer ) ; switch ( answer ) { case " 1 " : c o n s o l e . l o g ( " Anda memilih menu pengisian data " ) ; break ; case " 2 " : c o n s o l e . l o g ( " Anda memilih menu pengeditan data " ) ; break ; case " 3 " : c o n s o l e . l o g ( " Anda memilih menu penghapusan data " ) ; break ; case " 4 " : c o n s o l e . l o g ( " Anda memilih menu pencarian data " ) ; break ; default : c o n s o l e . l o g ( " Anda tidak memilih salah satu dari menu di atas " ) ; break ; } rl . close (); });

Listing 2.17: Pernyataan if .. else if .. else

Looping Looping atau sering juga disebut kalang adalah konstruksi program yang digunakan untuk melakukan suatu blok perintah secara berulang-ulang. for
1 2 3 4 5 6 7 8 9 10 11 12 13 f o r ( var i = 0 ; i < 9 ; i ++) { console . log ( i ) ; } // hasil : // 0 // 1 // 2 // 3 // 4 // 5 // 6 // 7 // 8

Listing 2.18: Pernyataan for Pernyataan for juga bisa digunakan untuk mengakses data yang tersimpam dalam struktur data JavaScript (JSON).
1 2 var data = { a : 1 , b : 2 , c : 3 } ;

2.2. Dasar-dasar JavaScript di Node.js

29

3 4 5 6 7 8 9

f o r ( var i t e r a s i in data ) { c o n s o l e . l o g ( " Nilai dari iterasi " + i t e r a s i + " adalah : " + data [ i t e r a s i ] ) ; } // hasil : // Nilai dari iterasi a adalah : 1 // Nilai dari iterasi b adalah : 2 // Nilai dari iterasi c adalah : 3

Listing 2.19: Pernyataan for .. in do .. while Pernyataan ini digunakan untuk mengerjakan suatu blok program selama suatu kondisi bernilai benar dengan jumlah minimal pengerjaan sebanyak 1 kali.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var i = 0 ; do { i += 2 ; console . log ( i ) ; } while ( i < 2 0 ) ; // hasil : // 2 // 4 // 6 // 8 // 10 // 12 // 14 // 16 // 18 // 20

Listing 2.20: Pernyataan do .. while while Seperti do .. while, pernyataan ini digunakan untuk mengerjakan suatu blok program secara berulang-ulang selama kondisi bernilai benar. Meskipun demikian, bisa saja blok program tersebut tidak pernah dikerjakan jika pada saat awal expresi dievaluasi sudah bernilai false.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var n = 0 ; var x = 0 ; while ( n < 5 ) { n ++; x += n ; c o n s o l e . l o g ( " Nilai n = " + n ) ; c o n s o l e . l o g ( " Nilai x = " + x ) ; } // hasil : // Nilai n = 1 // Nilai x = 1 // Nilai n = 2 // Nilai x = 3 // Nilai n = 3 // Nilai x = 6 // Nilai n = 4 // Nilai x = 10 // Nilai n = 5 // Nilai x = 15

2.2. Dasar-dasar JavaScript di Node.js Listing 2.21: Pernyataan while label, break, dan continue Bagian ini digunakan dalam looping dan switch.

30

label digunakan untuk memberi pengenal pada suatu lokasi program sehingga bisa direferensi oleh break maupun continue (jika dikehendaki). break digunakan untuk menghentikan eksekusi dan meneruskan alur program ke pernyataan setelah looping atau switch continue digunakan untuk meneruskan eksekusi ke iterasi atau ke kondisi switch berikutnya.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var n = 0 ; var x = 0 ; while ( n < 5 ) { n ++; x += n ; i f ( x%2 == 0 ) { continue ; }; i f ( x >10) { break ; }; c o n s o l e . l o g ( " Nilai n = " + n ) ; c o n s o l e . l o g ( " Nilai x = " + x ) ; }; // hasil : // Nilai n // Nilai x // Nilai n // Nilai x

= = = =

1 1 2 3

Listing 2.22: Pernyataan break dan continue


1 2 3 4 5 6 7 8 9 10 11 12 13 topLabel : f o r ( var k = 0 ; k < 1 0 ; k++){ f o r ( var m = 0 ; m < 2 0 ; m++){ i f (m == 5 ) { c o n s o l e . l o g ( " Nilai k = " + k ) ; c o n s o l e . l o g ( " Nilai m = " + m) ; break t o p L a b e l ; } } } // hasil : // Nilai k = 0 // Nilai m = 5

Listing 2.23: Pernyataan break dengan label

2.2. Dasar-dasar JavaScript di Node.js

31

2.2.9. Penanganan Error


JavaScript mendukung pernyataan try .. catch .. nally serta throw untuk menangani error. Meskipun demikian, banyak hal yang tidak sesuai dengan konstruksi ini karena sifat JavaScript yang asynchronous. Untuk kasus asynchrous, pemrogram lebih disarankan menggunakan function callback.
1 2 3 4 5 6 7 8 9 10 11 12 try { gakAdaFungsiIni ( ) ; } catch ( e ) { c o n s o l e . l o g ( " Error : " + e . message ) ; } finally { c o n s o l e . l o g ( " Ini adalah semacam bagian untuk pembersihan ," ) ; c o n s o l e . l o g ( " akan dikerjakan , apapun yang terjadi " ) ; }; // hasil : // Error : g ak A da Fu n gs iI n i is not defined // Ini adalah semacam bagian untuk pembersihan , // akan dikerjakan , apapun yang terjadi

Listing 2.24: Pernyataan break dengan label Jika diperlukan, kita bisa mendenisikan sendiri error dengan menggunakan pernyataan throw.
1 2 3 4 5 6 7 8 try { var a = 1 / 0 ; throw " Pembagian oleh angka 0 " ; } catch ( e ) { c o n s o l e . l o g ( " Error : " + e ) ; }; // hasil : // Error : Pembagian oleh angka 0

Listing 2.25: Pernyataan break dengan label

BAB

Paradigma Pemrograman di JavaScript

3.1. Pemrograman Fungsional


Pemrograman fungsional, atau sering disebut functional programming, selama ini lebih sering dibicarakan di level para akademisi. Meskipun demikian, saat ini terdapat kecenderungan paradigma ini semakin banyak digunakan di industri. Contoh nyata dari implementasi paradigma ini di industri antara lain adalah Scala (http://www.scala-lang. org), OCaml (http://www.ocaml.org), Haskell (http://www.haskell.org), Microsoft F# (http://fsharp.org), dan lain-lain. Dalam konteks paradigma pemrograman, peranti lunak yang dibangun menggunakan pendekatan paradigma ini akan terdiri atas berbagai fungsi yang mirip dengan fungsi matematis. Fungsi matematis tersebut dievaluasi dengan penekanan pada penghindaran state serta mutable data. Bandingkan dengan paradigma pemrograman prosedural yang menekankan pada immutable data dan denisi berbagai prosedur dan fungsi untuk mengubah state serta data. JavaScript bukan merupakan bahasa pemrograman fungsional yang murni, tetapi ada banyak tur dari pemrograman fungsional yang terdapat dalam JavaScript. Dalam hal ini, JavaScript banyak dipengaruhi oleh bahasa pemrograman Scheme (http://www. schemers.org/). Bab ini akan membahas beberapa tur pemrograman fungsional di JavaScript. Pembahasan ini didasari pembahasan di bab sebelumnya tentang Fungsi di JavaScript.

3.1.1. Ekspresi Lambda


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

32

3.1. Pemrograman Fungsional

33

ditautkan (bound ) ke suatu identier ). Berikut adalah implementasi dari konsep ini di JavaSCript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Diambil dari // http :// stackoverflow . com / questions /3865335/ what - is -a - lambda - language // dengan beberapa perubahan function a p p l y O p e r a t i o n ( a , b , o p e r a t i o n ) { return o p e r a t i o n ( a , b ) ; } function add ( a , b ) { return a+b ; } function s u b t r a c t ( a , b ) { return ab ; } c o n s o l e . l o g ( 1 ,2 , add : + a p p l y O p e r a t i o n ( 1 , 2 , add ) ) ; c o n s o l e . l o g ( 43 ,21 , subtract : + a p p l y O p e r a t i o n ( 4 3 , 2 1 , s u b t r a c t ) ) ; c o n s o l e . l o g ( 4^3: + a p p l y O p e r a t i o n ( 4 , 3 , function ( a , b ) { return Math . pow ( a , b ) } ) ) // // // // hasil : 1 ,2 , add : 3 43 ,21 , subtract : 22 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 yang setidak-tidaknya menggunakan satu atau lebih fungsi lain sebagai parameter dari fungsi, atau menghasilkan fungsi sebagai nilai kembalian.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 function f o r E a c h ( a r r a y , a c t i o n ) { f o r ( var i = 0 ; i < a r r a y . l e n g t h ; i++ ) action ( array [ i ] ) ; } function p r i n t ( word ) { c o n s o l e . l o g ( word ) ; } function makeUpperCase ( word ) { c o n s o l e . l o g ( word . toUpperCase ( ) ) ; } f o r E a c h ( [ " satu " , " dua " , " tiga " ] , p r i n t ) ; f o r E a c h ( [ " satu " , " dua " , " tiga " ] , makeUpperCase ) ; // hasil : // satu // dua // tiga // SATU // DUA

3.1. Pemrograman Fungsional

34

23

// TIGA

Listing 3.2: Higher-order Function di JavaScript

3.1.3. Closure
Suatu closure merupakan denisi suatu fungsi bersama-sama dengan lingkungannya. Lingkungan tersebut terdiri atas fungsi internal serta berbagai variabel lokal yang masih tetap tersedia saat fungsi utama / closure tersebut selesai dieksekusi.
1 2 3 4 5 6 7 8 9 10 11 12 13 // Diambil dengan sedikit perubahan dari : // https :// developer . mozilla . org / en - US / docs / JavaScript / Guide / Closures function makeAdder ( x ) { return function ( y ) { return x + y ; }; } var add5 = makeAdder ( 5 ) ; var add10 = makeAdder ( 1 0 ) ; c o n s o l e . l o g ( add5 ( 2 ) ) ; // 7 c o n s o l e . l o g ( add10 ( 2 ) ) ; // 12

Listing 3.3: Closure di JavaScript

3.1.4. Currying
Currying memungkinkan pemrogram untuk membuat suatu fungsi dengan cara menggunakan fungsi yang sudah tersedia secara parsial, artinya tidak perlu menggunakan semua argumen dari fungsi yang sudah tersedia tersebut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Diambil dari : // http :// j a v a s c r i p t w e b l o g . wordpress . com /2010/04/05/ // curry - cooking - up - tastier - functions / // dengan sedikit perubahan function t o A r r a y ( fromEnum ) { return Array . p r o t o t y p e . s l i c e . c a l l ( fromEnum ) ; } Function . p r o t o t y p e . c u r r y = function ( ) { i f ( arguments . l e n g t h <1) { return t h i s ; // nothing to curry with - return function } var __method = t h i s ; var a r g s = t o A r r a y ( arguments ) ; return function ( ) { return __method . a p p l y ( this , a r g s . c o n c a t ( t o A r r a y ( arguments ) ) ) ; } } var add = function ( a , b ) { return a + b ; } // create function that returns 10 + argument

3.2. Pemrograman Berorientasi Obyek

35

26 27

var addTen = add . c u r r y ( 1 0 ) ; c o n s o l e . l o g ( 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 paradigma pemrograman yang memandang bahwa pemecahan masalah pemrograman akan dilakukan melalui denisi berbagai kelas kemudian membuat berbagai obyek berdasarkan kelas yng dibuat tersebut dan setelah itu mendenisikan interaksi antar obyek tersebut dalam memecahkan masalah pemrograman. Obyek bisa saling berinteraksi karena setiap obyek mempunyai properti (sifat / karakteristik) dan method untuk mengerjakan suatu pekerjaan tertentu. Jadi, bisa dikatakan bahwa paradigma ini menggunakan cara pandang yang manusiawi dalam penyelesaian masalah. Dengan demikian, inti dari PBO sebenarnya terletak pada kemampuan untuk mengabstraksikan berbagai obyek ke dalam kelas (yang terdiri atas properti serta method). Paradigma PBO biasanya juga mencakup inheritance atau pewarisan (sehingga terbentuk skema yang terdiri atas superclass dan subclass). Ciri lainnya adalah polymorphism dan encapsulation / pengkapsulan. JavaScript adalah bahasa pemrograman yang mendukung PBO dan merupakan implementasi dari ECMAScript. Implementasi PBO di JavaScript adalah prototype-based programming yang merupakan salah satu subset dari PBO. Pada prototype-based programming, kelas / class tidak ada. Pewarisan diimplementasikan melalui prototype.

3.2.2. Denisi Obyek


Denisi obyek dilakukan dengan menggunakan denisi function, sementara this digunakan di dalam denisi untuk menunjukkan ke obyek tersebut. Sementara itu, Kelas.prototype.namaMethod digunakan untuk mendenisikan method dengan nama method namaMethod pada kelas Kelas. Perhatikan contoh pada listing berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var u r l = r e q u i r e ( url ) ; // Definisi obyek function Halaman ( a l a m a t U r l ) { this . u r l = alamatUrl ; c o n s o l e . l o g ( " Mengakses alamat " + a l a m a t U r l ) ; } Halaman . p r o t o t y p e . getDomainName = function ( ) { return u r l . p a r s e ( t h i s . u r l , true ) . h o s t ; } // sampai disini definisi obyek // Halaman . prototype . getDomainName = > menetapkan method getDomainName // untuk obyek var h a l S a t u = new Halaman ( " http :// nodejs . org / api / http . html " ) ;

3.2. Pemrograman Berorientasi Obyek

36

17 18 19 20 21 22 23 24 25 26 27 28 29

var halDua = new Halaman ( " http :// bpdp . name / login ? fromHome " ) ; c o n s o l e . l o g ( " Alamat URL yang diakses oleh halSatu = " + h a l S a t u . u r l ) ; c o n s o l e . l o g ( " Alamat URL yang diakses oleh halDua = " + halDua . u r l ) ; c o n s o l e . l o g ( " Nama domain halDua = " + halDua . getDomainName ( ) ) ; // hasil : // Mengakses alamat http :// nodejs . org / api / http . html // Mengakses alamat http :// bpdp . name / login ? fromHome // Alamat URL yang diakses oleh halSatu = http :// nodejs . org / api / http . html // Alamat URL yang diakses oleh halDua = http :// bpdp . name / login ? fromHome // Nama domain halDua = bpdp . name

Listing 3.5: Denisi obyek di JavaScript

3.2.3. Inheritance / Pewarisan


Pewarisan di JavaScript bisa dicapai menggunakan prototype. Listing program berikut memperlihatkan bagaimana pewarisan diimplementasikan di JavaScript.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 // Definisi obyek function K e l a s ( param ) { t h i s . p r o p e r t y 1 = new S t r i n g ( param ) ; } K e l a s . p r o t o t y p e . methodSatu = function ( ) { return t h i s . p r o p e r t y 1 ; } var k e l a s S a t u = new K e l a s ( " ini parameter 1 dari kelas 1 " ) ; c o n s o l e . l o g ( " Property 1 dari kelasSatu = " + k e l a s S a t u . p r o p e r t y 1 ) ; c o n s o l e . l o g ( " Property 1 dari kelasSatu , diambil dari method = " + k e l a s S a t u . methodSatu ( ) ) ; // Definisi inheritance : // SubKelas merupakan anak dari Kelas yang didefinisikan // di atas . SubKelas . p r o t o t y p e = new K e l a s ( ) ; SubKelas . p r o t o t y p e . c o n s t r u c t o r = SubKelas ; function SubKelas ( param ) { t h i s . p r o p e r t y 1 = new S t r i n g ( param ) ; } // method overriding SubKelas . p r o t o t y p e . methodSatu = function ( k e H u r u f B e s a r ) { c o n s o l e . l o g ( " Ubah ke huruf besar ? = " + k e H u r u f B e s a r ) ; i f ( keHurufBesar ) { return t h i s . p r o p e r t y 1 . toUpperCase ( ) ; } else { return t h i s . p r o p e r t y 1 . toLowerCase ( ) ; } } SubKelas . p r o t o t y p e . methodDua = function ( ) { c o n s o l e . l o g ( " Berada di method dua dari SubKelas " ) ; }

3.2. Pemrograman Berorientasi Obyek

37

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

// mari diuji var s u b K e l a s S a t u = new SubKelas ( " Parameter 1 Dari Sub Kelas 1 " ) ; c o n s o l e . l o g ( " Property 1 dari sub kelas 1 = " + s u b K e l a s S a t u . p r o p e r t y 1 ) ; c o n s o l e . l o g ( " Property 1 dari sub kelas 1 , diambil dari method + param = " + s u b K e l a s S a t u . methodSatu ( true ) ) ; c o n s o l e . l o g ( " Property 1 dari sub kelas 1 , diambil dari method + param = " + s u b K e l a s S a t u . methodSatu ( f a l s e ) ) ; c o n s o l e . l o g ( s u b K e l a s S a t u . methodDua ( ) ) ; // hasil : // // Property 1 dari kelasSatu = ini parameter 1 dari kelas 1 // Property 1 dari kelasSatu , diambil dari method = ini // parameter 1 dari kelas 1 // Property 1 dari sub kelas 1 = Parameter 1 Dari Sub Kelas 1 // Ubah ke huruf besar ? = true // Property 1 dari sub kelas 1 , diambil dari method + param = // PARAMETER 1 DARI SUB KELAS 1 // Ubah ke huruf besar ? = false // Property 1 dari sub kelas 1 , diambil dari method + param = // parameter 1 dari sub kelas 1 // Berada di method dua dari SubKelas

Listing 3.6: Pewarisan di PBO JavaScript

BAB

Mengelola Paket Menggunakan npm

4.1. Apakah npm Itu?


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

4.2. Menggunakan npm


Saat melakukan instalasi Node.js, secara otomatis npm akan disertakan. Dengan perintah npm tersebut, seorang pemrogram bisa mengelola pustaka yang tersedia di repositori. Jika pemrogram mempunya pustakan yang bisa digunakan oleh orang lain, maka pemrogram yang bersangkutan juga bisa menyimpan pustaka tersebut ke dalam repositori sehingga memungkinkan untuk diinstall oleh pemrogram-pemrogram lain di seluruh dunia. Sintaksis lengkap dari penggunaan perintah npm ini adalah sebagai berikut1 :
1 2 3 4 5 6 7 8 9 10 11 12 $ npm h e l p Usage : npm <command > where <command i s one o f : > addu s e r , adduser , a p i h e l p , author , bin , bugs , c , cache , c o m p l e t i o n , c o n f i g , ddp , dedupe , d e p r e c a t e , docs , e d i t , e x p l o r e , f aq , f i n d , f i n d dupes , get , h e l p , h e l p s e a r c h , home , i , i n f o , i n i t , i n s t a l l , i s n t a l l , l a , l i n k , l i s t , l l , ln , l o g i n , l s , outdated , owner , pack , p r e f i x , prune , p u b l i s h , r , rb , r e b u i l d , remove , r e s t a r t , rm , r o o t , runs c r i p t , s , se , s e a r c h , set , show , s h r i n k w r a p , s t a r ,
1

beberapa bagian tertulis spesik lokasi direktori di komputer yang digunakan penulis

38

4.2. Menggunakan npm

39

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

s t a r t , sto p , submodule , tag , test , t s t , un , u n i n s t a l l , u n l i n k , u n p u b l i s h , u n s t a r , up , update , v e r s i o n , view , whoami npm npm npm npm npm <cmd> h l faq h e l p <term> h e l p npm q u i c k h e l p on <cmd> d i s p l a y f u l l usage i n f o commonly a s k e d q u e s t i o n s s e a r c h f o r h e l p on <term> involved overview

S p e c i f y c o n f i g s i n t h e i n i f o r m a t t e d f i l e : /home/bpdp / . npmrc o r on t h e command l i n e v i a : npm <command key v a l u e > C o n f i g i n f o can be viewed v i a : npm h e l p c o n f i g npm@1 . 1 . 6 6 /home/bpdp/ s o f t w a r e / nodev0 . 8 . 1 5 l i n u x 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 tersebut.

4.2.1. Instalasi Paket


npm sebenarnya bukan merupakan singkatan dari Node Package Manager, meskipun seringkali orang menterjemahkan dengan singkatan tersebut dan npm seharusnya ditulis dalam huruf kecil semua seperti yang dijelaskan pada FAQ (Frequently Asked Questions)2 . npm merupakan bilah alat berbasis baris perintah, dijalankan melalui shell atau command prompt. Sama seperti kebanyakan bilah alat berbasis baris perintah lain, npm memiliki struktur perintah npm perintah argumen. Installasi paket pustaka dilakukan dengan perintah berikut :
1 $ npm i n s t a l l f o o

Listing 4.2: Cara install paket menggunakan npm Perintah diatas akan memasang versi terakhir dari paket pustaka foo. Selain itu npm juga dapat memasang paket pustaka langsung pada sebuah folder, tarball atau tautan untuk sebuah tarball.

4.2.2. Struktur Instalasi Paket Node.js


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

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

4.2. Menggunakan npm

40

Gambar 4.1.: Hasil perintah npm ls 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-paket tersebut akan terinstall di $CWD/node_modules ($CWD = Current Working Directory direktori aktif saat ini). Daftar paket pustaka yang terpasang dapat dilihat menggunakan perintah berikut:
1 $ npm l s

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. Gambar 4.1 berikut menampilkan contoh struktur installasi dari paket pustaka lokal aplikasi:

4.2.3. Menghapus Paket / Uninstall


Menghapus paket pustaka menggunakan npm pada dasarnya hampir sama dengan saat memasang paket, namun dengan perintah uninstall. Berikut perintah lengkapnya.
1 $ npm u n i n s t a l l f o o

Listing 4.4: Perintah menghapus paket di npm Paket pustaka foo dalam lokal aplikasi akan dihapus, jika menggunakan hak administrasi sudo atau root maka akan menghapus dari installasi global.

4.2.4. Mencari Paket


Untuk mencari paket, gunakan argumen search dan nama atau bagian dari nama paket yang dicari. Contoh berikut ini akan mencari paket dengan kata kunci sha512 (tampilan berikut merupakan tampilan yang terpotong):
1 2 3 4 5 $ npm s e a r c h sha512 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g // a l l / s i n c e ? s t a l e = . . . npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g // a l l / s i n c e ? s t a l e = . . . NAME DESCRIPTION ... k r y p t o Highl e v e l c r y p t o l i b r a r y , making t h e c o r e c r y p t o . . .

4.2. Menggunakan npm

41

pwhash

G e n e r a t e password h a s h e s from t h e command l i n e .

...

Listing 4.5: Perintah menghapus paket di npm Setelah menemukan paketnya, pemrogram bisa menginstall langsung ataupun melihat informasi lebih lanjut tentang pustakan tersebut.

4.2.5. Menampilkan Informasi Paket


Setelah mengetahui nama paket, pemrogram bisa memperoleh informasi lebih lanjut dalam format JSON menggunakan parameter view. Contoh dibawah ini menampilkan rincian dalam format JSON dari paket arango.client:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 $ npm view ara ng o . c l i e n t npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / a ra ngo . c l i e n t npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / ar ang o . c l i e n t { name : ara ng o . c l i e n t , 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 , d i s t t a g s : { l a t e s t : 0 . 5 . 6 } , versions : [ 0.3.1 , 0.3.2 , 0.4.0 , 0.5.0 , 0.5.1 , 0.5.4 , 0.5.6 ] , m a i n t a i n e r s : k a e r u s <a n d e r s @ k a e r u s . com> , time : { 0 . 3 . 1 : 2012 08 09T12 : 0 4 : 3 4 . 5 9 4 Z , 0 . 3 . 2 : 2012 08 09T12 : 4 9 : 0 2 . 3 2 2 Z , 0 . 4 . 0 : 2012 09 17T10 : 4 4 : 4 3 . 1 8 7 Z , 0 . 5 . 0 : 2012 10 01T14 : 5 1 : 3 2 . 6 6 8 Z , 0 . 5 . 1 : 2012 10 03T22 : 1 1 : 5 8 . 3 7 6 Z , 0 . 5 . 4 : 2012 10 16T09 : 4 5 : 3 7 . 4 7 7 Z , 0 . 5 . 6 : 2012 10 26T17 : 3 4 : 2 8 . 4 9 1 Z } , a u t h o r : Kaerus <c o n t a c t @ k a e r u s . com> ( h t t p : / / k a e r u s . com ) , repository : { type : g i t , u r l : g i t : / / g i t h u b . com/ k a e r u s / arangoc l i e n t . g i t } , version : 0.5.6 , keywords : [ arangodb , nosql , qunit , amd ] , c o n t r i b u t o r s : a n d e r s e l o <a n d e r s @ k a e r u s . com> , dependencies : { amdefine : >=0.0.2 } , devDependencies : { r e q u i r e j s : >=2.0.6 } , bugs : { u r l : h t t p s : / / g i t h u b . com/ k a e r u s / arangoc l i e n t / i s s u e s } , main : i n d e x . j s , l i c e n s e : MIT , dist : { shasum : 4 8 2 7 9 e 7 c f 9 e a 0 b 4 b 6 7 6 6 f 0 9 6 7 1 2 2 4 c 4 6 d 6 e 7 1 6 b 0 , t a r b a l l : h t t p : / / r e g i s t r y . npmjs . o r g / ara ng o . c l i e n t // ar an go . c l i e n t 0 . 5 . 6 . t gz } , d i r e c t o r i e s : {} }

Listing 4.6: Menampilkan rincian suatu paket dalam format JSON

4.2. Menggunakan npm

42

4.2.6. Memperbaharui Paket


Jika terdapat versi baru, kita bisa memperbaharui secara otomatis menggunakan argumen update berikut ini:
1 npm update

Listing 4.7: Memperbaharui paket lokal


1 npm update g

Listing 4.8: Memperbaharui paket secara global

BAB

Node.js dan Web: Teknik Pengembangan Aplikasi

5.1. Pendahuluan
Pada saat membangun aplikasi Cloud dengan antarmuka web menggunakan Node.js, ada beberapa teknik pemrograman yang bisa digunakan. Bab ini akan membahas berbagai teknik tersebut. Untuk mengerjakan beberapa latihan di bab ini, digunakan suatu le dengan format JSON. File pegawai.json berikut ini akan digunakan dalam pembahasan selanjutnya.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 { " pegawai " : [ { " id " : " 1 " , " nama " : " Zaky " , " alamat " : " Purwomartani " }, { " id " : " 2 " , " nama " : " Ahmad " , " alamat " : " Kalasan " }, { " id " : " 3 " , " name " : " Aditya " , " alamat " : " Sleman " } ] }

Listing 5.1: pegawai.json Jika ingin memeriksa validitas dari data berformat JSON, pemrogram bisa menggunakan validator di http://jsonlint.com.

43

5.2. Event-Driven Programming dan EventEmitter

44

5.2. Event-Driven Programming dan EventEmitter


Event-Driven Programming (selanjutnya akan disebut EDP) atau sering juga disebut Event-Based Programming merupakan teknik pemrograman yang menggunakan event atau suatu kejadian tertentu sebagai pemicu munculnya suatu aksi serta aliran program. Contoh event misalnya adalah sebagai berikut: Menu dipilih. Tombol "Submit" di klik. Server menerima permintaan dari klien. Pada dasarnya ada beberapa bagian yang harus disiapkan dari paradigma dan teknik pemrograman ini: main loop atau suatu konstruksi utama program yang menunggu dan mengirimkan sinyal event. denisi dari berbagai event yang mungkin muncul denisi event-handler untuk menangani event yang muncul dan dikirimkan oleh main loop Node.js merupakan peranti pengembangan yang menggunakan teknik pemrograman ini. Pada Node.js, EDP ini semua dikendalikan oleh kelas events.EventEmitter. Jika ingin menggunakan kelas ini, gunakan require(events). Dalam terminologi Node.js, jika suatu event terjadi, maka dikatakan sebagai emits an event, sehingga kelas yang digunakan untuk menangani itu disebut dengan events.EventEmitter. Pada dasarnya banyak event yang digunakan oleh berbagai kelas lain di Node.js. Contoh kecil dari penggunaan itu diantaranya adalah net.Server yang meng-emit event "connection", "listening", "close", dan "error". Untuk memahami mekanisme ini, pahami dua kode sumber berikut: server.js: mengaktifkan server http (diambil dari manual Node.js server-on-error.js: mencoba mengaktifkan server pada host dan port yang sama dengan 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 2 3 4 5 6 var h t t p = r e q u i r e ( http ) ; h t t p . c r e a t e S e r v e r ( function ( req , r e s ) { r e s . writeHead ( 2 0 0 , { Content - Type : text / plain } ) ; r e s . end ( Hello World \ n ) ; } ) . l i s t e n ( 1 3 3 7 , 127.0.0.1 ) ; c o n s o l e . l o g ( Server running at http : / / 1 2 7 . 0 . 0 . 1 : 1 3 3 7 / ) ;

Listing 5.2: server.js

5.3. Asynchronous / Non-blocking IO dan Callback

45

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

var n e t = r e q u i r e ( net ) ; var s e r v e r = n e t . c r e a t e S e r v e r ( function ( s o c k ) { // Event dan event - handler // data = > jika ada data yang dikirimkan dari klien s o c k . on ( data , function ( data ) { c o n s o l e . l o g ( data + s o c k . re m o t e A d dr e s s + : + data ) ; }); // close = > jika koneksi ditutup s o c k . on ( close , function ( data ) { c o n s o l e . l o g ( koneksi ditutup ) ; }); }); s e r v e r . l i s t e n ( 1 3 3 7 , function ( ) { c o n s o l e . l o g ( Server aktif di 127. 0.0.1: 1337 ) ; }); s e r v e r . on ( error , function ( e ) { i f ( e . code == EADDRINUSE ) { c o n s o l e . l o g ( Error : host dan port sudah digunakan . ) ; } });

Listing 5.3: server-on-error.js

5.3. Asynchronous / Non-blocking IO dan Callback


Asynchronous input/output merupakan suatu bentuk pemrosesan masukan/keluaran yang memungkinkan pemrosesan dilanjutkan tanpa menunggu proses tersebut selesai. Saat pemrosesan masukan/keluaran tersebut selesai, hasil akan diberikan ke suatu fungsi. Fungsi yang menangani hasil pemrosesan saat pemrosesan tersebut selesai disebut callback (pemanggilan kembali). Jadi, mekanismenya adalah: proses masukan/keluaran lanjut ke alur berikutnya - panggil kembali fungsi pemroses jika proses masukan/keluaran sudah selesai.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var f s = r e q u i r e ( fs ) ; var s y s = r e q u i r e ( sys ) ; s y s . p u t s ( Mulai baca file ) ; data = f s . r e a d F i l e S y n c ( ./ pegawai . json , " utf -8 " ) ; c o n s o l e . l o g ( data ) ; s y s . p u t s ( Baris setelah membaca file ) ; // Hasil : // Mulai baca file // { // " pegawai ": [ // { // " id ": "1" , // " nama ": " Zaky " , // " alamat ": " Purwomartani " // }, // {

5.3. Asynchronous / Non-blocking IO dan Callback

46

18 19 20 21 22 23 24 25 26 27 28 29 30

// " id ": "2" , // " nama ": " Ahmad " , // " alamat ": " Kalasan " // }, // { // " id ": "3" , // " name ": " Aditya " , // " alamat ": " Sleman " // } // ] // } // // Baris setelah membaca file

Listing 5.4: Membaca le secara synchronous


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 var f s = r e q u i r e ( fs ) ; var s y s = r e q u i r e ( sys ) ; s y s . p u t s ( Mulai baca file ) ; f s . r e a d F i l e ( ./ pegawai . json , " utf -8 " , function ( e r r , data ) { i f ( e r r ) throw e r r ; c o n s o l e . l o g ( data ) ; }) s y s . p u t s ( Baris setelah membaca file ) ; // Hasil : // Mulai baca file // Baris setelah membaca file // { // " pegawai ": [ // { // " id ": "1" , // " nama ": " Zaky " , // " alamat ": " Purwomartani " // }, // { // " id ": "2" , // " nama ": " Ahmad " , // " alamat ": " Kalasan " // }, // { // " id ": "3" , // " name ": " Aditya " , // " alamat ": " Sleman " // } // ] // }

Listing 5.5: Membaca le secara asynchronous

BAB

Mengakses Basis Data NoSQL: mongoDB

6.1. Apa itu Basis Data NoSQL?


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

6.2. Mengenal mongoDB dan Fitur-turnya


mongoDB adalah salah satu software NoSQL yang termasuk dalam kategori Document Store / Document-Oriented Database, yaitu data disimpan dalam bentuk dokumen. Suatu dokumen bisa diibaratkan seperti suatu record dalam basis data relasional dan isi dari masing-masing dokumen tersebut bisa berbeda-beda dan ada pula yang sama. Hal ini berbeda dengan basis data relasional yang menetapkan keseragaman kolom serta tipe data dengan data yang NULL jika tidak terdapat data. mongoDB menyimpan data dalam bentuk dokumen dengan menggunakan format JSON. Berikut adalah tur dari mongoDB:
1

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

47

6.2. Mengenal mongoDB dan Fitur-turnya menggunakan format JSON dalam penyimpanan data mendukung indeks mendukung replikasi auto-sharding untuk skalabilitas horizontal query yang lengkap pembaruan data yang cepat mendukung Map/Reduce mendukung GridFS

48

6.2.1. Memulai Server


Seperti halnya basis data relasional seperti MySQL, PostgreSQL, dan lain-lain, mongoDB juga memulai dengan menjalankan server yang memungkinkan server tersebut melayani permintaan akses data dokumen melalui klien. Untuk memulai server, siapkan direktori yang akan menjadi tempat menyimpan data (defaultnya adalah /data/db). Jika menginginkan lokasi lain, gunakan argumen dbpath saat menjalankan server sebagai berikut (buat direktorinya jika belum ada):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 $ pwd /home/bpdp/mongodb $ mkdir data $ mongod r e s t dbpath . / data Tue Dec 11 1 4 : 4 0 : 2 0 Tue Dec 11 1 4 : 4 0 : 2 0 warning : 32 b i t s e r v e r s don t have j o u r n a l i n g e n a b l e d by d e f a u l t . P l e a s e u s e j o u r n a l i f you want d u r a b i l i t y . Tue Dec 11 1 4 : 4 0 : 2 0 Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] MongoDB s t a r t i n g : p i d =24381 p o r t =27017 dbpath =./ data 32 b i t h o s t=bpdpa r c h Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] NOTE: when u s i n g MongoDB 32 b i t , you a r e l i m i t e d t o about 2 g i g a b y t e s o f data Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] see h t t p : / / b l o g . mongodb . o r g / p o s t /137788967/32 b i t l i m i t a t i o n s Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] with j o u r n a l , t h e l i m i t i s lower Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] db v e r s i o n v2 . 2 . 2 , p d f i l e version 4.5 Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] g i t v e r s i o n : n o g i t v e r s i o n Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] b u i l d i n f o : Linux f e l i x 3.6.7 1 ARCH # 1 SMP PREEMPT Sun Nov 18 10:11:22 CET 2012 i686 BOOST_LIB_VERSION=1_50 Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] o p t i o n s : { dbpath : " ./ data " , r e s t : true } Tue Dec 11 1 4 : 4 0 : 2 0 [ i n i t a n d l i s t e n ] Unable t o c h e c k f o r j o u r n a l f i l e s due t o : b o o s t : : f i l e s y s t e m : : d i r e c t o r y _ i t e r a t o r : : c o n s t r u c t : No such f i l e o r d i r e c t o r y : " ./ data / journal " Tue Dec 11 1 4 : 4 0 : 2 1 [ websvr ] admin web c o n s o l e w a i t i n g f o r c o n n e c t i o n s on p o r t 28017 Tue Dec 11 1 4 : 4 0 : 2 1 [ i n i t a n d l i s t e n ] w a i t i n g f o r c o n n e c t i o n s on p o r t 27017

6.2. Mengenal mongoDB dan Fitur-turnya

49

Listing 6.1: Menjalankan server MongoDB (mongod) Untuk mengakhiri server, tekan Ctrl-C, mongoDB akan mengakhiri server sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ^CTue Dec 11 1 5 : 1 6 : 3 8 g o t s i g n a l 2 ( I n t e r r u p t ) , w i l l t e r m i n a t e a f t e r c u r r e n t cmd ends Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] now e x i t i n g Tue Dec 11 1 5 : 1 6 : 3 8 d b e x i t : Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : g o i n g t o c l o s e l i s t e n i n g s o c k e t s . . . Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] c l o s i n g l i s t e n i n g s o c k e t : 5 Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] c l o s i n g l i s t e n i n g s o c k e t : 6 Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] c l o s i n g l i s t e n i n g s o c k e t : 7 Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] removing s o c k e t f i l e : /tmp/mongodb 27017. s o c k Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : g o i n g t o f l u s h d i a g l o g . . . Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : g o i n g t o c l o s e s o c k e t s . . . Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : w a i t i n g f o r f s p r e a l l o c a t o r . . . Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : c l o s i n g a l l f i l e s . . . Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] c l o s e A l l F i l e s ( ) f i n i s h e d Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : removing f s l o c k . . . Tue Dec 11 1 5 : 1 6 : 3 8 d b e x 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 maupun menggunakan shell. Admin web console bisa diakses menggunakan port 28017 seperti pada gambar 6.1. Sementara itu, untuk mengakses server menggunakan shell, bisa digunakan perintah mongo sebagai berikut:
1 2 3 4 $ mongo MongoDB s h e l l v e r s i o n : 2 . 2 . 2 connecting to : test >

Listing 6.3: Shell mongoDB (mongo)

6.2.3. Documents dan Collections


Konsep dasar yang harus dipahami dalam mongoDB sebagai document-oriented database adalah documents dan collections. Sama halnya dengan basis data relasional, mongoDB menyimpan data dalam suatu basis data. Di dalam basis data tersebut terdapat collections yang bisa diibaratkan seperti tabel dalam basis data relasional. Collections digunakan untuk menyimpan dokumen (documents). Dalam istilah basis data relasional, documents adalah records. Kerjakan latihan berikut untuk memahami pengertian dari documents dan collections.
1 2 3 4 5 $ mongo MongoDB s h e l l v e r s i o n : 2 . 2 . 2 connecting to : test > db test

6.2. Mengenal mongoDB dan Fitur-turnya

50

Gambar 6.1.: Admin web console untuk mongoDB

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

> u s e mydb s w i t c h e d t o db mydb > show dbs local ( empty ) > emp1 = { name : " Zaky " , a d d r e s s : " Griya Purwa Asri " } { " name " : " Zaky " , " address " : " Griya Purwa Asri " } > emp2 = { name : " Ahmad " , a d d r e s s : " Purwomartani " , e m a i l : " z a k y a h m a d a d i t y a @ g m a i l . com " } { " name " : " Ahmad " , " address " : " Purwomartani " , " email " : " z a k y a h m a d a d i t y a @ g m a i l . com " } > emp3 = { name : " Aditya " , a d d r e s s : " Kalasan " , phone : " 08787878787 " } { " name " : " Aditya " , " address " : " Kalasan " , " phone " : " 08787878787 " } > db . e m p l o y e e s . i n s e r t ( emp1 ) > db . e m p l o y e e s . i n s e r t ( emp2 ) > db . e m p l o y e e s . i n s e r t ( emp3 ) > show dbs local ( empty ) mydb 0 . 0 6 2 5GB > db mydb > show c o l l e c t i o n s employees system . i n d e x e s > db . e m p l o y e e s . f i n d ( ) { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 3 a 7 f 8 3 c b a 1 1 e 6 b 2 1 e " ) , " name " : " Zaky " , " address " : " Griya Purwa Asri " } { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 d a 7 f 8 3 c b a 1 1 e 6 b 2 1 f " ) , " name " : " Ahmad " , " address " :

6.3. Node.js dan MongoDB

51

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

" Purwomartani " , " email " : " z a k y a h m a d a d i t y a @ g m a i l . com " } { " _id " : O b j e c t I d ( " 50 c 7 4 b 7 9 a 7 f 8 3 c b a 1 1 e 6 b 2 2 0 " ) , " name " : " Aditya " , " address " : " Kalasan " , " phone " : " 08787878787 " } > db . e m p l o y e e s . f i n d ( {name : " Ahmad " } ) { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 d a 7 f 8 3 c b a 1 1 e 6 b 2 1 f " ) , " name " : " Ahmad " , " address " : " Purwomartani " , " email " : " z a k y a h m a d a d i t y a @ g m a i l . com " } > db . e m p l o y e e s . findOne ( ) { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 3 a 7 f 8 3 c b a 1 1 e 6 b 2 1 e " ) , " name " : " Zaky " , " address " : " Griya Purwa Asri " } > db . e m p l o y e e s . f i n d ( ) . l i m i t ( 2 ) { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 3 a 7 f 8 3 c b a 1 1 e 6 b 2 1 e " ) , " name " : " Zaky " , " address " : " Griya Purwa Asri " } { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 d a 7 f 8 3 c b a 1 1 e 6 b 2 1 f " ) , " name " : " Ahmad " , " address " : " Purwomartani " , " email " : " z a k y a h m a d a d i t y a @ g m a i l . com " } >

Listing 6.4: Sesi dalam shell mongoDB Basis data mongoDB hanya akan dibuat jika sudah dilakukan perintah untuk menyisipkan 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 kompilasi modul add-on native di Node.js. Node-gyp merupakan software bebas dan bisa diinstall menggunakan npm:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 $ npm i n s t a l l npm h t t p GET npm h t t p 200 npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p GET npm h t t p 304 npm h t t p 304 npm h t t p 304 npm h t t p 304 npm h t t p 304 npm h t t p 304 npm h t t p GET npm h t t p 200 npm h t t p 200 npm h t t p GET g nodegyp https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y https :// r e g i s t r y . npmjs . o r g / nodegyp . npmjs . o r g / nodegyp . npmjs . o r g / g l o b . npmjs . o r g / mkdirp . npmjs . o r g / f s t r e a m . npmjs . o r g / minimatch . npmjs . o r g / g r a c e f u l f s . npmjs . o r g / r e q u e s t . npmjs . o r g / t a r . npmjs . o r g / semver . npmjs . o r g / r i m r a f . npmjs . o r g / which . npmjs . o r g / o s e n v . npmjs . o r g / npmlog . npmjs . o r g / nopt . npmjs . o r g / g l o b . npmjs . o r g / minimatch . npmjs . o r g / mkdirp . npmjs . o r g / r e q u e s t . npmjs . o r g / g r a c e f u l f s . npmjs . o r g / semver . npmjs . o r g / semver//semver 1 . 1 . 1 . t g z . npmjs . o r g / f s t r e a m . npmjs . o r g / t a r . npmjs . o r g / t a r // t a r 0 . 1 . 1 4 . t g z

6.3. Node.js dan MongoDB

52

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / r i m r a f npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / which npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / nopt npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / o s e n v npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / npmlog npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / semver//semver 1 . 1 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / t a r // t a r 0 . 1 . 1 4 . t g z npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / abbrev npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / sigmund npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / l r u c a c h e npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / a n s i npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / b l o c k stream npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / sigmund npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / abbrev npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / l r u c a c h e npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / a n s i npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / b l o c k stream /home/bpdp/ s o f t w a r e / n o d e j s / b i n / nodegyp > /home/bpdp/ s o f t w a r e / n o d e j s / l i b / node_modules / nodegyp / b i n / nodegyp . j s nodegyp@0 . 8 . 1 /home/bpdp/ s o f t w a r e / n o d e j s / l i b / node_modules / nodegyp + g r a c e f u l fs@1 . 1 . 1 4 | osenv@0 . 0 . 3 | rimraf@2 . 0 . 2 | mkdirp@0 . 3 . 4 | which@1 . 0 . 5 | semver@1 . 1 . 1 | r e q u e s t @ 2 . 9 . 2 0 3 | nopt@2 . 0 . 0 ( abbrev@1 . 0 . 3 ) | minimatch@0 . 2 . 9 ( sigmund@1 . 0 . 0 , l r u cache@2 . 0 . 4 ) | glob@3 . 1 . 1 4 ( i n h e r i t s @ 1 . 0 . 0 ) | fstream@0 . 1 . 1 9 ( i n h e r i t s @ 1 . 0 . 0 ) | npmlog@0 . 0 . 2 ( ansi@0 . 1 . 2 ) + tar@0 . 1 . 1 4 ( i n h e r i t s @ 1 . 0 . 0 , b l o c k stream@0 . 0 . 6 )

Listing 6.5: Instalasi node-gyp Node-gyp ini diinstall pada lokasi global. Pada materi ini, Node-gyp diperlukan untuk membangun 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 atau berbagai wrapper serta solusi sejenis ORM Object-Relational Mapping. Beberapa solusi yang tersedia adalah:
1 2 3 4 5 6 7 8 9 $ npm i n s t a l l mongodb npm WARN package . j s o n kintamani@0 . 1 . 0 No README. md f i l e found ! npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g /mongodb npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g /mongodb npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / bson / 0 . 1 . 5 npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / bson / 0 . 1 . 5 > bson@0 . 1 . 5 i n s t a l l /home/bpdp/ node_modules /mongodb/ node_modules / bson > node i n s t a l l . j s | | ( e x i t 0 )

6.3. Node.js dan MongoDB

53

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

================================================================================ = = = Attempting t o b u i l d bson c++ e x t e n s i o n = = Windows : no b u i l d w i l l be attempted a s b i n a r i e s a r e p r e p a c k a g e d = = Unix : on f a i l u r e t h e package w i l l s t i l l i n s t a l l w i t h o u t t h e C++ e x t e n s i o n = = = ================================================================================ nodegyp c l e a n nodegyp c o n f i g u r e b u i l d gyp h t t p GET h t t p : / / n o d e j s . o r g / d i s t / v0 . 8 . 1 5 / nodev0 . 8 . 1 5 . t a r . gz gyp h t t p 200 h t t p : / / n o d e j s . o r g / d i s t / v0 . 8 . 1 5 / nodev0 . 8 . 1 5 . t a r . gz make [ 1 ] : E n t e r i n g d i r e c t o r y / home/bpdp/ node_modules /mongodb/ node_modules / bson / b u i l d CXX( t a r g e t ) R e l e a s e / o b j . t a r g e t / bson / e x t / bson . o SOLINK_MODULE( t a r g e t ) R e l e a s e / o b j . t a r g e t / bson . node SOLINK_MODULE( t a r g e t ) R e l e a s e / o b j . t a r g e t / bson . node : F i n i s h e d COPY R e l e a s e / bson . node make [ 1 ] : L e a v i n g d i r e c t o r y / home/bpdp/ node_modules /mongodb/ node_modules / bson / b u i l d c h i l d p r o c e s s e x i t e d with code 0 mongodb@1 . 2 . 3 . . / . . / . . / . . / . . / node_modules /mongodb + bson@0 . 1 . 5

Listing 6.6: Instalasi driver mongoDB Solusi lain yang bisa digunakan antara lain adalah: Mongoose (http://mongoosejs.com/) Mongojs (https://github.com/gett/mongojs) Mongolia (https://github.com/masylum/mongolia) 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 tersebut menggunakan Node.js. Untuk lebih menyederhanakan, kita akan menggunakan wrapper dari mongoDB native driver, yaitu Mongojs. Install Mongojs lebih dahulu menggunakan npm:
1 2 3 4 5 6 7 $ npm i n s t a l l mongojs npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / mongojs npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / mongojs npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g /common npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g /common mongojs@0 . 4 . 6 . . / . . / . . / . . / . . / node_modules / mongojs + common@0 . 2 . 1

Listing 6.7: Instalasi driver mongoDB Setelah itu, buat program sesuai dengan listing program berikut.
1 2 3 4 5 v a r d a t a b a s e U r l = " localhost / mydb " ; v a r c o l l e c t i o n s = [ " employees " ] ; v a r db = r e q u i r e ( " mongojs " ) . c o n n e c t ( d a t a b a s e U r l , c o l l e c t i o n s ) ; // m e n c a r i pegawai bernama Aditya

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB

54

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

db . e m p l o y e e s . f i n d ( { name : " Aditya " } , function ( e r r , e m p l o y e e s ) { i f ( e r r | | ! e m p l o y e e s ) c o n s o l e . l o g ( " Tidak ada pegawai dengan nama Aditya " ) ; e l s e e m p l o y e e s . f o r E a c h ( function ( emps ) { c o n s o l e . l o g ( emps ) ; }); }); // menyimpan data pegawai baru : Bambang db . e m p l o y e e s . s a v e ( { name : " Bambang " , a d d r e s s : " Yogyakarta " , password : " ealhadalah " , s e x : " male " } , function ( e r r , s a v e d ) { i f ( e r r | | ! s a v e d ) c o n s o l e . l o g ( " Pegawai Bambang gagal disimpan " ) ; e l s e c o n s o l e . l o g ( " Data pegawai Bambang tersimpan " ) ; }); // mengupdate data pegawai : Ahmad db . e m p l o y e e s . update ( { name : " Ahmad " } , { $ s e t : { a d d r e s s : " Finlandia " } } , function ( e r r , updated ) { i f ( e r r | | ! updated ) c o n s o l e . l o g ( " Data Ahmad gagal diperbaharui " ) ; e l s e c o n s o l e . l o g ( " Data Ahmad berhasil diperbaharui " ) ; }); // H a s i l : //{ _id : 50 c 7 4 b 7 9 a 7 f 8 3 c b a 1 1 e 6 b 2 2 0 , // name : Aditya , // a d d r e s s : Kalasan , // phone : 0 8 7 8 7 8 7 8 7 8 7 } // Data pegawai Bambang t e r s i m p a n // Data Ahmad b e r h a s i l d i p e r b a h a r u i // // H a s i l d i db : //> db . e m p l o y e e s . f i n d ( ) //{ " _id " : O b j e c t I d ( " 50 c 7 4 b 6 3 a 7 f 8 3 c b a 1 1 e 6 b 2 1 e " ) , " name " : // " Zaky " , " address " : " Griya Purwa Asri " } //{ " _id " : O b j e c t I d ( " 50 c 7 4 b 6 d a 7 f 8 3 c b a 1 1 e 6 b 2 1 f " ) , " address " : // " Finlandia " , " email " : " z a k y a h m a d a d i t y a @ g m a i l . com " , " name " : " Ahmad " } //{ " _id " : O b j e c t I d ( " 50 c 7 4 b 7 9 a 7 f 8 3 c b a 1 1 e 6 b 2 2 0 " ) , " name " : // " Aditya " , " address " : " Kalasan " , " phone " : " 08787878787 " } //{ " name " : " Bambang " , " address " : " Yogyakarta " , " password " : // " ealhadalah " , " sex " : " male " , " _id " : // O b j e c t I d ( " 50 c 7 5 d 4 3 c 1 1 1 3 8 4 8 4 6 0 0 0 0 0 1 " ) } //> //

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 mongoDB kemudian menampilkannya di web. Data diambil dari basis data mongoDB yang sudah dibuat sebelumnya (mydb). Untuk keperluan ini, kita akan menggunakan framework Express (http://expressjs.com). Install Express di level global dengan npm install -g express. Setelah terinstall, buat subdirektori baru (lokasi bebas) yang akan digunakan untuk menyimpan aplikasi web. Setelah itu, buat kerangka aplikasi di subdirektori tersebut sebagai berikut:
1 2 $ express

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB

55

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

create create create create create create create create create create create create create create

: : : : : : : : : : : : : :

. . / package . j s o n . / app . j s ./ public . / p u b l i c / images ./ public / stylesheets ./ public / stylesheets / style . css ./ routes . / routes / index . j s ./ routes / user . j s . / views . / views / layout . jade . / views / index . jade ./ public / javascripts

i n s t a l l dependencies : $ cd . && npm i n s t a l l run t h e app : $ node app

Listing 6.9: Mengakses mongoDB dari Node.js Berikut ini adalah beberapa perubahan yang dilakukan untuk rerangka aplikasi yang dihasilkan dari perintah express tersebut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 /* * * Module dependencies . */ var , , , , e x p r e s s = r e q u i r e ( express ) r o u t e s = r e q u i r e ( ./ routes ) employee = r e q u i r e ( ./ routes / employee ) h t t p = r e q u i r e ( http ) path = r e q u i r e ( path ) ;

var app = e x p r e s s ( ) ; app . c o n f i g u r e ( function ( ) { app . s e t ( port , p r o c e s s . env .PORT | | 3 0 0 0 ) ; app . s e t ( views , __dirname + / views ) ; app . s e t ( view engine , jade ) ; app . u s e ( e x p r e s s . f a v i c o n ( ) ) ; app . u s e ( e x p r e s s . l o g g e r ( dev ) ) ; app . u s e ( e x p r e s s . b o d y P a r s e r ( ) ) ; app . u s e ( e x p r e s s . methodOverride ( ) ) ; app . u s e ( app . r o u t e r ) ; app . u s e ( e x p r e s s . s t a t i c ( path . j o i n ( __dirname , public ) ) ) ; }); app . c o n f i g u r e ( development , function ( ) { app . u s e ( e x p r e s s . e r r o r H a n d l e r ( ) ) ; }); app . g e t ( / , r o u t e s . i n d e x ) ; app . g e t ( / employees , employee . l i s t ) ; h t t p . c r e a t e S e r v e r ( app ) . l i s t e n ( app . g e t ( port ) , function ( ) { c o n s o l e . l o g ( " Express server listening on port " + app . g e t ( port ) ) ; });

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB Listing 6.10: app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 { " name " : " show - employees " , " version " : " 0.0.1 " , " private " : true , " scripts " : { " start " : " node app " }, " dependencies " : { " express " : " 3.0.4 " , " jade " : " * " , " mongojs " : " latest " } } \ end { l i s t i n g } \ l s t s e t { l a n g u a g e=J a v a S c r i p t , c a p t i o n=r o u t e s / i n d e x . j s } \ begin { l s t l i s t i n g } /* * GET home page . */ e x p o r t s . i n d e x = function ( req , r e s ) { r e s . r e n d e r ( index , { t i t l e : Contoh Express + mongoDB } ) ; };

56

Listing 6.11: package.json Selain itu, ada beberapa tambahan le (routes/employee.js dan views/employee.jade), penghapusan le (routes/user.js), dan perubahan yang cukup signikan pada le views/index.jade.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /* * GET employees listing . */ var d a t a b a s e U r l = " localhost / mydb " ; var c o l l e c t i o n s = [ " employees " ] ; var db = r e q u i r e ( " mongojs " ) . c o n n e c t ( d a t a b a s e U r l , c o l l e c t i o n s ) ; e x p o r t s . l i s t = function ( req , r e s ) { // mencari dan menampilkan semua pegawai db . e m p l o y e e s . f i n d ( function ( e r r , e m p l o y e e s ) { r e s . r e n d e r ( employee , { l i s t O f E m p l o y e e : employees , }); };

t i t l e : Daftar pegawai } ) ;

Listing 6.12: routes/employee.js


1 2 3 4 5 6 7 8 extends layout block content h1= t i t l e p #{ t i t l e } each employee i n l i s t O f E m p l o y e e p #{employee . name}

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB

57

Listing 6.13: views/employee.jade


1 2 3 4 5 6 7 8 9 extends layout block content h1= t i t l e p |

Selamat datang d i #{ t i t l e } . A p l i k a s i i n i hanya s e k e d a r c on to h a p l i k a s i web dengan mongoDB s e b a g a i backend . Untuk s a a t i n i hanya t e r s e d i a f a s i l i t a s untuk m e l i h a t a ( h r e f=" / employees " ) d a f t a r pegawai .

Listing 6.14: views/index.jade

BAB

Pola Arsitektur Aplikasi Web: MVC dan ExpressJS

7.1. Apa itu Pola Arsitektur?


Pola arsitektur (architectural pattern) adalah konsep dan standar arsitektur yang membentuk suatu aplikasi. Pola disini mengacu pada best practices atau praktik-praktik terbaik yang terutama terkait dengan arsitektur dari software aplikasi. Pola arsitektur terdiri atas elemen-elemen software, properti dari elemen-elemen tersebut, serta hubungan antar elemen-elemen tersebut.

7.2. Pola Arsitektur MVC


MVC (Model-View-Controller) merupakan pola arsitektur aplikasi Web yang memisahkan aplikasi Web menjadi 3 komponen: Model: basis data View: tampilan antarmuka aplikasi Web, biasanya berisi semacam template dan isi-isi dinamis dari tampilan antarmuka tersebut. Controller: menerima requests atau permintaan dari browser kemudian mengarahkan ke event-handler untuk diproses. Proses tersebut bisa saja berupa langsung menghasilkan view (X)HTML atau format lainnya, atau bisa juga diproses terlebih dahulu di model dan kemudian hasilnya akan dikirimkan ke view untuk diisikan ke isi-isi dinamis serta membentuk le (X)HTML untuk ditampilkan di browser (sebenarnya tidak selalu perlu harus (X)HTML). Jika digambarkan dalam suatu diagram, pola arsitektur MVC ditampilkan pada gambar 7.1 Pola ini dikenal juga dengan istilah Model 2 dan dipopulerkan oleh JavaEE.

58

7.2. Pola Arsitektur MVC

59

Gambar 7.1.: Pola arsitektur MVC

7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS

60

7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS


Sebenarnya ExpressJS bukan merupakan framework MVC, meskipun demikian karena framework ini sangat eksibel, maka pemrogram bisa mengatur sendiri lokasi dari le / direktori serta berbagai kongurasi lainnya. Contoh implementasi disini adalah aplikasi sederhana untuk menampilkan data yang tersimpan dalam basis data mongoDB ke dalam format JSON yang bisa diakses dari browser.

7.3.1. Struktur Aplikasi


Setelah membuat kerangka aplikasi menggunakan ExpressJS, ada beberapa perubahan yang harus dilakukan. Perubahan ini terutama dilakukan untuk mengikuti pola arsitektur MVC (terutama peletakan le dan direktori). Pola asli dari kerangka aplikasi ExpressJS adalah sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ tree . . + app . j s | package . j s o n | p u b l i c | + images | | j a v a s c r i p t s | + s t y l e s h e e t s | + s t y l e . c s s | r o u t e s | + i n d e x . j s | + u s e r . j s + v i e w s + i n d e x . j a d e + l a y o u t . j a d e 6 directories , 7 f i l e s

Listing 7.1: Struktur direktori asli aplikasi ExpressJS Struktur direktori tersebut akan diubah sesuai dengan pola MVC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ tree . . + app . j s | c o n t r o l l e r s | + i n d e x . j s | + u s e r . j s | models | + db . j s | package . j s o n | p u b l i c | + images | | j a v a s c r i p t s | + s t y l e s h e e t s | + s t y l e . c s s + v i e w s + i n d e x . j a d e + l a y o u t . j a d e 7 directories , 8 f i l e s

7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS

61

Listing 7.2: Struktur direktori ExpressJS sesuai pola MVC Beberapa perubahan terhadap struktur direktori: direktori routes diubah menjadi controllers membuat direktori models untuk mendenisikan skema basis data

7.3.2. File-le yang Diperlukan


Beberapa le diubah isinya dan ada juga le yang baru.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 /* * * Module dependencies . */ var , , , , e x p r e s s = r e q u i r e ( express ) c o n t r o l l e r s = r e q u i r e ( ./ controllers ) u s e r = r e q u i r e ( ./ controllers / user ) h t t p = r e q u i r e ( http ) path = r e q u i r e ( path ) ;

var mongoose = r e q u i r e ( mongoose ) ; var app = e x p r e s s ( ) ; mongoose . c o n n e c t ( mongodb :// localhost / mydb ) ; app . c o n f i g u r e ( function ( ) { app . s e t ( port , p r o c e s s . env .PORT | | 3 0 0 0 ) ; app . s e t ( views , __dirname + / views ) ; app . s e t ( view engine , jade ) ; app . u s e ( e x p r e s s . f a v i c o n ( ) ) ; app . u s e ( e x p r e s s . l o g g e r ( dev ) ) ; app . u s e ( e x p r e s s . b o d y P a r s e r ( ) ) ; app . u s e ( e x p r e s s . methodOverride ( ) ) ; app . u s e ( app . r o u t e r ) ; app . u s e ( e x p r e s s . s t a t i c ( path . j o i n ( __dirname , public ) ) ) ; }); app . c o n f i g u r e ( development , function ( ) { app . u s e ( e x p r e s s . e r r o r H a n d l e r ( ) ) ; }); app . g e t ( / , c o n t r o l l e r s . i n d e x ) ; app . g e t ( / users , u s e r . l i s t ) ; h t t p . c r e a t e S e r v e r ( app ) . l i s t e n ( app . g e t ( port ) , function ( ) { c o n s o l e . l o g ( " Express server listening on port " + app . g e t ( port ) ) ; });

Listing 7.3: app.js


1 2 3 4 5 /* * GET employees listing . */ var Employee = r e q u i r e ( ../ models / db . js ) ;

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya

62

6 7 8 9 10 11

e x p o r t s . l i s t = function ( req , r e s ) { Employee . f i n d ( function ( e r r , e m p l o y e e s ) { r e s . send ( e m p l o y e e s ) ; }); };

Listing 7.4: controllers/user.js


1 2 3 4 5 6 7 8 9 10 11 var mongoose = r e q u i r e ( mongoose ) , Schema = mongoose . Schema ; var employeeSchema = new Schema ( { name : S t r i n g , address : String , phone : S t r i n g , email : String }); module . e x p o r t s = mongoose . model ( Employee , employeeSchema ) ;

Listing 7.5: models/db.js


1 2 3 4 5 6 7 8 9 10 11 12 13 { " name " : " express - mvc " , " version " : " 0.0.1 " , " private " : true , " scripts " : { " start " : " node app " }, " dependencies " : { " express " : " latest " , " jade " : " * " , " mongoose " : " latest " } }

Listing 7.6: package.json

7.3.3. Hasil
Setelah server dieksekusi (menggunakan perintah node app.js), maka hasilnya akan bisa diakses 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 daftar pola arsitektur aplikasi Web serta implementasinya di Node.js dan/atau JavaScript di sisi klien: MVP (Model-View-Presenter): Google GWT. MVVM (Model-View-ViewModel): Batman.js (http://batmanjs.org) dan Knockout.js (http://knockoutjs.com)

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya

63

Gambar 7.2.: Pola arsitektur MVC RVP (Resource-View-Presenter): Flatiron (http://flatironjs.org) MVA (Model-View-Adapter). Hierarchical MVC Presentation-Abstract-Control.

BAB

Real-time Web Menggunakan Socket.io

8.1. Apa itu Real-time Web?


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

8.2. Teknologi Pendukung Real-time Web


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

8.2.1. Ajax Technology


Teknologi Ajax (kadang juga ditulis AJAX, singkatan dari Asynchronous JavaScript and XML adalah sekumpulan teknologi yang pertama kali dicetuskan oleh Jesse James Garrett. Ajax memungkinkan browser untuk mengirim data dan mengambil data dari server secara asynchronous (di latar belakang) tanpa mengganggu keseluruhan tampilan halaman Web. Kumpulan teknologi yang digunakan adalah: (X)HTML dan CSS untuk presentasi halaman Web

64

8.2. Teknologi Pendukung Real-time Web DOM (Document Object Model ) untuk menampilkan data secara dinamis

65

XML dan XSLT untuk pertukaran data (seringkali tidak menggunakan XML tetapi JSON). Obyek XMLHttpRequest untuk komunikasi asynchronous JavaScript

8.2.2. Comet dan Push Technology


Comet merupakan istilah payung yang merangkum berbagai teknologi push, yaitu teknologi yang memungkinkan server untuk mengirimkan data ke browser tanpa diminta oleh browser. SSE (Server-Sent Events) SSE merupakan bagian dari spesikasi standar HTML5 (bisa diakses di http://dev.w3. org/html5/eventsource/. Spesikasi ini memungkinkan server untuk mem-push data ke halaman Web menggunakan protokol HTTP. Meski masih dalam pengembangan, tetapi beberapa browser sudah mendukung (misalnya Google Chrome / Chromium) serta Safari. Beberapa peranti pengembangan di sisi server juga sudah mendukung spesikasi ini. Pada Node.js, pemrogram bisa menggunakan paket sse, nsse, atau EventSource. Bayeux Protocol Protokol ini dikembangkan oleh the Dojo Foundation yang mengembangkan software Dojo Toolkit. Protokol ini digunakan sebagai transport untuk pesan-pesan asynchronous melalui HTTP dengan latensi yang rendah antara klien dengan server. Pesan-pesan tersebut di-rute-kan melalui channel-channel yang diberi nama dan bisa dikirimkan ke: server ke klien klien ke server klien ke klien (melalui server) Spesikasi 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 yang mengemulasi stream dua arah antara dua entitas (misalnya antara klien dengan server) dengan menggunakan banyak HTTP req/resp yang synchronous tanpa memerlukan polling yang sering atau respon yang terpotong-potong. Spesikasi ini dikembangkan oleh komunitas serta yayasan XMPP dan bisa dilihat secara lengkap di http://xmpp.org/ extensions/xep-0124.html

8.3. Socket.io

66

8.2.3. WebSocket
WebSocket merupakan teknologi Web yang menyediakan saluran komunikasi full duplex pada satu koneksi TCP. Protokol WebSocket distandarkan oleh IETF di RFC 6455 sedangkap API (Application Programming Interface) dikembangkan dan distandarkan oleh W3C sebagai bagian dari HTML5. Komunikasi antara klien dengan server dilaksanakan menggunakan TCP dengan nomor port 80. WebSocket diimplementasikan di sisi server dan klien dan memungkinkan adanya interaksi yang lebih real-time daripada teknologi push karena protokol dan API ini diimplementasikan dan bisa digunakan di sisi klien maupun server. Browser yang sudah mendukung protokol dan API WebSocket ini adalah Chrome, Firefox, Safari, Opera, dan Internet 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 WebSocket serta berbagai improvisasi lain yang diperlukan untuk real-time web (heartbeats, timeouts, dan disconnection). Protokol transport yang didukung adalah sebagai berikut: WebSocket Adobe Flash Socket AJAX long polling AJAX multipart streaming Forever Iframe JSONP Polling Pustaka ini terdiri atas pustaka untuk sisi klien (browser) dan server (menggunakan Node.js). Browser yang didukung adalah: Internet Explorer 5.5+ (desktop) Safari 3+ (desktop) Google Chrome 4+ (desktop) Firefox 3+ (desktop) Opera 10.61+ (desktop) iPhone Safari (mobile)

8.3. Socket.io iPad Safari (mobile) Android WebKit (mobile) WebOs WebKit (mobile)

67

8.3.2. Menggunakan Socket.io untuk Real-time Web


Socket.io melibatkan sisi klien dan sisi server. Pada sisi server, paket yang diperlukan adalah cocket.io, sementara untuk sisi klien (browser), diperlukan socket.io-client. Paket socket.io-client tidak diperlukan langsung pada sisi node_modules, tetapi ada beberapa le yang harus ditempatkan pada akses publik dengan maksud supaya bisa digunakan oleh browser. Tentang Aplikasi Aplikasi ini hanya merupakan contoh kecil dari real-time Web. Aplikasi terdiri atas sisi server dan klien/browser. Pada sisi server, aplikasi ini akan mengirimkan data ke browser (push). Sementara itu, browser akan menerima hasil push tersebut dan menampilkannya kemudian mengirimkan data ke server tanpa perlu melakukan proses refresh. Server hanya akan menampilkan data yang dikirimkan browser. Membuat Kerangka Aplikasi dengan ExpressJS Untuk membuat aplikasi ini, kita akan menggunakan ExpressJS dan Socket.io. Pada awalnya, kita akan membuat kerangka aplikasi menggunakan express (jika ExpressJS belum terinstall, install dengan menggunakan npm install -g express.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 $ express create create create create create create create create create create create create create create : : : : : : : : : : : : : : . . / package . j s o n . / app . j s ./ public . / p u b l i c / images ./ public / stylesheets ./ public / stylesheets / style . css ./ routes . / routes / index . j s ./ routes / user . j s . / views . / views / layout . jade . / views / index . jade ./ public / javascripts

i n s t a l l dependencies : $ cd . && npm i n s t a l l run t h e app : $ node app

Listing 8.1: Membuat kerangka aplikasi dengan ExpressJS

8.3. Socket.io

68

Pada pembahasan berikutnya, kita akan mengadakan berbagai perubahan yang diperlukan. Instalasi Paket yang Diperlukan File package.json berisi beberapa informasi tentang aplikasi ini serta beberapa paket yang diperlukan. Isi dari le ini adalah sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 { " name " : " socket . io - expressjs " , " version " : " 0.0.1 " , " author " : " Bambang Purnomosidi D . P . " , " private " : true , " scripts " : { " start " : " node app " }, " dependencies " : { " express " : " latest " , " jade " : " * " , " socket . io " : " latest " , " socket . io - client " : " latest " } }

Listing 8.2: package.json Setelah itu. install paket-paket tersebut dengan menggunakan perintah npm install di direktori tersebut. Kongurasi JavaScript untuk Browser Browser juga memerlukan pustaka untuk Socket.io yang diperoleh dari paket socket.ioclient. Pada paket tersebut, terdapat direktori dist:
1 2 3 4 5 6 7 8 $ l s node_modules / s o c k e t . i o c l i e n t / d i s t / t o t a l 496 drwxrxrx 2 bpdp u s e r s 4096 Dec 16 2 0 : 1 8 drwxrxrx 7 bpdp u s e r s 4096 Dec 16 2 0 : 1 8 rwrr 1 bpdp u s e r s 101222 Nov 2 2 2 : 0 2 rwrr 1 bpdp u s e r s 44789 Nov 2 2 2 : 0 2 rwrr 1 bpdp u s e r s 175953 Mar 28 2012 rwrr 1 bpdp u s e r s 175830 Mar 28 2012

. .. socket . io . j s s o c k e t . i o . min . j s WebSocketMainInsecure . s w f WebSocketMain . s w f

Listing 8.3: Isi direktori dist di socket.io-client Copy-kan le-le tersebut ke direktori public/javascripts. Hapus File yang Tidak Diperlukan Ada beberapa le yang tidak diperlukan dan harus dihapus: routes/user.js

8.3. Socket.io Ubah File-le Tertentu Beberapa le akan diedit. Beberapa diantaranya akan diuraikan di bagian ini.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 var e x p r e s s = r e q u i r e ( express ) , app = e x p r e s s ( ) , r o u t e s = r e q u i r e ( ./ routes ) , h t t p = r e q u i r e ( http ) , s e r v e r = h t t p . c r e a t e S e r v e r ( app ) , i o = r e q u i r e ( socket . io ) . l i s t e n ( s e r v e r ) ; server . listen (80); app . c o n f i g u r e ( function ( ) { app . s e t ( views , __dirname + / views ) ; app . s e t ( view engine , jade ) ; app . u s e ( e x p r e s s . f a v i c o n ( ) ) ; app . u s e ( e x p r e s s . l o g g e r ( dev ) ) ; app . u s e ( e x p r e s s . b o d y P a r s e r ( ) ) ; app . u s e ( e x p r e s s . methodOverride ( ) ) ; app . u s e ( e x p r e s s . s t a t i c ( __dirname + / public ) ) ; app . u s e ( app . r o u t e r ) ; }); app . g e t ( / , r o u t e s . i n d e x ) ; i o . s o c k e t s . on ( connection , function ( s o c k e t ) { s o c k e t . emit ( kirim ke browser , { k a l i m a t D a r i S e r v e r : Kalimat ini dikirim dari server } ) ; s o c k e t . on ( dari browser , function ( data ) { c o n s o l e . l o g ( data . k a l i m a t D a r i B r o w s e r ) ; }); });

69

Listing 8.4: app.js


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 extends layout block content h1= t i t l e p #{ t i t l e } s c r i p t ( s r c=" / javascripts / socket . io . js " ) script var s o c k e t = i o . connect ( http : / / l o c a l h o s t ) ; s o c k e t . on ( k i r i m ke browser , f u n c t i o n ( data ) { document . getElementById ( " container " ) . innerHTML= " <p > " + data . k a l i m a t D a r i S e r v e r + " </p > " ; s o c k e t . emit ( d a r i browser , { k a l i m a t D a r i B r o w s e r : Kalimat i n i d i k i r i m d a r i browser } ) ; }); #c o n t a i n e r p #{ t i t l e }

Listing 8.5: views/index.jade


1 2 3 4 5 6 / GET home page . / e x p o r t s . i n d e x = f u n c t i o n ( req , r e s ) { r e s . r e n d e r ( index , { t i t l e : Contoh S o c k e t . i o + Express } ) ;

8.3. Socket.io

70

};

Listing 8.6: routes/index.js

Menjalankan Server Socket.io Server socket.io menggunakan port 80 sehingga harus dijalankan oleh root.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 # node app . js info socket . io started debug c l i e n t a u t h o r i z e d i n f o handshake a u t h o r i z e d qrMUlAcSRMywnvUK31RV debug s e t t i n g r e q u e s t GET / s o c k e t . i o /1/ w e b s o c k e t /qrMUlAcSRMywnvUK31RV debug set h e a r t b e a t i n t e r v a l f o r c l i e n t qrMUlAcSRMywnvUK31RV debug c l i e n t a u t h o r i z e d f o r debug w e b s o c k e t w r i t i n g 1 : : debug w e b s o c k e t w r i t i n g 5 : : : { " name " : " kirim ke browser " , " args " : [ { " k a l i m a t D a r i S e r v e r " : " Kalimat ini dikirim dari server " } ] } Kalimat i n i d i k i r i m d a r i b r o w s e r GET / 200 44ms 628 i n f o t r a n s p o r t end ( s o c k e t end ) debug set c l o s e t i m e o u t f o r c l i e n t qrMUlAcSRMywnvUK31RV debug c l e a r e d c l o s e t i m e o u t f o r c l i e n t qrMUlAcSRMywnvUK31RV debug c l e a r e d h e a r t b e a t i n t e r v a l f o r c l i e n t qrMUlAcSRMywnvUK31RV debug d i s c a r d i n g t r a n s p o r t GET / j a v a s c r i p t s / s o c k e t . i o . j s 304 4ms GET / s t y l e s h e e t s / s t y l e . c s s 304 4ms debug c l i e n t a u t h o r i z e d i n f o handshake a u t h o r i z e d Eug556YX4R8fOB31RW debug s e t t i n g r e q u e s t GET / s o c k e t . i o /1/ w e b s o c k e t /Eug556YX4R8fOB31RW debug set h e a r t b e a t i n t e r v a l f o r c l i e n t Eug556YX4R8fOB31RW debug c l i e n t a u t h o r i z e d f o r debug w e b s o c k e t w r i t i n g 1 : : debug w e b s o c k e t w r i t i n g 5 : : : { " name " : " kirim ke browser " , " args " : [ { " k a l i m a t D a r i S e r v e r " : " Kalimat ini dikirim dari server " } ] } Kalimat i n i d i k i r i m d a r i b r o w s e r debug e m i t t i n g h e a r t b e a t f o r c l i e n t Eug556YX4R8fOB31RW debug w e b s o c k e t w r i t i n g 2 : : debug set h e a r t b e a t t i m e o u t f o r c l i e n t Eug556YX4R8fOB31RW debug g o t h e a r t b e a t p a c k e t debug c l e a r e d h e a r t b e a t t i m e o u t f o r c l i e n t Eug556YX4R8fOB31RW debug set h e a r t b e a t i n t e r v a l f o r c l i e n t Eug556YX4R8fOB31RW ... ... ... ...

Listing 8.7: Menjalankan server Socket.io Keluaran pada sisi server tersebut merupakan keluaran yang sudah termasuk akses dari browser. Setelah server dijalankan, buka browser kemudian akses URL http:// localhost. Setelah diakses melalui browser, server akan mengirimkan kode sumber HTML sebagai berikut:
1 2 3 4 5 < !D C Y E html> O T P <html> <head> < t i t l e>Contoh S o c k e t . i o + E x p r e s s</ t i t l e> <l i n k r e l=" stylesheet " href=" / stylesheets / style . css ">

8.3. Socket.io

71

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

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

</head> <body> <h1>Contoh S o c k e t . i o + E x p r e s s</h1> <p>Contoh S o c k e t . i o + E x p r e s s</p> <s c r i p t src=" / javascripts / socket . io . js "></ s c r i p t> <s c r i p t> var s o c k e t = i o . connect ( http : / / l o c a l h o s t ) ; s o c k e t . on ( k i r i m ke browser , f u n c t i o n ( data ) { document . getElementById ( " container " ) . innerHTML= " <p > " + data . k a l i m a t D a r i S e r v e r + " </p > " ; s o c k e t . emit ( d a r i browser , { k a l i m a t D a r i B r o w s e r : Kalimat i n i d i k i r i m d a r i browser } ) ; }); </ s c r i p t> <div id=" container "> <p>Contoh S o c k e t . i o + E x p r e s s</p> </ div> </body> </html>

Listing 8.8: Kode sumber di browser Tampilan di browser bisa dilihat pada gambar 8.1 Contoh pada materi ini merupakan contoh sederhana, tetapi diharapkan bisa dengan mudah dipahami untuk membuat aplikasi Web real-time.

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 Denitive Guide, 4th Edition, OReilly, 2001. [4] Don Nguyen, Jump Start Node.js, SitePoint, 2012. [5] Douglas Crockford, JavaScript: The Good Parts, OReilly, 2008. [6] Marijn Haverbeke, Eloquent JavaScript: A Modern Introduction to Programming, No Starch Press, 2011. [7] Shelley Powers, Learning Node, OReilly, 2012. [8] Tom Hughes-Croucher, Mike Wilson, Node: Up and Running, OReilly, 2012.

72

Lampiran

73

LAMPIRAN

Gaya Penulisan Kode / Coding Style

A.1. Tentang Gaya Penulisan Kode


Pada saat seseorang berada pada proses pembuatan kode sumber (coding), apapun gaya penulisan programnya, tidak akan bermasalah jika program itu hanya dia buat untuk si pemrogram itu sendiri. Meski demikian, hal tersebut jarang terjadi karena biasanya selalu ada kerja kelompok atau setidaknya program tersebut akan digunakan oleh pihak lain yang suatu saat perlu memahami apa yang tertulis di kode sumber tersebut. Untuk keperluan itu, biasanya diperlukan suatu gaya penulisan kode. Saat ini banyak sekali gaya penulisan kode untuk JavaScript / Node.js, biasanya tergantung pada kesepakatan anggota-anggota dalam kelompok pengembang dan berdasarkan pada pengalaman mereka tersebut. Pada lampiran ini, gaya penulisan kode dari NPM akan dituliskan secara utuh (dalam bahasa aslinya dengan harapan bisa bermanfaat untuk penyeragaman dan kemudahan membaca atau menelusuri bugs/errors). Gaya penulisan kode ini diambil dari https://npmjs.org/doc/coding-style.html.

A.2. npms Coding Style


npms "funny" coding style

A.2.1. DESCRIPTION
npms coding style is a bit unconventional. It is not dierent for dierences sake, but rather a carefully crafted style that is designed to reduce visual clutter and make bugs more apparent. If you want to contribute to npm (which is very encouraged), you should make your code conform to npms style.

74

A.2. npms Coding Style

75

A.2.2. Line Length


Keep lines shorter than 80 characters. Its better for lines to be too short than to be too long. 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 thats that. Congure your editor appropriately.

A.2.4. Curly braces


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

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. Dont use it if it doesnt. Bad:
1 2 3 i f ( f o o ) { bar ( ) } while ( f o o ) bar ( )

Listing A.3: Bad curly braces placement - 2 Good:


1 2 3 4 i f ( f o o ) bar ( ) while ( f o o ) { bar ( ) }

Listing A.4: Good curly braces placement - 2

A.2.5. Semicolons
Dont use them except in four situations: for (;;) loops. Theyre actually required. null loops like: while (something) ; (But youd better have a good reason for doing that.) case "foo": doSomething(); break

A.2. npms Coding Style

76

In front of a leading ( or [ at the start of the line. This prevents the expression from being interpreted as a function call or property access, respectively. Some examples of good semicolon usage:
1 2 3 4 5 6 7 8 9 10 ; ( x | | y ) . doSomething ( ) ; [ a , b , c ] . f o r E a c h ( doSomething ) f o r ( var i = 0 ; i < 1 0 ; i ++) { switch ( s t a t e ) { case " begin " : s t a r t ( ) ; c o n t i n u e case " end " : f i n i s h ( ) ; break d e f a u l t : throw new E r r o r ( " unknown state " ) } end ( ) }

Listing A.5: Good semicolon usage Note that starting lines with - and + also should be prexed with a semicolon, but this 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, put the comma at the start of the next line, directly below the token that starts the list. Put the nal token in the list on a line by itself. For example:
1 2 3 4 5 6 7 8 9 10 11 var magicWords = [ " abracadabra " , " gesundheit " , " ventrilo " ] , s p e l l s = { " fireball " : function ( ) { s e t O n F i r e ( ) } , " water " : function ( ) { putOut ( ) } } , a = 1 , b = " abc " , etc , somethingElse

Listing A.6: Comma rst

A.2.7. Whitespace
Put a single space in front of ( for anything other than a function call. Also use a single space wherever it makes things more readable. Dont leave trailing whitespace at the end of lines. Dont indent empty lines. Dont use more spaces than are helpful.

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

A.2. npms Coding Style

77

A.2.9. Callbacks, Sync/async Style


Use the asynchronous/non-blocking versions of things as much as possible. It might make more sense for npm to use the synchronous fs APIs, but this way, the fs and http and child process stu all uses the same callback-passing methodology. The callback should always be the last argument in the list. Its rst argument is the Error or null. Be very careful never to ever ever throw anything. Its worse than useless. Just send the error message back as the rst argument to the callback.

A.2.10. Errors
Always create a new Error object with your message. Dont just return a string message to 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 whats happening so that its easier to track down where a fault occurs. Use appropriate log levels. See cong(1) and search for "loglevel".

A.2.12. Case, naming, etc.


Use lowerCamelCase for multiword identiers when they refer to objects, functions, methods, members, or anything not specied in this section. Use UpperCamelCase for class names (things that youd pass to "new"). Use all-lower-hyphen-css-case for multiword lenames and cong keys. Use named functions. They make stack traces easier to follow. Use CAPS_SNAKE_CASE for constants, things that should never change and are rarely used. Use a single uppercase letter for function names where the function would normally be anonymous, but needs to call itself recursively. It makes it clear that its a "throwaway" function.

A.2.13. null, undened, false, 0


Boolean variables and functions should always be either true or false. Dont set it to 0 unless its supposed to be a number. When something is intentionally missing or removed, set it to null.

A.2. npms Coding Style

78

Dont set things to undened. Reserve that value to mean "not yet set to anything." Boolean objects are verboten.

Selain gaya penulisan kode dari NPM ini, ada beberapa lagi lainnya yang bisa dilihat, antara lain: Spludo http://spludo.com/source/coding-standards/ Google JavaScript Style Guide (http://google-styleguide.googlecode.com/svn/ trunk/javascriptguide.xml) Felixs Node.js Style Guide (http://nodeguide.com/style.html)

LAMPIRAN

Commit History dari Penulis Utama dan Kontributor

Buku ini merupakan hasil karya bersama dari beberapa penulis. Peran masing-masing penulis bisa dilihat pada bagian ringkasan dari sejarah commit. Penulis utama adalah saya (Bambang Purnomosidi D. P), sementara pada bab 5 ada kontribusi dari Aji Kisworo Mukti. Hasil log dari git menunjukkan peran masing-masing penulis (git shortlog):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 A j i Kisworo Bab 5 Bab 5 Bab 5 Mukti ( 3 ) : S t r u k t u r I n s t a l l a s i Paket Node . j s I n s t a l l a s i Paket Menghapus Paket

Bambang Purnomosidi D. P ( 6 4 ) : I n i t i a l commit F i r s t commit i n i t i a l i z i n g empty r e p o Merge branch master o f h t t p s : / / g i t h u b . com/bpdp/bukuc l o u d n o d e j s Menambahkan l i n k ke t e k s bahasa I n d o n e s i a untuk l i s e n s i CC BY SA Menambahkan l i n k ke t e k s bahasa I n d o n e s i a untuk l i s e n s i CC BY SA Menambahkan l i n k ke t e k s bahasa I n d o n e s i a untuk l i s e n s i CC BY SA Menambahkan t i p s untuk i n d e k s Melengkapi bab 1 , terutama t e n t a n g t e o r i Cloud Computing k e s a l a h a n k e c i l , t i d a k menutup t e x t i t dengan { t a p i | Menambahkan i n d e k s d a r i Bab 1 Bab 1 s e l e s a i Bab 2 b a g i a n REPL s e l e s a i Edit bagian i n s t a l a s i F l a t i r o n h a s i l d i r e k t o r i Menambahkan t e n t a n g p e n u l i s buku Bab 1 s e d i k i t k e t e r a n g a n t t g Node . j s , Bab 2 awal d a s a r 2 J a v a S c r i p t Penambahan i s i d i bab 2 dan 7 Update bab 5 > mengubah NPM mjd npm dan menambahkan Apakah npm i t u ? M a k e f i l e => buat c l e a n a l l dan c l e a n withoutpdf , bab 2 s e l e s a i R e a d l i n e t r i v i a l changes Penambahan d i bab 2 , menetapkan shadowbox untuk c a t a t a n Bab 2 : n i l a i , t i p e data , dan v a r i a b e l . Menambahkan utk c a t a t a n ke t i p s Penambahan t e n t a n g L i t e r a l dan r e o r g a n i s a s i sub bab ( f u n g s i ) Bab 2 : Pembahasan Fungsi s e l e s a i . Bab 2 L i t e r a l , s e l e s a i Bab 2 Pernyataan k o n d i s i i f . . e l s e i f . . e l s e : s e l e s a i Bab 2 JSON , s w i t c h , dan l o o p i n g f o r s e l e s a i

79

B. Commit History dari Penulis Utama dan Kontributor

80

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

Memperbaiki s e d i k i t typo , kurang s a t u { d i f o o t n o t e w i k i p e d i a utk JSON Bab 2 s e l e s a i Bab 3 p e n g e r t i a n PBO dan d e f i n i s i obyek > s e l e s a i Menambahkan A j i Kisworo Mukti ke k o n t r i b u t o r d i README. md Minor r e v i s i o n d i bab 5 , menambahkan gambar npmls ( s o a l n y a kode ASCII k e l u a r a n n y a kacau d i LaTex dan s a y a blm tau workaroundnya Mengubah c o v e r > l e b i h umum, g a n t i dg l o g o NodeJS , menambahkan A j i ke k o n t r i b u t o r , appendix B > commit h i s t d a r i k o n t r i b u t o r Menambahkan m a t e r i PBO => m e l e n g k a p i d e f i n i s i obyek s e r t a i n h e r i t a n c e . Contoh i n h e r i t a n c e . j s ditambahkan Bab 3 Pemrograman f u n g s i o n a l d i JS => p e n g e r t i a + b e b e r a p a p o i n t yg akan d i b a h a s Menambahkan i n f o t e n t a n g komas c r i p t d i README. md dan M a k e f i l e v e r s i t e r a k h i r Menambahkan n e s t e d f u n c t i o n s d i bab 2 Menambahkan source code n e s t e d . j s ( bab 2 ) Bab 3 b e b e r a p a penambahan d i pemrograman f u n g s i o n a l Bab 3 Lambda E x p r e s s i o n + c on to h Highero r d e r function Bab 3 M e n y e l e s a i k a n C l o s u r e dan C u r r y i n g d i Bab 3 . Bab 3 sudah s e l e s a i . Mengganti s t r u k t u r bab 4 > 5 dan s e b a l i k n y a . Bab 4 s e l e s a i , Bab 3 minor r e v Bab 5 > (A) Synchronous programming Bab 5 > r e o r g a n i s a s i , minor r e v i s i o n Bab 5 : EventDriven Programming menggunakan e v e n t s . EventEmitter . => Bab 5 s e l e s a i Bab 6 : S e d i k i t p e n j e l a s a n t e n t a n g db NoSQL Bab 6 menambahkan p e n j e l a s a n t t g mongoDB : f i t u r , s e r v e r , c l i e n t web Bab 6 : nodegyp dan i n s t a l a s i d r i v e r mongodb Bab 6 : menambahkan i n s t a l a s i npm untuk mongodb Bab 6 : i n s t a l l mongojs , a k s e s mongojs d a r i Node . j s . Kurang a p l i k a s i web Bab 4 : menambahkan i n f o t t g i n s t a l l ke homedir ( j i k a b era da dlm home ) dan node_modules ( j i k a d i l u a r home ) Bab 6 : memulai a p l i k a s i web dengan n o d e j s+e x p r e s s j s+mongodb Bab 6 : s r c code utk a p l i k a s i web n o d e j s+e x p r e s s+mongoDB s e l e s a i Bab 6 s e l e s a i R e o r g a n i s a s i bab 7 dan 8 , menghapus db mongoDB , menambahkan README. md utk l a t i h a n 2 d i bab 6 E d i t README. md bab 6 Menambah i s i bab 7 dan 8 Bab 8 : source code utk s o c k e t . i o Bab 8 s e l e s a i , menambahkan c on to h a p l i k a s i S o c k e t . i o S e l e s a i . s e d i k i t pembenahan . h a r i i n i bab 7 dan 8 s e l e s a i R e v i s i minor bab 6 dan 8 Menambahkan d a f t a r p u s t a k a yang digunakan R e v 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 u b a b l a s Menambahkan i n d e k s Bambang Purnomosidi D. P . ( 1 ) : Merge p u l l r e q u e s t # 1 from adzymaniac / master

Listing B.1: Commit history

Indeks

AJAX, 64 Aliran kendali, 27 Array, 24 Asynchronous, 45 Bayeux Protocol, 65 Boolean, 24 BOSH, 65 Callback, 45 Closure, 34 Cloud Computing, 1 Denisi, 1 Karakteristik, 1 Model layanan, 3 Private, 3 Public, 3 CloudFoundry, 4 vmc, 4 Comet, 65 CommonJS, 19 Currying, 34 Dynamically typed, 20 ECMAScript, 19 Ekspresi Lambda, 32 Event-Driven, 44 events.EventEmitter, 44 Floating-point, 25

Fungsi, 22 Fungsi Anonim, 23 Fungsi rekursif, 23 Higher-order Function, 33 Identier, 21 if, 27 Integer, 24 JSON, 26 Validator, 43 Konstanta, 21 Literal, 24 Looping, 28 mongoDB, 47 Driver, 52 Multitenancy, 3 MVC, 58 dan ExpressJS, 60 Nested functions, 23 Node-gyp, 51 Node.js, 4 Hosting, 4 Non-blocking IO, 45 NOSQL, 47 npm, 38 Cari paket, 40

81

Indeks Hapus paket, 40 Info paket, 41 install paket, 39 Struktur paket, 39 Update paket, 42 Obyek, 25, 35 PBO, 35 Penanganan error, 31 Pewarisan, 36 Pola arsitektur, 58 Readline, 19 Real-time Web, 64 REPL, 17 Server-Sent Events, 65 Socket.io, 66 String, 25 switch, 27 Tipe data, 20 Variabel, 21 WebSocket, 66

82

También podría gustarte