cloud computing with nodejs (indonesian)

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

description

this is a text book on cloud computing with nodejs in bahasa indonesia (indonesian)

Transcript of cloud computing with nodejs (indonesian)

Page 1: cloud computing with nodejs (indonesian)

Pengembangan Aplikasi Cloud ComputingMenggunakan Node.js

Oleh:

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

December 26, 2012

Page 2: cloud computing with nodejs (indonesian)

Kata Pengantar

Selamat datang pada workshop Pengambangan Aplikasi Cloud Computing Menggu-nakan Node.js. Workshop ini merupakan workshop yang dirancang untuk keperluanmemberikan pengetahuan mendasar pengembangan aplikasi berbasis Cloud Computing.Untuk mengikuti materi yang ada pada workshop ini, peserta diwajibkan membawa lap-top yang telah terisi berbagai software infrastruktur yang diperlukan dan peserta diwa-jibkan mengetahui penggunaan software-software tersebut:

X Sistem operasi Linux (distribusi apa saja)

X Git (untuk SCM)

X Ruby dan Rubygem

X mongoDB (basis data NOSQL)

X Vim (untuk mengedit source code)

Software utama untuk keperluan workshop ini yaitu Node.js serta command line toolsdari provider Cloud Computing (materi ini menggunakan fasilitas dari CloudFoundry),akan dibahas pada workshop. Materi akan lebih banyak berorientasi ke command line /shell sehingga para peserta sebaiknya sudah memahami cara-cara menggunakan shell diLinux.Have fun!

i

Page 3: cloud computing with nodejs (indonesian)

Daftar Isi

Kata Pengantar i

Daftar Gambar iii

Listing Program iv

Daftar Tabel v

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

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

1.8. Pengelolaan Aplikasi di Cloud . . . . . . . . . . . . . . . . . . . . . . . . . 111.8.1. Push, Delete, Update Aplikasi . . . . . . . . . . . . . . . . . . . . . 111.8.2. Menggunakan Framework ExpressJS . . . . . . . . . . . . . . . . . 111.8.3. Tanpa Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2. REPL dan Dasar-dasar JavaScript di Node.js 172.1. REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.1.1. Mengaktifkan REPL . . . . . . . . . . . . . . . . . . . . . . . . . . 17

ii

Page 4: cloud computing with nodejs (indonesian)

Daftar Isi iii

2.1.2. Perintah-perintah REPL . . . . . . . . . . . . . . . . . . . . . . . . 182.2. Dasar-dasar JavaScript di Node.js . . . . . . . . . . . . . . . . . . . . . . . 19

2.2.1. Membaca Masukan dari Stream / Masukan Standar (stdin) . . . . 192.2.2. Nilai/Value dan Tipe Data . . . . . . . . . . . . . . . . . . . . . . 202.2.3. Variabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2.4. Konstanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2.5. Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Pengertian Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . 22Definisi Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22Fungsi Anonim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Fungsi Rekursif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Fungsi di dalam Fungsi / Nested Functions . . . . . . . . . . . . . 23

2.2.6. Literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Literal Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Literal Boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Literal Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Literal Floating-point . . . . . . . . . . . . . . . . . . . . . . . . . 25Literal Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Literal String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.2.7. Struktur Data dan Representasi JSON . . . . . . . . . . . . . . . . 262.2.8. Aliran Kendali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

Pernyataan Kondisi if .. else if .. else . . . . . . . . . . . . . . . . 27Pernyataan switch . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Looping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.2.9. Penanganan Error . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3. Paradigma Pemrograman di JavaScript 323.1. Pemrograman Fungsional . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3.1.1. Ekspresi Lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.1.2. Higher-order Function . . . . . . . . . . . . . . . . . . . . . . . . . 333.1.3. Closure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.1.4. Currying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

3.2. Pemrograman Berorientasi Obyek . . . . . . . . . . . . . . . . . . . . . . . 353.2.1. Pengertian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.2.2. Definisi Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.2.3. Inheritance / Pewarisan . . . . . . . . . . . . . . . . . . . . . . . . 36

4. Mengelola Paket Menggunakan npm 384.1. Apakah npm Itu? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384.2. Menggunakan npm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.2.1. Instalasi Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394.2.2. Struktur Instalasi Paket Node.js . . . . . . . . . . . . . . . . . . . 394.2.3. Menghapus Paket / Uninstall . . . . . . . . . . . . . . . . . . . . . 404.2.4. Mencari Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Page 5: cloud computing with nodejs (indonesian)

Daftar Isi iv

4.2.5. Menampilkan Informasi Paket . . . . . . . . . . . . . . . . . . . . . 414.2.6. Memperbaharui Paket . . . . . . . . . . . . . . . . . . . . . . . . . 42

5. Node.js dan Web: Teknik Pengembangan Aplikasi 435.1. Pendahuluan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435.2. Event-Driven Programming dan EventEmitter . . . . . . . . . . . . . . . . 445.3. Asynchronous / Non-blocking IO dan Callback . . . . . . . . . . . . . . . 45

6. Mengakses Basis Data NoSQL: mongoDB 476.1. Apa itu Basis Data NoSQL? . . . . . . . . . . . . . . . . . . . . . . . . . . 476.2. Mengenal mongoDB dan Fitur-fiturnya . . . . . . . . . . . . . . . . . . . . 47

6.2.1. Memulai Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486.2.2. Klien dan Shell mongoDB . . . . . . . . . . . . . . . . . . . . . . . 496.2.3. Documents dan Collections . . . . . . . . . . . . . . . . . . . . . . 49

6.3. Node.js dan MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.3.1. Node-gyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.3.2. Driver Node.js untuk mongoDB . . . . . . . . . . . . . . . . . . . . 526.3.3. Mengakses mongoDB dari Node.js . . . . . . . . . . . . . . . . . . 53

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

7. Pola Arsitektur Aplikasi Web: MVC dan ExpressJS 587.1. Apa itu Pola Arsitektur? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587.2. Pola Arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS . . . . . . . 60

7.3.1. Struktur Aplikasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607.3.2. File-file yang Diperlukan . . . . . . . . . . . . . . . . . . . . . . . . 617.3.3. Hasil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

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

8. Real-time Web Menggunakan Socket.io 648.1. Apa itu Real-time Web? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648.2. Teknologi Pendukung Real-time Web . . . . . . . . . . . . . . . . . . . . . 64

8.2.1. Ajax Technology . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648.2.2. Comet dan Push Technology . . . . . . . . . . . . . . . . . . . . . . 65

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

8.2.3. WebSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668.3. Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

8.3.1. Apa itu Socket.io? . . . . . . . . . . . . . . . . . . . . . . . . . . . 668.3.2. Menggunakan Socket.io untuk Real-time Web . . . . . . . . . . . . 67

Tentang Aplikasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67Membuat Kerangka Aplikasi dengan ExpressJS . . . . . . . . . . . 67Instalasi Paket yang Diperlukan . . . . . . . . . . . . . . . . . . . . 68

Page 6: cloud computing with nodejs (indonesian)

Daftar Isi v

Konfigurasi JavaScript untuk Browser . . . . . . . . . . . . . . . . 68Hapus File yang Tidak Diperlukan . . . . . . . . . . . . . . . . . . 68Ubah File-file Tertentu . . . . . . . . . . . . . . . . . . . . . . . . . 69Menjalankan Server Socket.io . . . . . . . . . . . . . . . . . . . . . 70

Daftar Pustaka 72

Lampiran 74

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

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

B. Commit History dari Penulis Utama dan Kontributor 79

Indeks 80

Page 7: cloud computing with nodejs (indonesian)

Daftar Gambar

1.1. Model Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2. Pendaftaran di CF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3. Hasil proses pendaftaran di CF . . . . . . . . . . . . . . . . . . . . . . . . 61.4. E-mail persetujuan dan pemberitahuan credentials . . . . . . . . . . . . . 71.5. Hasil push ke server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.6. Hasil update dengan menyertakan versi Node.js . . . . . . . . . . . . . . . 151.7. Deployement menggunakan versi runtime tertentu . . . . . . . . . . . . . . 151.8. Hasil deployement app.js tanpa framework . . . . . . . . . . . . . . . . . . 16

4.1. Hasil perintah npm ls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

6.1. Admin web console untuk mongoDB . . . . . . . . . . . . . . . . . . . . . 50

7.1. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597.2. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

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

vi

Page 8: cloud computing with nodejs (indonesian)

Listing Program

1.1. Instalasi vmc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2. Hasil gem yang terinstall . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3. Mengaktifkan direktori "bin" hasil instalasi gem . . . . . . . . . . . . . . . 61.4. Hasil opsi help dari vmc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.5. Mengubah target server . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.6. Login ke server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.7. Mengubah password server . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.8. Hasil dari download Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . 101.9. Ekstraksi Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.10. Konfigurasi variabel lingkungan Node.js . . . . . . . . . . . . . . . . . . . 111.11. Instalasi ExpressJS menggunakan npm . . . . . . . . . . . . . . . . . . . . 121.12. package.json untuk ExpressJS . . . . . . . . . . . . . . . . . . . . . . . . . 131.13. app.js untuk ExpressJS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.14. Deployment aplikasi ExpressJS ke CF . . . . . . . . . . . . . . . . . . . . 131.15. Update: menambahkan versi Node.js ke app.js . . . . . . . . . . . . . . . . 141.16. Mengupdate aplikasi di server . . . . . . . . . . . . . . . . . . . . . . . . . 141.17. Menghapus aplikasi yang di-deploy di CF . . . . . . . . . . . . . . . . . . 151.18. Deployment ke CF dengan memilih runtime Node.js . . . . . . . . . . . . 151.19. app.js tanpa framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.20. Deployment app.js tanpa framework . . . . . . . . . . . . . . . . . . . . . 16

2.1. Node.js REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.2. Contoh penggunaan .load dalam REPL . . . . . . . . . . . . . . . . . . . . 182.3. Contoh penggunaan perintah .save di sesi REPL . . . . . . . . . . . . . . 182.4. readline.js: penggunaan pustaka Readline untuk masukan . . . . . . . . . 202.5. Hasil eksekusi readline.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.6. Fitur dynamically typed language . . . . . . . . . . . . . . . . . . . . . . . 212.7. Contoh konstanta dalam JavaScript . . . . . . . . . . . . . . . . . . . . . . 21

vii

Page 9: cloud computing with nodejs (indonesian)

Listing Program viii

2.8. Sintaksis Fungsi dalam JavaScript . . . . . . . . . . . . . . . . . . . . . . . 222.9. Pemanggilan Fungsi dalam JavaScript . . . . . . . . . . . . . . . . . . . . 222.10. Contoh deklarasi fungsi dan pemanggilannya . . . . . . . . . . . . . . . . 222.11. Fungsi anonim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.12. Fungsi rekursif untuk menghitung faktorial . . . . . . . . . . . . . . . . . 232.13. Fungsi di dalam Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.14. Array di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.15. Representasi JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.16. Pernyataan if .. else if .. else . . . . . . . . . . . . . . . . . . . . . . . . . 272.17. Pernyataan if .. else if .. else . . . . . . . . . . . . . . . . . . . . . . . . . 272.18. Pernyataan for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.19. Pernyataan for .. in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.20. Pernyataan do .. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.21. Pernyataan while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.22. Pernyataan break dan continue . . . . . . . . . . . . . . . . . . . . . . . . 302.23. Pernyataan break dengan label . . . . . . . . . . . . . . . . . . . . . . . . 302.24. Pernyataan break dengan label . . . . . . . . . . . . . . . . . . . . . . . . 312.25. Pernyataan break dengan label . . . . . . . . . . . . . . . . . . . . . . . . 31

3.1. Ekspresi Lambda di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . 333.2. Higher-order Function di JavaScript . . . . . . . . . . . . . . . . . . . . . 333.3. Closure di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.4. Currying di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.5. Definisi obyek di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . 353.6. Pewarisan di PBO JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . 36

4.1. Sintaksis lengkap perintah npm . . . . . . . . . . . . . . . . . . . . . . . . 384.2. Cara install paket menggunakan npm . . . . . . . . . . . . . . . . . . . . . 394.3. Argumen npm untuk melihat daftar paket terpasang . . . . . . . . . . . . 404.4. Perintah menghapus paket di npm . . . . . . . . . . . . . . . . . . . . . . 404.5. Perintah menghapus paket di npm . . . . . . . . . . . . . . . . . . . . . . 404.6. Menampilkan rincian suatu paket dalam format JSON . . . . . . . . . . . 414.7. Memperbaharui paket lokal . . . . . . . . . . . . . . . . . . . . . . . . . . 424.8. Memperbaharui paket secara global . . . . . . . . . . . . . . . . . . . . . . 42

5.1. pegawai.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435.2. server.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.3. server-on-error.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.4. Membaca file secara synchronous . . . . . . . . . . . . . . . . . . . . . . . 455.5. Membaca file secara asynchronous . . . . . . . . . . . . . . . . . . . . . . 46

6.1. Menjalankan server MongoDB (mongod) . . . . . . . . . . . . . . . . . . . 486.2. Mengakhiri server MongoDB (mongod) . . . . . . . . . . . . . . . . . . . . 496.3. Shell mongoDB (mongo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496.4. Sesi dalam shell mongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

Page 10: cloud computing with nodejs (indonesian)

Listing Program ix

6.5. Instalasi node-gyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.6. Instalasi driver mongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.7. Instalasi driver mongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.8. Mengakses mongoDB dari Node.js . . . . . . . . . . . . . . . . . . . . . . 536.9. Mengakses mongoDB dari Node.js . . . . . . . . . . . . . . . . . . . . . . 546.10. app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556.11. package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.12. routes/employee.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.13. views/employee.jade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.14. views/index.jade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

7.1. Struktur direktori asli aplikasi ExpressJS . . . . . . . . . . . . . . . . . . . 607.2. Struktur direktori ExpressJS sesuai pola MVC . . . . . . . . . . . . . . . 607.3. app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617.4. controllers/user.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617.5. models/db.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.6. package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

8.1. Membuat kerangka aplikasi dengan ExpressJS . . . . . . . . . . . . . . . . 678.2. package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688.3. Isi direktori dist di socket.io-client . . . . . . . . . . . . . . . . . . . . . . 688.4. app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698.5. views/index.jade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698.6. routes/index.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698.7. Menjalankan server Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . 708.8. Kode sumber di browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

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

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

Page 11: cloud computing with nodejs (indonesian)

Daftar Tabel

x

Page 12: cloud computing with nodejs (indonesian)

BAB 1

Pengenalan Cloud Computing dan Infrastruktur Pengembangan AplikasiBerbasis Node.js

1.1. Apa itu Cloud Computing?

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

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

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

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

1.2. Karakteristik Cloud Computing

Menurut NIST, ada beberapa karakteristik dari Cloud Computing:

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

1

Page 13: cloud computing with nodejs (indonesian)

1.2. Karakteristik Cloud Computing 2

Gambar 1.1.: Model Cloud Computing

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

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

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

X Rapid elasticity: skalabilitas.

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

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

Page 14: cloud computing with nodejs (indonesian)

1.3. Public dan Private Cloud Computing 3

bekerja dengan instan aplikasi virtual tersebut5.

1.3. Public dan Private Cloud Computing

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

1.4. Model Layanan Cloud Computing

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

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

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

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

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

1.5. Pengembangan Aplikasi di Cloud Computing

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

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

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

Page 15: cloud computing with nodejs (indonesian)

1.6. Node.js dan Cloud Computing 4

X Coding

X Test di komputer lokal

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

X Edit - push

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

1.6. Node.js dan Cloud Computing

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

1.7. Layanan Hosting Aplikasi: CloudFoundry

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

1.7.1. Pendaftaran

Untuk menggunakan fasilitas dari CF, kita akan mendaftar lebih dahulu di URL https://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 dikir-imkan ke e-mail kita seperti pada Gambar 1.4.

1.7.2. Instalasi Command Line Utilities

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

Page 16: cloud computing with nodejs (indonesian)

1.7. Layanan Hosting Aplikasi: CloudFoundry 5

Gambar 1.2.: Pendaftaran di CF

1 $ gem search vmc −−remote | grep "\bvmc\ s "2 vmc ( 0 . 3 . 2 1 )3 $ gem i n s t a l l vmc4 Fetching : multi_json −1 . 3 . 6 . gem (100%)5 Fetching : cfoundry −0 .3 . 34 . gem (100%)6 Fetching : vmc−0 .3 . 21 . gem (100%)7 Su c c e s s f u l l y i n s t a l l e d multi_json −1.3 .68 Su c c e s s f u l l y i n s t a l l e d cfoundry −0.3.349 Su c c e s s f u l l y i n s t a l l e d vmc−0.3.21

10 3 gems i n s t a l l e d11 I n s t a l l i n g r i documentation for multi_json − 1 . 3 . 6 . . .12 I n s t a l l i n g r i documentation for cfoundry − 0 . 3 . 3 4 . . .13 I n s t a l l i n g r i documentation for vmc− 0 . 3 . 2 1 . . .14 I n s t a l l i n g RDoc documentation for multi_json − 1 . 3 . 6 . . .15 I n s t a l l i n g RDoc documentation for cfoundry − 0 . 3 . 3 4 . . .16 I n s t a l l i n g RDoc documentation for vmc− 0 . 3 . 2 1 . . .17 $

Listing 1.1: Instalasi vmc

Hasil dari instalasi tersebut adalah sebagai berikut:1 $ gem l i s t23 ∗∗∗ LOCAL GEMS ∗∗∗45 addre s sab l e ( 2 . 2 . 8 )

Page 17: cloud computing with nodejs (indonesian)

1.7. Layanan Hosting Aplikasi: CloudFoundry 6

Gambar 1.3.: Hasil proses pendaftaran di CF

6 a f ( 0 . 3 . 1 8 . 6 )7 b igdec imal ( 1 . 1 . 0 )8 cfoundry ( 0 . 3 . 3 4 )9 i n t e r a c t ( 0 . 4 . 8 )

10 io−conso l e ( 0 . 3 )11 j son ( 1 . 5 . 4 )12 json_pure ( 1 . 6 . 7 )13 mime−types ( 1 . 1 9 )14 min i t e s t ( 2 . 5 . 1 )15 multi_json ( 1 . 3 . 6 )16 rake ( 0 . 9 . 2 . 2 )17 rb−r e ad l i n e ( 0 . 4 . 2 )18 rdoc ( 3 . 9 . 4 )19 re s t−c l i e n t ( 1 . 6 . 7 )20 rubyzip ( 0 . 9 . 9 )21 terminal−t ab l e ( 1 . 4 . 5 )22 uu id too l s ( 2 . 1 . 3 )23 vmc ( 0 . 3 . 2 1 )24 $

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 / bin

Listing 1.3: Mengaktifkan direktori "bin" hasil instalasi gem

Periksa dengan menjalankan opsi help dari vmc:

Page 18: cloud computing with nodejs (indonesian)

1.7. Layanan Hosting Aplikasi: CloudFoundry 7

Gambar 1.4.: E-mail persetujuan dan pemberitahuan credentials

1 $ vmc help23 Usage : vmc [ opt ions ] command [<args >] [ command_options ]4 Try ’vmc help [command] ’ or ’vmc help opt ions ’ for more in fo rmat ion .56 Current ly a v a i l a b l e vmc commands are :78 Gett ing Started9 ta r g e t [ u r l ] Reports cur r ent t a r g e t or s e t s a new ta rg e t

10 l o g i n [ emai l ] [−−email , −−passwd ] Login11 i n f o System and account in fo rmat ion1213 App l i ca t i ons14 apps L i s t deployed app l i c a t i o n s1516 Appl i ca t ion Creat ion17 push [ appname ] Create , push , map , and s t a r t a new app l i c a t i o n18 push [ appname ] −−path Push app l i c a t i on from s p e c i f i e d path19 push [ appname ] −−u r l Set the u r l for the app l i c a t i on20 push [ appname ] −−i n s t an c e s <N> Set the expected number <N> of i n s t an c e s21 push [ appname ] −−mem M Set the memory r e s e r v a t i o n for the app l i c a t i on22 push [ appname ] −−runtime RUNTIME Set the runtime to use for the app l i c a t i on23 push [ appname ] −−debug [MODE] Push app l i c a t i o n and s t a r t in a debug mode

Page 19: cloud computing with nodejs (indonesian)

1.7. Layanan Hosting Aplikasi: CloudFoundry 8

24 push [ appname ] −−no−s t a r t Do not auto−s t a r t the app l i c a t i on2526 Appl i ca t ion Operat ions27 s t a r t <appname> [−−debug [MODE] ] S ta r t the app l i c a t i on28 stop <appname> Stop the app l i c a t i on29 r e s t a r t <appname> [−−debug [MODE] ] Restart the app l i c a t i on30 d e l e t e <appname> Delete the app l i c a t i o n3132 Appl i ca t ion Updates33 update <appname> [−−path ,−−debug [MODE] ] Update the app l i c a t i on b i t s34 mem <appname> [ memsize ] Update the memory r e s e r v a t i o n for an app l i c a t i on35 map <appname> <url> Reg i s t e r the app l i c a t i o n to the u r l36 unmap <appname> <url> Unreg i s t e r the app l i c a t i o n from the u r l37 i n s t an c e s <appname> <num| de l ta> Sca l e the app l i c a t i o n i n s t an c e s up or down3839 Appl i ca t ion In format ion40 c ra she s <appname> L i s t r e c en t app l i c a t i on c ra she s41 c r a sh l o g s <appname> Display log in fo rmat ion for crashed app l i c a t i o n s42 l o g s <appname> [−− a l l ] Display log in fo rmat ion for the app l i c a t i on43 f i l e s <appname> [ path ] [−− a l l ] Display d i r e c t o r y l i s t i n g or f i l e download for44 [ path ]45 s t a t s <appname> Display r e sou r c e usage for the app l i c a t i on46 i n s t an c e s <appname> L i s t app l i c a t i o n i n s t an c e s4748 Appl i ca t ion Environment49 env <appname> L i s t app l i c a t i o n environment v a r i a b l e s50 env−add <appname> <va r i ab l e [=] value> Add an environment va r i ab l e to an app l i c a t i o n51 env−de l <appname> <var i ab l e > Delete an environment va r i ab l e to an app l i c a t i on5253 S e r v i c e s54 s e r v i c e s 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 prov i s i oned55 create−s e r v i c e <s e rv i c e > [−−name,−−bind ] Create a prov i s i oned s e r v i c e56 create−s e r v i c e <s e rv i c e > <name> Create a p rov i s i oned s e r v i c e and a s s i gn i t <name>57 create−s e r v i c e <s e rv i c e > <name> <app> Create a prov i s i oned s e r v i c e and a s s i gn i t <name>,58 and bind to <app>59 de l e t e−s e r v i c e [ serv icename ] De lete a p rov i s i oned s e r v i c e60 bind−s e r v i c e <servicename> <appname> Bind a s e r v i c e to an app l i c a t i on61 unbind−s e r v i c e <servicename> <appname> Unbind s e r v i c e from the app l i c a t i on62 clone−s e r v i c e s <src−app> <dest−app> Clone s e r v i c e b ind ings from <src−app> app l i c a t i on63 to <dest−app>64 tunne l <servicename> [−−port ] Create a local tunne l to a s e r v i c e65 tunne l <servicename> <cl ientcmd> Create a local tunne l to a s e r v i c e and s t a r t a66 local c l i e n t6768 Administ rat ion69 user Display user account in fo rmat ion70 passwd Change the password for the cur rent user71 logout Logs cur rent user out o f the t a r g e t system72 add−user [−−email , −−passwd ] Reg i s t e r a new user ( r e qu i r e s admin p r i v i l e g e s )73 de l e t e−user <user> Delete a user and a l l apps and s e r v i c e s ( r e qu i r e s74 admin p r i v i l e g e s )7576 System77 runtimes Display the supported runtimes o f the t a r g e t78 system79 frameworks Display the recogn i z ed frameworks o f the t a r g e t80 system8182 Micro Cloud Foundry83 micro s t a tu s Display Micro Cloud Foundry VM sta tu s84 micro o f f l i n e Conf igure Micro Cloud Foundry VM for o f f l i n e mode85 micro on l i n e Conf igure Micro Cloud Foundry VM for on l i n e mode

Page 20: cloud computing with nodejs (indonesian)

1.7. Layanan Hosting Aplikasi: CloudFoundry 9

86 [−−vmx f i l e ] Path to micro . vmx87 [−−vmrun executab l e ] Path to vmrun executab l e88 [−−password c l e a r t e x t ] C l ea r t ex t password for guest VM vcap user89 [−−save ] Save c l e a r t e x t password in ~/. vmc_micro9091 Misc92 a l i a s e s L i s t a l i a s e s93 al ias <al ias [=]command> Create an al ias for a command94 unalias <alias> Remove an al ias95 t a r g e t s L i s t known t a r g e t s and a s s o c i a t ed au tho r i z a t i on96 tokens9798 Help99 help [command] Get gene ra l he lp or he lp on a s p e c i f i c command

100 help opt ions Get help on av a i l a b l e opt ions101102 $

Listing 1.4: Hasil opsi help dari vmc

1.7.3. Konfigurasi di Server Cloud

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

1 $ vmc ta r g e t23 [ http :// api . vcap .me ]45 $ vmc ta r g e t api . c loudfoundry . com6 Su c c e s s f u l l y ta rge t ed to [ http :// api . c loudfoundry . com ]78 $ vmc ta r g e t9

10 [ http :// api . c loudfoundry . com ]1112 $

Listing 1.5: Mengubah target server

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

1 $ vmc l o g i n2 Attempting l o g i n to [ http :// api . c loudfoundry . com ]3 Email : bambangpdp@yahoo . com4 Password : ∗∗∗∗∗∗∗∗5 Su c c e s s f u l l y logged in to [ http :// api . c loudfoundry . com ]67 $ vmc i n f o89 VMware ’ s Cloud Appl i ca t ion Platform

10 For support v i s i t http :// support . c loudfoundry . com1112 Target : http :// api . c loudfoundry . com ( v0 . 999 )13 C l i en t : v0 . 3 . 2 11415 User : bambangpdp@yahoo . com16 Usage : Memory (0B o f 2 . 0G t o t a l )

Page 21: cloud computing with nodejs (indonesian)

1.7. Layanan Hosting Aplikasi: CloudFoundry 10

17 S e r v i c e s (0 o f 16 t o t a l )18 Apps (0 o f 20 t o t a l )1920 $ vmc runtimes2122 +−−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−+23 | Name | Desc r ip t i on | Vers ion |24 +−−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−+25 | java | Java 6 | 1 . 6 |26 | java7 | Java 7 | 1 . 7 |27 | node | Node . j s | 0 . 4 . 1 2 |28 | node06 | Node . j s | 0 . 6 . 8 |29 | node08 | Node . j s | 0 . 8 . 2 |30 | ruby18 | Ruby 1 .8 | 1 . 8 . 7 |31 | ruby19 | Ruby 1 .9 | 1 . 9 . 2 p180 |32 +−−−−−−−−+−−−−−−−−−−−−−+−−−−−−−−−−−+3334 $

Listing 1.6: Login ke server

Untuk mengubah password:1 $ vmc passwd2 Changing password for ’ bambangpdp@yahoo . com ’3 New Password : ∗∗∗∗∗∗∗∗4 Ver i f y Password : ∗∗∗∗∗∗∗∗56 Su c c e s s f u l l y changed password78 $

Listing 1.7: Mengubah password server

1.7.4. Instalasi dan Konfigurasi Node.js di Komputer Lokal

Node.js tersedia untuk Linux, Windows, Mac OS X, serta SunOS. Untuk versi Linux,kebanyakan distro sudah menyertakan paket Node.js, hanya saja ada banyak versi dariNode.js dan jika kita menggunakan manajemen paket dari distro Linux, kita hanya bisamenginstall 1 versi saja. Sebagai contoh, di Arch Linux, paket Node.js bisa diinstralldengan perintah “pacman -S nodejs” tetapi hanya pada versi resmi di repo Arch (saatbuku 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.

X Ambil paket binary executable dari http://nodejs/download atau langsung kehttp://nodejs.org/dist/. Versi yang digunakan disini adalah 0.8.11.

1 $ l s −l a2 t o t a l 43203 drwxr−xr−x 2 bpdp use r s 4096 Oct 3 06 :08 .4 drwxr−xr−x 22 bpdp use r s 4096 Oct 3 16 :17 . .5 −rw−r−−r−− 1 bpdp use r s 4406113 Oct 3 06 :19 node−v0 .8.11− l inux−x86 . ta r . gz6 $

Listing 1.8: Hasil dari download Node.js

Page 22: cloud computing with nodejs (indonesian)

1.8. Pengelolaan Aplikasi di Cloud 11

X Ekstrak ke direktori yang diinginkan:1 $ ta r −xzvf ~/master / node j s /node−v0 .8.11− l inux−x86 . ta r . gz2 $ ln −s node−v0 .8.11− l inux−x86 node j s3 $ l s −l a4 . . . .5 . . . .6 drwxr−xr−x 6 bpdp use r s 4096 Aug 16 06 :18 node−v0 .8.11− l inux−x867 lrwxrwxrwx 1 bpdp use r s 21 Aug 17 06 :37 node j s −> node−v0 .8.11− l inux−x868 . . . .9 . . . .

10 $

Listing 1.9: Ekstraksi Node.js

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

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

10 export MANPATH11 export LD_LIBRARY_PATH12 export C_INCLUDE_PATH13 export CPLUS_INCLUDE_PATH

Listing 1.10: Konfigurasi variabel lingkungan Node.js

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

1.8. Pengelolaan Aplikasi di Cloud

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

1.8.1. Push, Delete, Update Aplikasi

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

1.8.2. Menggunakan Framework ExpressJS

Page 23: cloud computing with nodejs (indonesian)

1.8. Pengelolaan Aplikasi di Cloud 12

1 [ bpdp@bpdp−arch modul−1]$ mkdir h e l l o2 [ bpdp@bpdp−arch modul−1]$ cd h e l l o /3 [ bpdp@bpdp−arch h e l l o ] $ source ~/environment/ node j s4 [ bpdp@bpdp−arch h e l l o ] $ npm i n s t a l l expre s s5 npm http GET https : // r e g i s t r y . npmjs . org / expre s s6 npm http 200 https : // r e g i s t r y . npmjs . org / expre s s7 npm http GET https : // r e g i s t r y . npmjs . org / expre s s/−/express −3.0 .0 rc4 . tgz8 npm http 200 https : // r e g i s t r y . npmjs . org / expre s s/−/express −3.0 .0 rc4 . tgz9 npm http GET https : // r e g i s t r y . npmjs . org / connect / 2 . 4 . 4

10 npm http GET https : // r e g i s t r y . npmjs . org / send /0 . 0 . 411 npm http GET https : // r e g i s t r y . npmjs . org /commander / 0 . 6 . 112 npm http GET https : // r e g i s t r y . npmjs . org / range−par s e r / 0 . 0 . 413 npm http GET https : // r e g i s t r y . npmjs . org / c rc / 0 . 2 . 014 npm http GET https : // r e g i s t r y . npmjs . org /mkdirp / 0 . 3 . 315 npm http GET https : // r e g i s t r y . npmjs . org / f r e s h / 0 . 1 . 016 npm http GET https : // r e g i s t r y . npmjs . org /methods / 0 . 0 . 117 npm http GET https : // r e g i s t r y . npmjs . org /debug18 npm http GET https : // r e g i s t r y . npmjs . org / cook i e / 0 . 0 . 419 npm http 200 https : // r e g i s t r y . npmjs . org / c rc / 0 . 2 . 020 npm http GET https : // r e g i s t r y . npmjs . org / c rc/−/crc −0 . 2 . 0 . tgz21 npm http 200 https : // r e g i s t r y . npmjs . org / range−par s e r / 0 . 0 . 422 npm http GET https : // r e g i s t r y . npmjs . org / range−par s e r/−/range−parser −0 . 0 . 4 . tgz23 npm http 200 https : // r e g i s t r y . npmjs . org /commander / 0 . 6 . 124 npm http GET https : // r e g i s t r y . npmjs . org /commander/−/commander−0 . 6 . 1 . tgz25 npm http 200 https : // r e g i s t r y . npmjs . org / connect / 2 . 4 . 426 npm http GET https : // r e g i s t r y . npmjs . org / connect/−/connect −2 . 4 . 4 . tgz27 npm http 200 https : // r e g i s t r y . npmjs . org / send /0 . 0 . 428 npm http GET https : // r e g i s t r y . npmjs . org / send/−/send −0 . 0 . 4 . tgz29 npm http 200 https : // r e g i s t r y . npmjs . org /mkdirp / 0 . 3 . 330 npm http GET https : // r e g i s t r y . npmjs . org /mkdirp/−/mkdirp −0 . 3 . 3 . tgz31 npm http 200 https : // r e g i s t r y . npmjs . org / f r e s h / 0 . 1 . 032 npm http GET https : // r e g i s t r y . npmjs . org / f r e s h /−/ f r e sh −0 . 1 . 0 . tgz33 npm http 200 https : // r e g i s t r y . npmjs . org /methods / 0 . 0 . 134 npm http GET https : // r e g i s t r y . npmjs . org /methods/−/methods −0 . 0 . 1 . tgz35 npm http 200 https : // r e g i s t r y . npmjs . org / cook i e / 0 . 0 . 436 npm http GET https : // r e g i s t r y . npmjs . org / cook i e/−/cookie −0 . 0 . 4 . tgz37 npm http 200 https : // r e g i s t r y . npmjs . org / c rc/−/crc −0 . 2 . 0 . tgz38 npm http 200 https : // r e g i s t r y . npmjs . org / range−par s e r/−/range−parser −0 . 0 . 4 . tgz39 npm http 200 https : // r e g i s t r y . npmjs . org /debug40 npm http 200 https : // r e g i s t r y . npmjs . org /commander/−/commander−0 . 6 . 1 . tgz41 npm http 200 https : // r e g i s t r y . npmjs . org / connect/−/connect −2 . 4 . 4 . tgz42 npm http 200 https : // r e g i s t r y . npmjs . org / send/−/send −0 . 0 . 4 . tgz43 npm http 200 https : // r e g i s t r y . npmjs . org /mkdirp/−/mkdirp −0 . 3 . 3 . tgz44 npm http 200 https : // r e g i s t r y . npmjs . org / f r e s h /−/ f r e sh −0 . 1 . 0 . tgz45 npm http 200 https : // r e g i s t r y . npmjs . org /methods/−/methods −0 . 0 . 1 . tgz46 npm WARN package . j son methods@0 . 0 . 1 No README.md f i l e found !47 npm http 200 https : // r e g i s t r y . npmjs . org / cook i e/−/cookie −0 . 0 . 4 . tgz48 npm http GET https : // r e g i s t r y . npmjs . org /mime/1 . 2 . 649 npm http GET https : // r e g i s t r y . npmjs . org /qs / 0 . 4 . 250 npm http GET https : // r e g i s t r y . npmjs . org / bytes / 0 . 1 . 051 npm http GET https : // r e g i s t r y . npmjs . org / formidab le /1 . 0 . 1 152 npm http GET https : // r e g i s t r y . npmjs . org /pause / 0 . 0 . 153 npm http 200 https : // r e g i s t r y . npmjs . org /qs / 0 . 4 . 254 npm http GET https : // r e g i s t r y . npmjs . org /qs/−/qs −0 . 4 . 2 . tgz55 npm http 200 https : // r e g i s t r y . npmjs . org /mime/1 . 2 . 656 npm http GET https : // r e g i s t r y . npmjs . org /mime/−/mime−1 . 2 . 6 . tgz57 npm http 200 https : // r e g i s t r y . npmjs . org /pause / 0 . 0 . 158 npm http GET https : // r e g i s t r y . npmjs . org /pause/−/pause −0 . 0 . 1 . tgz59 npm http 200 https : // r e g i s t r y . npmjs . org / formidab le /1 . 0 . 1 160 npm http GET https : // r e g i s t r y . npmjs . org / formidab le/−/formidable −1 .0 . 11 . tgz61 npm http 200 https : // r e g i s t r y . npmjs . org / bytes / 0 . 1 . 0

Page 24: cloud computing with nodejs (indonesian)

1.8. Pengelolaan Aplikasi di Cloud 13

62 npm http GET https : // r e g i s t r y . npmjs . org / bytes/−/bytes −0 . 1 . 0 . tgz63 npm http 200 https : // r e g i s t r y . npmjs . org /mime/−/mime−1 . 2 . 6 . tgz64 npm http 200 https : // r e g i s t r y . npmjs . org /qs/−/qs −0 . 4 . 2 . tgz65 npm http 200 https : // r e g i s t r y . npmjs . org /pause/−/pause −0 . 0 . 1 . tgz66 npm http 200 https : // r e g i s t r y . npmjs . org / formidab le/−/formidable −1 .0 . 11 . tgz67 npm http 200 https : // r e g i s t r y . npmjs . org / bytes/−/bytes −0 . 1 . 0 . tgz68 express@3 . 0 . 0 rc4 node_modules/ expre s s69 methods@0 . 0 . 170 fresh@0 . 1 . 071 range−parser@0 . 0 . 472 cookie@0 . 0 . 473 crc@0 . 2 . 074 commander@0 . 6 . 175 debug@0 . 7 . 076 mkdirp@0 . 3 . 377 send@0 . 0 . 4 (mime@1 . 2 . 6 )78 connect@2 . 4 . 4 ( pause@0 . 0 . 1 , bytes@0 . 1 . 0 , qs@0 . 4 . 2 , formidable@1 . 0 . 1 1 )79 [ bpdp@bpdp−arch h e l l o ] $ l s −l a80 t o t a l 1281 drwxr−xr−x 3 bpdp use r s 4096 Sep 25 22 :31 .82 drwxr−xr−x 3 bpdp use r s 4096 Sep 25 22 :31 . .83 drwxr−xr−x 4 bpdp use r s 4096 Sep 25 22 :31 node_modules

Listing 1.11: Instalasi ExpressJS menggunakan npm

Aplikasi yang dibuat terdiri atas package.json untuk mendefinisikan aplikasi sertadependensi-nya dan app.js yang merupakan file utama untuk dijalankan pada server.

1 {2 "name" : "hello -node" ,3 "version" : "0.0.1" ,4 "dependencies" : {5 "express" : ""6 }7 }

Listing 1.12: package.json untuk ExpressJS

1 var app = r equ i r e ( ’express ’ ) . c r e a t eS e rv e r ( ) ;2 app . get ( ’/’ , function ( req , r e s ) {3 r e s . send ( ’Hello from Cloud Foundry ’ ) ;4 } ) ;5 app . l i s t e n ( 3000 ) ;

Listing 1.13: app.js untuk ExpressJS

Proses deployment digambarkan sebagai berikut:1 $ vmc ta r g e t api . c loudfoundry . com2 Su c c e s s f u l l y ta rge t ed to [ http :// api . c loudfoundry . com ]34 $ vmc l o g i n5 Attempting l o g i n to [ http :// api . c loudfoundry . com ]6 Email : bambangpdp@yahoo . com7 Password : ∗∗∗∗∗∗∗∗8 Su c c e s s f u l l y logged in to [ http :// api . c loudfoundry . com ]9

10 $ vmc push11 Would you l i k e to deploy from the cur rent d i r e c t o r y ? [Yn ] : Y12 Appl i ca t ion Name : modul1−h e l l o13 Detected a Node . j s Appl icat ion , i s t h i s c o r r e c t ? [Yn ] : Y

Page 25: cloud computing with nodejs (indonesian)

1.8. Pengelolaan Aplikasi di Cloud 14

Gambar 1.5.: Hasil push ke server

14 Appl i ca t ion Deployed URL [ modul1−h e l l o . c loudfoundry . com ] :15 Memory r e s e r v a t i o n (128M, 256M, 512M, 1G, 2G) [64M] :16 How many in s t an c e s ? [ 1 ] :17 Create s e r v i c e s to bind to ’modul1−he l l o ’ ? [ yN ] :18 Would you l i k e to save t h i s c on f i gu r a t i on ? [yN ] : N19 Creat ing Appl i ca t ion : OK20 Uploading Appl i ca t ion :21 Checking for av a i l a b l e r e s ou r c e s : OK22 Proce s s ing r e s ou r c e s : OK23 Packing app l i c a t i on : OK24 Uploading (41K) : OK25 Push Status : OK26 Staging Appl i ca t ion ’modul1−he l l o ’ : OK27 Sta r t i ng Appl i ca t ion ’modul1−he l l o ’ : OK2829 $

Listing 1.14: Deployment aplikasi ExpressJS ke CF

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

fasilitas untuk Mengupdate aplikasi.1 var expre s s = r equ i r e ( "express" ) ;2 var app = expre s s ( ) ;34 app . get ( ’/’ , function ( req , r e s ) {5 r e s . send ( ’Hello from Cloud Foundry with NodeJS ’ + proce s s . v e r s i on ) ;6 } ) ;7 app . l i s t e n ( 3000 ) ;8 $

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

1 $ vmc update modul1−h e l l o2 Uploading Appl i ca t ion :3 Checking for av a i l a b l e r e s ou r c e s : OK4 Proce s s ing r e s ou r c e s : OK5 Packing app l i c a t i on : OK6 Uploading (15K) : OK7 Push Status : OK8 Stopping Appl i ca t ion ’modul1−he l l o ’ : OK9 Staging Appl i ca t ion ’modul1−he l l o ’ : OK

10 Sta r t i ng Appl i ca t ion ’modul1−he l l o ’ : OK1112 $

Listing 1.16: Mengupdate aplikasi di server

Hasilnya bisa dilihat di Gambar 1.6

Page 26: cloud computing with nodejs (indonesian)

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 $ vmc de l e t e modul1−h e l l o2 De l e t ing app l i c a t i o n [ modul1−h e l l o ] : OK34 $

Listing 1.17: Menghapus aplikasi yang di-deploy di CF

Pada saat deployment, kita juga bisa memilih versi Node.js (runtime) sebagai berikut:1 [ bpdp@bpdp−arch h e l l o ] $ vmc push −−runtime=node082 Would you l i k e to deploy from the cur rent d i r e c t o r y ? [Yn ] : Y3 Appl i ca t ion Name : bpdp−m1−h e l l o4 Detected a Node . j s Appl icat ion , i s t h i s c o r r e c t ? [Yn ] : Y5 Appl i ca t ion Deployed URL [ bpdp−m1−h e l l o . c loudfoundry . com ] :6 Memory r e s e r v a t i o n (128M, 256M, 512M, 1G, 2G) [64M] :7 How many in s t an c e s ? [ 1 ] :8 Create s e r v i c e s to bind to ’bpdp−m1−he l l o ’ ? [ yN ] : N9 Would you l i k e to save t h i s c on f i gu r a t i on ? [yN ] : N

10 Creat ing Appl i ca t ion : OK11 Uploading Appl i ca t ion :12 Checking for av a i l a b l e r e s ou r c e s : OK13 Proce s s ing r e s ou r c e s : OK14 Packing app l i c a t i on : OK15 Uploading (15K) : OK16 Push Status : OK17 Staging Appl i ca t ion ’bpdp−m1−he l l o ’ : OK18 Sta r t i ng Appl i ca t ion ’bpdp−m1−he l l o ’ : OK1920 $

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 file yang kita buat(dalam contoh ini adalah app.js):

Page 27: cloud computing with nodejs (indonesian)

1.8. Pengelolaan Aplikasi di Cloud 16

Gambar 1.8.: Hasil deployement app.js tanpa framework

12 var http = r equ i r e ( ’http’ ) ;3 var u r l = r equ i r e ( "url" ) ;45 http . c r e a t eS e rv e r ( function ( req , r e s ) {67 var pathname = ur l . parse ( req . u r l ) . pathname ;89 r e s . writeHead (200 , {’Content -Type’ : ’text/html’ } ) ;

10 r e s . wr i t e ( "Hello NodeJS <u>" + proce s s . v e r s i on + "</u>" ) ;11 r e s . wr i t e ( "<br />Request for <b>" + pathname + "</b> received." ) ;12 r e s . end ( ) ;1314 } ) . l i s t e n ( 1337 ) ;

Listing 1.19: app.js tanpa framework

Proses deployement adalah sebagai berikut:1 $ vmc push −−runtime=node082 Would you l i k e to deploy from the cur rent d i r e c t o r y ? [Yn ] : Y3 Appl i ca t ion Name : bpdp−m1−hel lonoframework4 Detected a Node . j s Appl icat ion , i s t h i s c o r r e c t ? [Yn ] : Y5 Appl i ca t ion Deployed URL [ bpdp−m1−hel lonoframework . c loudfoundry . com ] :6 Memory r e s e r v a t i o n (128M, 256M, 512M, 1G, 2G) [64M] :7 How many in s t an c e s ? [ 1 ] :8 Create s e r v i c e s to bind to ’bpdp−m1−hel lonoframework ’ ? [ yN ] : N9 Would you l i k e to save t h i s c on f i gu r a t i on ? [yN ] : N

10 Creat ing Appl i ca t ion : OK11 Uploading Appl i ca t ion :12 Checking for av a i l a b l e r e s ou r c e s : OK13 Packing app l i c a t i on : OK14 Uploading (0K) : OK15 Push Status : OK16 Staging Appl i ca t ion ’bpdp−m1−hel lonoframework ’ : OK17 Sta r t i ng Appl i ca t ion ’bpdp−m1−hel lonoframework ’ : OK1819 $

Listing 1.20: Deployment app.js tanpa framework

Hasilnya bisa dilihat pada Gambar 1.8

Page 28: cloud computing with nodejs (indonesian)

BAB 2

REPL dan Dasar-dasar JavaScript di Node.js

2.1. REPL

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

2.1.1. Mengaktifkan REPL

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

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

Listing 2.1: Node.js REPL

17

Page 29: cloud computing with nodejs (indonesian)

2.1. REPL 18

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

2.1.2. Perintah-perintah REPL

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

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

X .clear: alias untuk .break

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

X .help: menampilkan pertolong perintah internal REPL

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

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

Contoh untuk .load:1 > . load /home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s / s e r v e r . j s2 > var http = r equ i r e ( ’http’ ) ;3 undef ined4 > http . c r e a t eS e rv e r ( function ( req , r e s ) {5 . . . r e s . writeHead (200 , {’Content -Type’ : ’text/plain ’ } ) ;6 . . . r e s . end ( ’Hello , world!\n’ ) ;7 . . . } ) . l i s t e n (8124 , "127.0.0.1" ) ;8 { _connections : 0 ,9 connect i ons : [ Getter / Se t t e r ] ,

10 allowHalfOpen : true ,11 _handle : null ,12 _events :13 { reque s t : [ Function ] ,14 connect ion : [ Function : c onnec t i onL i s t ene r ] } ,15 httpAllowHalfOpen : fa l se }16 > conso l e . l og ( ’Server running at http ://127.0.0.1:8124/ ’ ) ;17 Server running at http : // 127.0.0.1:8124/18 undef ined19 >

Listing 2.2: Contoh penggunaan .load dalam REPL

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

rektori, maka akan disimpan di direktori aktif saat itu. Contoh:1 $ node2 > conso l e . l og ( "Selamat datang di Node.js" )3 Selamat datang d i Node . j s4 undef ined5 > . save /home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s / h e l l o . j s

Page 30: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 19

6 Se s s i on saved to : / home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s / h e l l o . j s7 > [ bpdp@bpdp−arch ~] $ cat /home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s / h e l l o . j s8 conso l e . l og ( "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 bahasapemrograman JavaScript. Spesifikasi JavaScript yang diimplementasikan merupakanspesifikasi resmi dari ECMAScript serta CommonJS (http://commonjs.org). Dengandemikian, jika anda sudah pernah mempelajari JavaScript sebelumnya, tata bahasa dariperintah yang dipahami oleh Node.js masih tetap sama dengan JavaScript.

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

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

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

X me-require pustaka Readline

X membuat interface untuk masukan dan keluaran

X .. gunakan interface ..

X .. gunakan interface ..

X .. gunakan interface ..

X .. gunakan interface ..

X ..

X ..

X tutup interface

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

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

Page 31: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 20

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

1011 r l . c l o s e ( ) ;12 } ) ;

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

Hasilnya adalah sebagai berikut:1 [ bpdp@bpdp−arch modul−2]$ node r e ad l i n e . j s2 What do you think o f node . j s ? awesome !3 Thank you for your va luab l e feedback : awesome !4 [ bpdp@bpdp−arch modul−2]$

Listing 2.5: Hasil eksekusi readline.js

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

2.2.2. Nilai/Value dan Tipe Data

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

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

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

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

X null

X undefined

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

Page 32: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 21

1 var jumlahMahasiswa = 302 conso l e . l og ( ’Jumlah mahasiswa dalam satu kelas = ’ + jumlahMahasiswa ) ;3 // 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 otomatispada saat program dieksekusi.

Catatan:

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

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

2.2.3. Variabel

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

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

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

X Membedakan huruf besar - kecil.

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

2.2.4. Konstanta

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

1 const 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 (artinyaberlaku juga untuk Node.js).

Page 33: cloud computing with nodejs (indonesian)

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

Definisi Fungsi

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

Listing 2.8: Sintaksis Fungsi dalam JavaScript

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

Listing 2.9: Pemanggilan Fungsi dalam JavaScript

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

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

Listing 2.10: Contoh deklarasi fungsi dan pemanggilannya

Page 34: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 23

Fungsi Anonim

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

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

Listing 2.11: Fungsi anonim

Fungsi Rekursif

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

1 function f a c t o r i a l (n){2 i f ( ( n == 0) | | (n == 1))3 return 1 ;4 else5 return (n ∗ f a c t o r i a l (n − 1 ) ) ;6 }

Listing 2.12: Fungsi rekursif untuk menghitung faktorial

Fungsi di dalam Fungsi / Nested Functions

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

1 function induk ( ) {2 var awal = 0 ;3 function tambahkan ( ) {4 awal++;5 }6 tambahkan ( ) ;7 tambahkan ( ) ;8 conso l e . l og ( ’Nilai = ’ + awal ) ;9 }

1011 induk ( ) ;12 tambahkan ( ) ;1314 // Hasil:15 // Nilai = 216 //17 // /home/bpdp/kerjaan/git -repos/buku -cloud -nodejs/src/modul -2/ nested.js:1218 // tambahkan ();19 // ^20 // ReferenceError: tambahkan is not defined21 // at Object.<anonymous > (/home/bpdp/kerjaan/git -repos/buku -cloud -nodejs/

Page 35: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 24

22 // src/modul -2/ nested.js :12:1)23 // at Module._compile (module.js :449:26)24 // at Object.Module._extensions ..js (module.js :467:10)25 // at Module.load (module.js :356:32)26 // at Function.Module._load (module.js :312:12)27 // at Module.runMain (module.js :492:10)28 // at process.startup.processNextTick.process._tickCallback (node.js :244:9)29 //

Listing 2.13: Fungsi di dalam Fungsi

2.2.6. Literal

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

Literal Array

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

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

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

Listing 2.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 bulanganbulat dalam JavaScript bisa dalam bentuk:

Page 36: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 25

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

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

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

Literal Floating-point

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

Literal Obyek

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

Literal String

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

X “Kembali ke halaman utama”

X ’Lisensi’

X “Hari ini, Jum’at, tanggal 21 November”

X “1234.543”

X “baris pertama \n baris kedua”

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

X \b: Backspace

X \f: Form feed

X \n: New line

X \r: Carriage return

X \t: Tab

X \v: Vertical tab

X \’: Apostrophe atau single quote

X \": Double quote2pada ECMA-262, bilangan octal ini sudah tidak digunakan lagi.

Page 37: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 26

X \\: Backslash (\).

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

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

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

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

2.2.7. Struktur Data dan Representasi JSON

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

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

10 } ,11 "phoneNumber" : [12 {13 "type" : "home" ,14 "number" : "212 555 -1234"15 } ,16 {17 "type" : "fax" ,18 "number" : "646 555 -4567"19 }20 ]21 }

Listing 2.15: Representasi JSON

Dari representasi di atas, kita bisa membaca:

X Nilai data “firstname” adalah “John”

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

X dan seterusnya

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

Page 38: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 27

2.2.8. Aliran Kendali

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

Pernyataan Kondisi if .. else if .. else

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

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

10 // hasil: hanya dikerjakan jika kondisi bernilai benar/true11 //12 // Contoh berikut lebih kompleks , melibatkan input13 var r e ad l i n e = r equ i r e ( ’readline ’ ) ;1415 var r l = r e ad l i n e . c r e a t e I n t e r f a c e ({16 input : p roce s s . s td in ,17 output : p roce s s . s tdout18 } ) ;1920 r l . ques t i on ( "Masukkan angka nilai: " , function ( answer ) {21 i f ( answer > 80) {22 conso l e . l og ( "Nilai: A" ) ;23 } else i f ( answer > 70) {24 conso l e . l og ( "Nilai: B" ) ;25 } else i f ( answer > 40) {26 conso l e . l og ( "Nilai: C" ) ;27 } else i f ( answer > 30) {28 conso l e . l og ( "Nilai: D" ) ;29 } else {30 conso l e . l og ( "Tidak lulus" ) ;31 }32 r l . c l o s e ( ) ;33 } ) ;

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

Pernyataan switch

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

1 var r e ad l i n e = r equ i r e ( ’readline ’ ) ;23 var r l = r e ad l i n e . c r e a t e I n t e r f a c e ({4 input : p roce s s . s td in ,5 output : p roce s s . s tdout

Page 39: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 28

6 } ) ;78 conso l e . l og ( "Menu" ) ;9 conso l e . l og ( "====" ) ;

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

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

Looping

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

1 f o r (var i = 0 ; i < 9 ; i++) {2 conso l e . l og ( i ) ;3 }4 // hasil:5 //06 //17 //28 //39 //4

10 //511 //612 //713 //8

Listing 2.18: Pernyataan for

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

1 var data = {a : 1 , b : 2 , c : 3 } ;2

Page 40: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 29

3 f o r (var i t e r a s i in data ) {4 conso l e . l og ( "Nilai dari iterasi " + i t e r a s i + " adalah: " + data [ i t e r a s i ] ) ;5 }6 // hasil:7 //Nilai dari iterasi a adalah: 18 //Nilai dari iterasi b adalah: 29 //Nilai dari iterasi c adalah: 3

Listing 2.19: Pernyataan for .. in

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

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

10 //811 //1012 //1213 //1414 //1615 //1816 //20

Listing 2.20: Pernyataan do .. while

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

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

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

10 // hasil:11 //Nilai n = 112 //Nilai x = 113 //Nilai n = 214 //Nilai x = 315 //Nilai n = 316 //Nilai x = 617 //Nilai n = 418 //Nilai x = 1019 //Nilai n = 520 //Nilai x = 15

Page 41: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 30

Listing 2.21: Pernyataan while

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

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

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

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

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

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

Listing 2.22: Pernyataan break dan continue

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

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

Listing 2.23: Pernyataan break dengan label

Page 42: cloud computing with nodejs (indonesian)

2.2. Dasar-dasar JavaScript di Node.js 31

2.2.9. Penanganan Error

JavaScript mendukung pernyataan try .. catch .. finally serta throw untuk menangani er-ror. Meskipun demikian, banyak hal yang tidak sesuai dengan konstruksi ini karena sifatJavaScript yang asynchronous. Untuk kasus asynchrous, pemrogram lebih disarankanmenggunakan function callback.

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

10 //Error: gakAdaFungsiIni is not defined11 //Ini adalah semacam bagian untuk ’pembersihan ’,12 //akan dikerjakan , apapun yang terjadi

Listing 2.24: Pernyataan break dengan label

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

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

Listing 2.25: Pernyataan break dengan label

Page 43: cloud computing with nodejs (indonesian)

BAB 3

Paradigma Pemrograman di JavaScript

3.1. Pemrograman Fungsional

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

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

3.1.1. Ekspresi Lambda

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

32

Page 44: cloud computing with nodejs (indonesian)

3.1. Pemrograman Fungsional 33

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

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

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

Listing 3.1: Ekspresi Lambda di JavaScript

3.1.2. Higher-order Function

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

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

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

Page 45: cloud computing with nodejs (indonesian)

3.1. Pemrograman Fungsional 34

23 //TIGA

Listing 3.2: Higher-order Function di JavaScript

3.1.3. Closure

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

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

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

Listing 3.3: Closure di JavaScript

3.1.4. Currying

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

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

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

Page 46: cloud computing with nodejs (indonesian)

3.2. Pemrograman Berorientasi Obyek 35

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

Listing 3.4: Currying di JavaScript

3.2. Pemrograman Berorientasi Obyek

3.2.1. Pengertian

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

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

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

3.2.2. Definisi Obyek

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

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

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

Page 47: cloud computing with nodejs (indonesian)

3.2. Pemrograman Berorientasi Obyek 36

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

Listing 3.5: Definisi obyek di JavaScript

3.2.3. Inheritance / Pewarisan

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

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

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

Page 48: cloud computing with nodejs (indonesian)

3.2. Pemrograman Berorientasi Obyek 37

40 // mari diuji41 var subKelasSatu = new SubKelas ( "Parameter 1 Dari Sub Kelas 1" ) ;4243 conso l e . l og ( "Property 1 dari sub kelas 1 = " + subKelasSatu . property1 ) ;44 conso l e . l og ( "Property 1 dari sub kelas 1, diambil dari method+param = " +45 subKelasSatu . methodSatu ( true ) ) ;46 conso l e . l og ( "Property 1 dari sub kelas 1, diambil dari method+param = " +47 subKelasSatu . methodSatu ( fa l se ) ) ;4849 conso l e . l og ( subKelasSatu . methodDua ( ) ) ;50 // hasil:51 //52 // Property 1 dari kelasSatu = ini parameter 1 dari kelas 153 // Property 1 dari kelasSatu , diambil dari method = ini54 // parameter 1 dari kelas 155 // Property 1 dari sub kelas 1 = Parameter 1 Dari Sub Kelas 156 //Ubah ke huruf besar? = true57 // Property 1 dari sub kelas 1, diambil dari method+param =58 // PARAMETER 1 DARI SUB KELAS 159 //Ubah ke huruf besar? = false60 // Property 1 dari sub kelas 1, diambil dari method+param =61 // parameter 1 dari sub kelas 162 // Berada di method dua dari SubKelas

Listing 3.6: Pewarisan di PBO JavaScript

Page 49: cloud computing with nodejs (indonesian)

BAB 4

Mengelola Paket Menggunakan npm

4.1. Apakah npm Itu?

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

4.2. Menggunakan npm

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

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

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

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

38

Page 50: cloud computing with nodejs (indonesian)

4.2. Menggunakan npm 39

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

Listing 4.1: Sintaksis lengkap perintah npm

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

4.2.1. Instalasi Paket

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

1 $ npm i n s t a l l f oo

Listing 4.2: Cara install paket menggunakan npm

Perintah diatas akan memasang versi terakhir dari paket pustaka foo. Selain itu npmjuga dapat memasang paket pustaka langsung pada sebuah folder, tarball atau tautanuntuk sebuah tarball.

4.2.2. Struktur Instalasi Paket Node.js

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

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

Page 51: cloud computing with nodejs (indonesian)

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-pakettersebut akan terinstall di $CWD/node_modules ($CWD = Current Working Directory -direktori aktif saat ini). Daftar paket pustaka yang terpasang dapat dilihat menggunakanperintah berikut:

1 $ npm l 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. Gam-bar 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 saatmemasang paket, namun dengan perintah uninstall. Berikut perintah lengkapnya.

1 $ npm un i n s t a l l f oo

Listing 4.4: Perintah menghapus paket di npm

Paket pustaka foo dalam lokal aplikasi akan dihapus, jika menggunakan hak adminis-trasi 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 paketyang dicari. Contoh berikut ini akan mencari paket dengan kata kunci ’sha512’ (tampilanberikut merupakan tampilan yang terpotong):

1 $ npm search sha5122 npm http GET https : // r e g i s t r y . npmjs . org/−/ a l l / s i n c e ? s t a l e = . . .3 npm http 200 https : // r e g i s t r y . npmjs . org/−/ a l l / s i n c e ? s t a l e = . . .4 NAME DESCRIPTION . . .5 krypto High−l e v e l crypto l i b r a r y , making the core crypto . . .

Page 52: cloud computing with nodejs (indonesian)

4.2. Menggunakan npm 41

6 pwhash Generate password hashes from the command l i n e . . . .

Listing 4.5: Perintah menghapus paket di npm

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

4.2.5. Menampilkan Informasi Paket

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

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

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

Listing 4.6: Menampilkan rincian suatu paket dalam format JSON

Page 53: cloud computing with nodejs (indonesian)

4.2. Menggunakan npm 42

4.2.6. Memperbaharui Paket

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

1 npm update

Listing 4.7: Memperbaharui paket lokal

1 npm update −g

Listing 4.8: Memperbaharui paket secara global

Page 54: cloud computing with nodejs (indonesian)

BAB 5

Node.js dan Web: Teknik Pengembangan Aplikasi

5.1. Pendahuluan

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

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

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

Listing 5.1: pegawai.json

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

43

Page 55: cloud computing with nodejs (indonesian)

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 disebutEvent-Based Programming merupakan teknik pemrograman yang menggunakan eventatau suatu kejadian tertentu sebagai pemicu munculnya suatu aksi serta aliran program.Contoh event misalnya adalah sebagai berikut:

X Menu dipilih.

X Tombol "Submit" di klik.

X Server menerima permintaan dari klien.

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

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

X definisi dari berbagai event yang mungkin muncul

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

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

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

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

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

Listing 5.2: server.js

Page 56: cloud computing with nodejs (indonesian)

5.3. Asynchronous / Non-blocking IO dan Callback 45

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

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

Listing 5.3: server-on-error.js

5.3. Asynchronous / Non-blocking IO dan Callback

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

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

10 //{11 // "pegawai ": [12 // {13 // "id": "1",14 // "nama": "Zaky",15 // "alamat ": "Purwomartani"16 // },17 // {

Page 57: cloud computing with nodejs (indonesian)

5.3. Asynchronous / Non-blocking IO dan Callback 46

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

Listing 5.4: Membaca file secara synchronous

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

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

Listing 5.5: Membaca file secara asynchronous

Page 58: cloud computing with nodejs (indonesian)

BAB 6

Mengakses Basis Data NoSQL: mongoDB

6.1. Apa itu Basis Data NoSQL?

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

6.2. Mengenal mongoDB dan Fitur-fiturnya

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

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

47

Page 59: cloud computing with nodejs (indonesian)

6.2. Mengenal mongoDB dan Fitur-fiturnya 48

X menggunakan format JSON dalam penyimpanan data

X mendukung indeks

X mendukung replikasi

X auto-sharding untuk skalabilitas horizontal

X query yang lengkap

X pembaruan data yang cepat

X mendukung Map/Reduce

X mendukung GridFS

6.2.1. Memulai Server

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

1 $ pwd2 /home/bpdp/mongodb3 $ mkdir data4 $ mongod −−r e s t −−dbpath . / data5 Tue Dec 11 14 : 40 : 206 Tue Dec 11 14 : 40 : 20 warning : 32−b i t s e r v e r s don ’ t have j ou rna l i n g7 enabled by de f au l t . P lease use −−j ou rna l i f you want du r ab i l i t y .8 Tue Dec 11 14 : 40 : 209 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ] MongoDB s t a r t i n g : pid=24381

10 port=27017 dbpath=./data 32−b i t host=bpdp−arch11 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ]12 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ] ∗∗ NOTE: when us ing MongoDB13 32 bit , you are l im i t ed to about 2 g igabyte s o f data14 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ] ∗∗ s ee15 http :// blog . mongodb . org / post /137788967/32− bit−l im i t a t i o n s16 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ] ∗∗ with −−j ourna l , the17 l im i t i s lower18 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ]19 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ] db ve r s i on v2 . 2 . 2 , p d f i l e20 ve r s i on 4 .521 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ] g i t v e r s i on : nog i t v e r s i on22 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ] bu i ld i n f o : Linux f e l i x23 3.6.7−1−ARCH #1 SMP PREEMPT Sun Nov 18 10:11:22 CET 2012 i68624 BOOST_LIB_VERSION=1_5025 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ] opt ions : { dbpath : "./data" , r e s t : true}26 Tue Dec 11 14 : 40 : 20 [ i n i t a n d l i s t e n ] Unable to check for j ou rna l27 f i l e s due to : boost : : f i l e s y s t em : : d i r e c t o r y_ i t e r a t o r : : c ons t ruc t :28 No such f i l e or d i r e c t o r y : "./data/journal"29 Tue Dec 11 14 : 40 : 21 [ websvr ] admin web conso l e wa i t ing for30 connec t i ons on port 2801731 Tue Dec 11 14 : 40 : 21 [ i n i t a n d l i s t e n ] wa i t ing for connect i ons on32 port 27017

Page 60: cloud computing with nodejs (indonesian)

6.2. Mengenal mongoDB dan Fitur-fiturnya 49

Listing 6.1: Menjalankan server MongoDB (mongod)

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

1 ^CTue Dec 11 15 : 16 : 38 got s i g n a l 2 ( In t e r rup t ) , w i l l terminate a f t e r cur r ent cmd ends2 Tue Dec 11 15 : 16 : 38 [ interruptThread ] now ex i t i n g3 Tue Dec 11 15 : 16 : 38 dbex i t :4 Tue Dec 11 15 : 16 : 38 [ interruptThread ] shutdown : going to c l o s e l i s t e n i n g so cke t s . . .5 Tue Dec 11 15 : 16 : 38 [ interruptThread ] c l o s i n g l i s t e n i n g socke t : 56 Tue Dec 11 15 : 16 : 38 [ interruptThread ] c l o s i n g l i s t e n i n g socke t : 67 Tue Dec 11 15 : 16 : 38 [ interruptThread ] c l o s i n g l i s t e n i n g socke t : 78 Tue Dec 11 15 : 16 : 38 [ interruptThread ] removing socke t f i l e : /tmp/mongodb−27017. sock9 Tue Dec 11 15 : 16 : 38 [ interruptThread ] shutdown : going to f l u s h d i ag l og . . .

10 Tue Dec 11 15 : 16 : 38 [ interruptThread ] shutdown : going to c l o s e s o cke t s . . .11 Tue Dec 11 15 : 16 : 38 [ interruptThread ] shutdown : wai t ing for f s p r e a l l o c a t o r . . .12 Tue Dec 11 15 : 16 : 38 [ interruptThread ] shutdown : c l o s i n g a l l f i l e s . . .13 Tue Dec 11 15 : 16 : 38 [ interruptThread ] c l o s e A l l F i l e s ( ) f i n i s h e d14 Tue Dec 11 15 : 16 : 38 [ interruptThread ] shutdown : removing f s l o ck . . .15 Tue Dec 11 15 : 16 : 38 dbex i t : r e a l l y e x i t i n g now

Listing 6.2: Mengakhiri server MongoDB (mongod)

6.2.2. Klien dan Shell mongoDB

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

1 $ mongo2 MongoDB s h e l l v e r s i on : 2 . 2 . 23 connect ing to : test4 >

Listing 6.3: Shell mongoDB (mongo)

6.2.3. Documents dan Collections

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

1 $ mongo2 MongoDB s h e l l v e r s i on : 2 . 2 . 23 connect ing to : test4 > db5 test

Page 61: cloud computing with nodejs (indonesian)

6.2. Mengenal mongoDB dan Fitur-fiturnya 50

Gambar 6.1.: Admin web console untuk mongoDB

6 > use mydb7 switched to db mydb8 > show dbs9 local ( empty )

10 > emp1 = { name : "Zaky" , address : "Griya Purwa Asri" }11 { "name" : "Zaky" , "address" : "Griya Purwa Asri" }12 > emp2 = { name : "Ahmad" , address : "Purwomartani" , emai l : "[email protected]" }13 {14 "name" : "Ahmad" ,15 "address" : "Purwomartani" ,16 "email" : "[email protected]"17 }18 > emp3 = { name : "Aditya" , address : "Kalasan" , phone : "08787878787" }19 { "name" : "Aditya" , "address" : "Kalasan" , "phone" : "08787878787" }20 > db . employees . i n s e r t ( emp1 )21 > db . employees . i n s e r t ( emp2 )22 > db . employees . i n s e r t ( emp3 )23 > show dbs24 local ( empty )25 mydb 0.0625GB26 > db27 mydb28 > show c o l l e c t i o n s29 employees30 system . indexes31 > db . employees . f i nd ( )32 { "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) , "name" : "Zaky" , "address" :33 "Griya Purwa Asri" }34 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "name" : "Ahmad" , "address" :

Page 62: cloud computing with nodejs (indonesian)

6.3. Node.js dan MongoDB 51

35 "Purwomartani" , "email" : "[email protected]" }36 { "_id" : ObjectId ( "50 c74b79a7f83cba11e6b220" ) , "name" : "Aditya" , "address" :37 "Kalasan" , "phone" : "08787878787" }38 > db . employees . f i nd ( {name : "Ahmad"} )39 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "name" : "Ahmad" , "address" :40 "Purwomartani" , "email" : "[email protected]" }41 > db . employees . findOne ( )42 {43 "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) ,44 "name" : "Zaky" ,45 "address" : "Griya Purwa Asri"46 }47 > db . employees . f i nd ( ) . l im i t (2 )48 { "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) , "name" : "Zaky" , "address" :49 "Griya Purwa Asri" }50 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "name" : "Ahmad" , "address" :51 "Purwomartani" , "email" : "[email protected]" }52 >

Listing 6.4: Sesi dalam shell mongoDB

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

6.3. Node.js dan MongoDB

6.3.1. Node-gyp

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

1 $ npm i n s t a l l −g node−gyp2 npm http GET https : // r e g i s t r y . npmjs . org /node−gyp3 npm http 200 https : // r e g i s t r y . npmjs . org /node−gyp4 npm http GET https : // r e g i s t r y . npmjs . org / glob5 npm http GET https : // r e g i s t r y . npmjs . org /mkdirp6 npm http GET https : // r e g i s t r y . npmjs . org / f s t ream7 npm http GET https : // r e g i s t r y . npmjs . org /minimatch8 npm http GET https : // r e g i s t r y . npmjs . org / g ra c e fu l−f s9 npm http GET https : // r e g i s t r y . npmjs . org / r eque s t

10 npm http GET https : // r e g i s t r y . npmjs . org / ta r11 npm http GET https : // r e g i s t r y . npmjs . org / semver12 npm http GET https : // r e g i s t r y . npmjs . org / r imra f13 npm http GET https : // r e g i s t r y . npmjs . org /which14 npm http GET https : // r e g i s t r y . npmjs . org /osenv15 npm http GET https : // r e g i s t r y . npmjs . org /npmlog16 npm http GET https : // r e g i s t r y . npmjs . org /nopt17 npm http 304 https : // r e g i s t r y . npmjs . org / glob18 npm http 304 https : // r e g i s t r y . npmjs . org /minimatch19 npm http 304 https : // r e g i s t r y . npmjs . org /mkdirp20 npm http 304 https : // r e g i s t r y . npmjs . org / r eque s t21 npm http 304 https : // r e g i s t r y . npmjs . org / g ra c e fu l−f s22 npm http 304 https : // r e g i s t r y . npmjs . org / semver23 npm http GET https : // r e g i s t r y . npmjs . org / semver/−/semver −1 . 1 . 1 . tgz24 npm http 200 https : // r e g i s t r y . npmjs . org / fs t ream25 npm http 200 https : // r e g i s t r y . npmjs . org / ta r26 npm http GET https : // r e g i s t r y . npmjs . org / ta r/−/tar −0 .1 . 14 . tgz

Page 63: cloud computing with nodejs (indonesian)

6.3. Node.js dan MongoDB 52

27 npm http 200 https : // r e g i s t r y . npmjs . org / r imra f28 npm http 200 https : // r e g i s t r y . npmjs . org /which29 npm http 304 https : // r e g i s t r y . npmjs . org /nopt30 npm http 200 https : // r e g i s t r y . npmjs . org /osenv31 npm http 200 https : // r e g i s t r y . npmjs . org /npmlog32 npm http 200 https : // r e g i s t r y . npmjs . org / semver/−/semver −1 . 1 . 1 . tgz33 npm http 200 https : // r e g i s t r y . npmjs . org / ta r/−/tar −0 .1 . 14 . tgz34 npm http GET https : // r e g i s t r y . npmjs . org /abbrev35 npm http GET https : // r e g i s t r y . npmjs . org /sigmund36 npm http GET https : // r e g i s t r y . npmjs . org / lru−cache37 npm http GET https : // r e g i s t r y . npmjs . org / ans i38 npm http GET https : // r e g i s t r y . npmjs . org / i n h e r i t s39 npm http GET https : // r e g i s t r y . npmjs . org / i n h e r i t s40 npm http GET https : // r e g i s t r y . npmjs . org / i n h e r i t s41 npm http GET https : // r e g i s t r y . npmjs . org /block−stream42 npm http 304 https : // r e g i s t r y . npmjs . org /sigmund43 npm http 304 https : // r e g i s t r y . npmjs . org /abbrev44 npm http 304 https : // r e g i s t r y . npmjs . org / l ru−cache45 npm http 304 https : // r e g i s t r y . npmjs . org / i n h e r i t s46 npm http 304 https : // r e g i s t r y . npmjs . org / i n h e r i t s47 npm http 304 https : // r e g i s t r y . npmjs . org / i n h e r i t s48 npm http 200 https : // r e g i s t r y . npmjs . org / ans i49 npm http 200 https : // r e g i s t r y . npmjs . org /block−stream50 /home/bpdp/ so f tware / node j s / bin /node−gyp −> /home/bpdp/ so f tware / node j s / l i b /node_modules/51 node−gyp/bin /node−gyp . j s52 node−gyp@0 . 8 . 1 /home/bpdp/ so f tware / node j s / l i b /node_modules/node−gyp53 +−− g ra c e fu l−fs@1 . 1 . 1 454 |−− osenv@0 . 0 . 355 |−− rimraf@2 . 0 . 256 |−− mkdirp@0 . 3 . 457 |−− which@1 . 0 . 558 |−− semver@1 . 1 . 159 |−− request@2 . 9 . 2 0 360 |−− nopt@2 . 0 . 0 ( abbrev@1 . 0 . 3 )61 |−− minimatch@0 . 2 . 9 ( sigmund@1 . 0 . 0 , l ru−cache@2 . 0 . 4 )62 |−− glob@3 . 1 . 1 4 ( inhe r i t s@1 . 0 . 0 )63 |−− fstream@0 . 1 . 1 9 ( inhe r i t s@1 . 0 . 0 )64 |−− npmlog@0 . 0 . 2 ( ansi@0 . 1 . 2 )65 +−− tar@0 . 1 . 1 4 ( inhe r i t s@1 . 0 . 0 , block−stream@0 . 0 . 6 )

Listing 6.5: Instalasi node-gyp

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

6.3.2. Driver Node.js untuk mongoDB

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

1 $ npm i n s t a l l mongodb2 npm WARN package . j son kintamani@0 . 1 . 0 No README.md f i l e found !3 npm http GET https : // r e g i s t r y . npmjs . org /mongodb4 npm http 304 https : // r e g i s t r y . npmjs . org /mongodb5 npm http GET https : // r e g i s t r y . npmjs . org /bson /0 . 1 . 56 npm http 304 https : // r e g i s t r y . npmjs . org /bson /0 . 1 . 578 > bson@0 . 1 . 5 i n s t a l l /home/bpdp/node_modules/mongodb/node_modules/bson9 > node i n s t a l l . j s | | ( exit 0)

Page 64: cloud computing with nodejs (indonesian)

6.3. Node.js dan MongoDB 53

1011 ================================================================================12 = =13 = Attempting to bu i ld bson c++ extens i on =14 = Windows : no bu i ld w i l l be attempted as b i n a r i e s are prepackaged =15 = Unix : on f a i l u r e the package w i l l s t i l l i n s t a l l without the C++ extens i on =16 = =17 ================================================================================18 node−gyp c l ean19 node−gyp con f i gu r e bu i ld20 gyp http GET http :// node j s . org / d i s t /v0 . 8 . 1 5 / node−v0 . 8 . 1 5 . ta r . gz21 gyp http 200 http :// node j s . org / d i s t /v0 . 8 . 1 5 / node−v0 . 8 . 1 5 . ta r . gz22 make [ 1 ] : Enter ing d i r e c t o r y ‘/home/bpdp/node_modules/mongodb/node_modules/bson/ bui ld ’23 CXX( ta r g e t ) Re lease / obj . t a r g e t /bson/ ext /bson . o24 SOLINK_MODULE( ta r g e t ) Re lease / obj . t a r g e t /bson . node25 SOLINK_MODULE( ta r g e t ) Re lease / obj . t a r g e t /bson . node : F in i shed26 COPY Release /bson . node27 make [ 1 ] : Leaving d i r e c t o r y ‘/home/bpdp/node_modules/mongodb/node_modules/bson/ bui ld ’28 ch i l d p roce s s ex i t ed with code 029 mongodb@1 . 2 . 3 . . / . . / . . / . . / . . / node_modules/mongodb30 +−− bson@0 . 1 . 5

Listing 6.6: Instalasi driver mongoDB

Solusi lain yang bisa digunakan antara lain adalah:

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

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

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

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

6.3.3. Mengakses mongoDB dari Node.js

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

1 $ npm i n s t a l l mongojs2 npm http GET https : // r e g i s t r y . npmjs . org /mongojs3 npm http 304 https : // r e g i s t r y . npmjs . org /mongojs4 npm http GET https : // r e g i s t r y . npmjs . org /common5 npm http 304 https : // r e g i s t r y . npmjs . org /common6 mongojs@0 . 4 . 6 . . / . . / . . / . . / . . / node_modules/mongojs7 +−− common@0 . 2 . 1

Listing 6.7: Instalasi driver mongoDB

Setelah itu, buat program sesuai dengan listing program berikut.1 var databaseUrl = "localhost/mydb" ;2 var c o l l e c t i o n s = [ "employees" ] ;3 var db = r equ i r e ( "mongojs" ) . connect ( databaseUrl , c o l l e c t i o n s ) ;45 // mencari pegawai bernama Aditya

Page 65: cloud computing with nodejs (indonesian)

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 54

6 db . employees . f i nd ({name : "Aditya" } , function ( err , employees ) {7 i f ( e r r | | ! employees ) con so l e . l og ( "Tidak ada pegawai dengan nama Aditya" ) ;8 else employees . forEach ( function ( emps ) {9 conso l e . l og ( emps ) ;

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

Listing 6.8: Mengakses mongoDB dari Node.js

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB

Contoh aplikasi web berikut hanya digunakan untuk mengambil data dari mongoDB ke-mudian menampilkannya di web. Data diambil dari basis data mongoDB yang sudahdibuat sebelumnya (mydb). Untuk keperluan ini, kita akan menggunakan frameworkExpress (http://expressjs.com). Install Express di level global dengan npm install -gexpress. Setelah terinstall, buat subdirektori baru (lokasi bebas) yang akan digunakanuntuk menyimpan aplikasi web. Setelah itu, buat kerangka aplikasi di subdirektori terse-but sebagai berikut:

1 $ expre s s2

Page 66: cloud computing with nodejs (indonesian)

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 55

3 c r e a t e : .4 c r e a t e : . / package . j son5 c r e a t e : . / app . j s6 c r e a t e : . / pub l i c7 c r e a t e : . / pub l i c / images8 c r e a t e : . / pub l i c / s t y l e s h e e t s9 c r e a t e : . / pub l i c / s t y l e s h e e t s / s t y l e . c s s

10 c r e a t e : . / route s11 c r e a t e : . / route s / index . j s12 c r e a t e : . / route s / user . j s13 c r e a t e : . / views14 c r e a t e : . / views / layout . jade15 c r e a t e : . / views / index . jade16 c r e a t e : . / pub l i c / j a v a s c r i p t s1718 i n s t a l l dependenc ies :19 $ cd . && npm i n s t a l l2021 run the app :22 $ node app

Listing 6.9: Mengakses mongoDB dari Node.js

Berikut ini adalah beberapa perubahan yang dilakukan untuk rerangka aplikasi yangdihasilkan dari perintah express tersebut.

1 /**2 * Module dependencies.3 */45 var expre s s = r equ i r e ( ’express ’ )6 , r oute s = r equ i r e ( ’./ routes ’ )7 , employee = r equ i r e ( ’./ routes/employee ’ )8 , http = r equ i r e ( ’http’ )9 , path = r equ i r e ( ’path’ ) ;

1011 var app = expre s s ( ) ;1213 app . c on f i gu r e ( function ( ){14 app . s e t ( ’port’ , p ro c e s s . env .PORT | | 3000 ) ;15 app . s e t ( ’views ’ , __dirname + ’/views ’ ) ;16 app . s e t ( ’view engine ’ , ’jade’ ) ;17 app . use ( expre s s . f av i c on ( ) ) ;18 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;19 app . use ( expre s s . bodyParser ( ) ) ;20 app . use ( expre s s . methodOverride ( ) ) ;21 app . use ( app . rout e r ) ;22 app . use ( expre s s . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;23 } ) ;2425 app . c on f i gu r e ( ’development ’ , function ( ){26 app . use ( expre s s . e r rorHandle r ( ) ) ;27 } ) ;2829 app . get ( ’/’ , r ou t e s . index ) ;30 app . get ( ’/employees ’ , employee . l i s t ) ;3132 http . c r e a t eS e rv e r ( app ) . l i s t e n ( app . get ( ’port’ ) , function ( ){33 conso l e . l og ( "Express server listening on port " + app . get ( ’port’ ) ) ;34 } ) ;

Page 67: cloud computing with nodejs (indonesian)

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 56

Listing 6.10: app.js

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

10 "jade" : "*" ,11 "mongojs" : "latest"12 }13 }14 \end{ l i s t i n g }1516 \ l s t s e t { language=JavaScr ipt , capt ion=route s / index . j s }17 \ begin { l s t l i s t i n g }18 /*19 * GET home page.20 */2122 export s . index = function ( req , r e s ){23 r e s . render ( ’index’ , { t i t l e : ’Contoh Express+mongoDB ’ } ) ;24 } ;

Listing 6.11: package.json

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

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

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

Listing 6.12: routes/employee.js

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

Page 68: cloud computing with nodejs (indonesian)

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 57

Listing 6.13: views/employee.jade

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

Listing 6.14: views/index.jade

Page 69: cloud computing with nodejs (indonesian)

BAB 7

Pola Arsitektur Aplikasi Web: MVC dan ExpressJS

7.1. Apa itu Pola Arsitektur?

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

7.2. Pola Arsitektur MVC

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

X Model: basis data

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

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

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

58

Page 70: cloud computing with nodejs (indonesian)

7.2. Pola Arsitektur MVC 59

Gambar 7.1.: Pola arsitektur MVC

Page 71: cloud computing with nodejs (indonesian)

7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 60

7.3. Implementasi Pola Arsitektur MVC MenggunakanExpressJS

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

7.3.1. Struktur Aplikasi

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

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

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

Listing 7.1: Struktur direktori asli aplikasi ExpressJS

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

10 |−− pub l i c11 | +−− images12 | |−− j a v a s c r i p t s13 | +−− s t y l e s h e e t s14 | +−− s t y l e . c s s15 +−− views16 +−− index . jade17 +−− l ayout . jade1819 7 d i r e c t o r i e s , 8 f i l e s

Page 72: cloud computing with nodejs (indonesian)

7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 61

Listing 7.2: Struktur direktori ExpressJS sesuai pola MVC

Beberapa perubahan terhadap struktur direktori:

X direktori routes diubah menjadi controllers

X membuat direktori models untuk mendefinisikan skema basis data

7.3.2. File-file yang Diperlukan

Beberapa file diubah isinya dan ada juga file yang baru.1 /**2 * Module dependencies.3 */45 var expre s s = r equ i r e ( ’express ’ )6 , c o n t r o l l e r s = r equ i r e ( ’./ controllers ’ )7 , user = r equ i r e ( ’./ controllers/user’ )8 , http = r equ i r e ( ’http’ )9 , path = r equ i r e ( ’path’ ) ;

1011 var mongoose = r equ i r e ( ’mongoose ’ ) ;1213 var app = expre s s ( ) ;1415 mongoose . connect ( ’mongodb :// localhost/mydb’ ) ;1617 app . c on f i gu r e ( function ( ){18 app . s e t ( ’port’ , p ro c e s s . env .PORT | | 3000 ) ;19 app . s e t ( ’views ’ , __dirname + ’/views ’ ) ;20 app . s e t ( ’view engine ’ , ’jade’ ) ;21 app . use ( expre s s . f av i c on ( ) ) ;22 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;23 app . use ( expre s s . bodyParser ( ) ) ;24 app . use ( expre s s . methodOverride ( ) ) ;25 app . use ( app . rout e r ) ;26 app . use ( expre s s . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;27 } ) ;2829 app . c on f i gu r e ( ’development ’ , function ( ){30 app . use ( expre s s . e r rorHandle r ( ) ) ;31 } ) ;3233 app . get ( ’/’ , c o n t r o l l e r s . index ) ;34 app . get ( ’/users ’ , u se r . l i s t ) ;3536 http . c r e a t eS e rv e r ( app ) . l i s t e n ( app . get ( ’port’ ) , function ( ){37 conso l e . l og ( "Express server listening on port " + app . get ( ’port’ ) ) ;38 } ) ;

Listing 7.3: app.js

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

Page 73: cloud computing with nodejs (indonesian)

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya 62

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

10 } ) ;11 } ;

Listing 7.4: controllers/user.js

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

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

Listing 7.5: models/db.js

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

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

Listing 7.6: package.json

7.3.3. Hasil

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

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya

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

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

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

Page 74: cloud computing with nodejs (indonesian)

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya 63

Gambar 7.2.: Pola arsitektur MVC

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

X MVA (Model-View-Adapter).

X Hierarchical MVC

X Presentation-Abstract-Control.

Page 75: cloud computing with nodejs (indonesian)

BAB 8

Real-time Web Menggunakan Socket.io

8.1. Apa itu Real-time Web?

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

8.2. Teknologi Pendukung Real-time Web

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

8.2.1. Ajax Technology

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

X (X)HTML dan CSS untuk presentasi halaman Web

64

Page 76: cloud computing with nodejs (indonesian)

8.2. Teknologi Pendukung Real-time Web 65

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

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

X Obyek XMLHttpRequest untuk komunikasi asynchronous

X JavaScript

8.2.2. Comet dan Push Technology

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

SSE (Server-Sent Events)

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

Bayeux Protocol

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

X server ke klien

X klien ke server

X klien ke klien (melalui server)

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

BOSH Protocol

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

Page 77: cloud computing with nodejs (indonesian)

8.3. Socket.io 66

8.2.3. WebSocket

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

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

org/

8.3. Socket.io

8.3.1. Apa itu Socket.io?

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

X WebSocket

X Adobe Flash Socket

X AJAX long polling

X AJAX multipart streaming

X Forever Iframe

X JSONP Polling

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

X Internet Explorer 5.5+ (desktop)

X Safari 3+ (desktop)

X Google Chrome 4+ (desktop)

X Firefox 3+ (desktop)

X Opera 10.61+ (desktop)

X iPhone Safari (mobile)

Page 78: cloud computing with nodejs (indonesian)

8.3. Socket.io 67

X iPad Safari (mobile)

X Android WebKit (mobile)

X WebOs WebKit (mobile)

8.3.2. Menggunakan Socket.io untuk Real-time Web

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

Tentang Aplikasi

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

Membuat Kerangka Aplikasi dengan ExpressJS

Untuk membuat aplikasi ini, kita akan menggunakan ExpressJS dan Socket.io. Padaawalnya, kita akan membuat kerangka aplikasi menggunakan express (jika ExpressJSbelum terinstall, install dengan menggunakan npm install -g express.

1 $ expre s s23 c r e a t e : .4 c r e a t e : . / package . j son5 c r e a t e : . / app . j s6 c r e a t e : . / pub l i c7 c r e a t e : . / pub l i c / images8 c r e a t e : . / pub l i c / s t y l e s h e e t s9 c r e a t e : . / pub l i c / s t y l e s h e e t s / s t y l e . c s s

10 c r e a t e : . / route s11 c r e a t e : . / route s / index . j s12 c r e a t e : . / route s / user . j s13 c r e a t e : . / views14 c r e a t e : . / views / layout . jade15 c r e a t e : . / views / index . jade16 c r e a t e : . / pub l i c / j a v a s c r i p t s1718 i n s t a l l dependenc ies :19 $ cd . && npm i n s t a l l2021 run the app :22 $ node app

Listing 8.1: Membuat kerangka aplikasi dengan ExpressJS

Page 79: cloud computing with nodejs (indonesian)

8.3. Socket.io 68

Pada pembahasan berikutnya, kita akan mengadakan berbagai perubahan yang diper-lukan.

Instalasi Paket yang Diperlukan

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

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

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

Listing 8.2: package.json

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

Konfigurasi JavaScript untuk Browser

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

1 $ l s node_modules/ socket . io−c l i e n t / d i s t /2 t o t a l 4963 drwxr−xr−x 2 bpdp use r s 4096 Dec 16 20 :18 .4 drwxr−xr−x 7 bpdp use r s 4096 Dec 16 20 :18 . .5 −rw−r−−r−− 1 bpdp use r s 101222 Nov 2 22 :02 socke t . i o . j s6 −rw−r−−r−− 1 bpdp use r s 44789 Nov 2 22 :02 socke t . i o . min . j s7 −rw−r−−r−− 1 bpdp use r s 175953 Mar 28 2012 WebSocketMainInsecure . swf8 −rw−r−−r−− 1 bpdp use r s 175830 Mar 28 2012 WebSocketMain . swf

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

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

Hapus File yang Tidak Diperlukan

Ada beberapa file yang tidak diperlukan dan harus dihapus:

X routes/user.js

Page 80: cloud computing with nodejs (indonesian)

8.3. Socket.io 69

Ubah File-file Tertentu

Beberapa file akan diedit. Beberapa diantaranya akan diuraikan di bagian ini.1 var expre s s = r equ i r e ( ’express ’ )2 , app = expre s s ( )3 , r oute s = r equ i r e ( ’./ routes ’ )4 , http = r equ i r e ( ’http’ )5 , s e r v e r = http . c r e a t eS e rv e r ( app )6 , i o = r equ i r e ( ’socket.io’ ) . l i s t e n ( s e r v e r ) ;78 s e r v e r . l i s t e n ( 8 0 ) ;9

10 app . c on f i gu r e ( function ( ){11 app . s e t ( ’views ’ , __dirname + ’/views ’ ) ;12 app . s e t ( ’view engine ’ , ’jade’ ) ;13 app . use ( expre s s . f av i c on ( ) ) ;14 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;15 app . use ( expre s s . bodyParser ( ) ) ;16 app . use ( expre s s . methodOverride ( ) ) ;17 app . use ( expre s s . s t a t i c (__dirname + ’/public ’ ) ) ;18 app . use ( app . rout e r ) ;19 } ) ;2021 app . get ( ’/’ , r ou t e s . index ) ;2223 i o . s o cke t s . on ( ’connection ’ , function ( socke t ) {24 socket . emit ( ’kirim ke browser ’ , {25 ka l imatDar iServer : ’Kalimat ini dikirim dari server ’ } ) ;26 socket . on ( ’dari browser ’ , function ( data ) {27 conso l e . l og ( data . kal imatDariBrowser ) ;28 } ) ;29 } ) ;

Listing 8.4: app.js

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

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

Listing 8.5: views/index.jade

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

Page 81: cloud computing with nodejs (indonesian)

8.3. Socket.io 70

7 } ;

Listing 8.6: routes/index.js

Menjalankan Server Socket.io

Server socket.io menggunakan port 80 sehingga harus dijalankan oleh root.1 # node app.js2 i n f o − socke t . i o s t a r t ed3 debug − c l i e n t author i zed4 i n f o − handshake author i zed qrMUlAcSRMywnvUK31RV5 debug − s e t t i n g r eque s t GET / socket . i o /1/ websocket /qrMUlAcSRMywnvUK31RV6 debug − set heartbeat i n t e r v a l for c l i e n t qrMUlAcSRMywnvUK31RV7 debug − c l i e n t author i zed for8 debug − websocket wr i t i ng 1 : :9 debug − websocket wr i t i ng 5 : : : { "name" : "kirim ke browser" , "args" : [ { "kalimatDariServer" :

10 "Kalimat ini dikirim dari server" } ]}11 Kalimat i n i d ik i r im dar i browser12 GET / 200 44ms − 62813 i n f o − t r anspo r t end ( socke t end )14 debug − set c l o s e timeout for c l i e n t qrMUlAcSRMywnvUK31RV15 debug − c l e a r ed c l o s e timeout for c l i e n t qrMUlAcSRMywnvUK31RV16 debug − c l e a r ed heartbeat i n t e r v a l for c l i e n t qrMUlAcSRMywnvUK31RV17 debug − d i s c a rd i ng t ranspo r t18 GET / j a v a s c r i p t s / socke t . i o . j s 304 4ms19 GET / s t y l e s h e e t s / s t y l e . c s s 304 4ms20 debug − c l i e n t author i zed21 i n f o − handshake author i zed Eug556Y−X−4R8fOB31RW22 debug − s e t t i n g r eque s t GET / socket . i o /1/ websocket /Eug556Y−X−4R8fOB31RW23 debug − set heartbeat i n t e r v a l for c l i e n t Eug556Y−X−4R8fOB31RW24 debug − c l i e n t author i zed for25 debug − websocket wr i t i ng 1 : :26 debug − websocket wr i t i ng 5 : : : { "name" : "kirim ke browser" , "args" : [ { "kalimatDariServer" :27 "Kalimat ini dikirim dari server" } ]}28 Kalimat i n i d ik i r im dar i browser29 debug − emit t ing heartbeat for c l i e n t Eug556Y−X−4R8fOB31RW30 debug − websocket wr i t i ng 2 : :31 debug − set heartbeat timeout for c l i e n t Eug556Y−X−4R8fOB31RW32 debug − got heartbeat packet33 debug − c l e a r ed heartbeat timeout for c l i e n t Eug556Y−X−4R8fOB31RW34 debug − set heartbeat i n t e r v a l for c l i e n t Eug556Y−X−4R8fOB31RW35 . . .36 . . .37 . . .38 . . .

Listing 8.7: Menjalankan server Socket.io

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

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

Page 82: cloud computing with nodejs (indonesian)

8.3. Socket.io 71

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

6 </head>7 <body>8 <h1>Contoh Socket . i o + Express</h1>9 <p>Contoh Socket . i o + Express</p>

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

Listing 8.8: Kode sumber di browser

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

mudah dipahami untuk membuat aplikasi Web real-time.

Page 83: cloud computing with nodejs (indonesian)

Daftar Pustaka

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

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

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

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

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

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

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

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

72

Page 84: cloud computing with nodejs (indonesian)

Lampiran

73

Page 85: cloud computing with nodejs (indonesian)

LAMPIRAN A

Gaya Penulisan Kode / Coding Style

A.1. Tentang Gaya Penulisan Kode

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

A.2. npm’s Coding Style

npm’s "funny" coding style

A.2.1. DESCRIPTION

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

code conform to npm’s style.

74

Page 86: cloud computing with nodejs (indonesian)

A.2. npm’s Coding Style 75

A.2.2. Line Length

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

A.2.3. Indentation

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

A.2.4. Curly braces

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

Listing A.1: Bad curly braces placement - 1

Good:1 function ( ) {

Listing A.2: Good curly braces placement - 1

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

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

Listing A.3: Bad curly braces placement - 2

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

Listing A.4: Good curly braces placement - 2

A.2.5. Semicolons

Don’t use them except in four situations:

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

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

X case "foo": doSomething(); break

Page 87: cloud computing with nodejs (indonesian)

A.2. npm’s Coding Style 76

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

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

10 }

Listing A.5: Good semicolon usage

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

A.2.6. Comma First

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

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

10 , e t c11 , somethingElse

Listing A.6: Comma first

A.2.7. Whitespace

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

use more spaces than are helpful.

A.2.8. Functions

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

Page 88: cloud computing with nodejs (indonesian)

A.2. npm’s Coding Style 77

A.2.9. Callbacks, Sync/async Style

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

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

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

A.2.10. Errors

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

A.2.11. Logging

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

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

A.2.12. Case, naming, etc.

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

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

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

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

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

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

A.2.13. null, undefined, false, 0

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

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

Page 89: cloud computing with nodejs (indonesian)

A.2. npm’s Coding Style 78

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

X Boolean objects are verboten.

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

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

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

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

Page 90: cloud computing with nodejs (indonesian)

LAMPIRAN B

Commit History dari Penulis Utama dan Kontributor

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

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

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

79

Page 91: cloud computing with nodejs (indonesian)

B. Commit History dari Penulis Utama dan Kontributor 80

33 Memperbaiki s e d i k i t typo , kurang satu { d i f oo tno t e wik iped ia utk JSON34 Bab 2 s e l e s a i35 Bab 3 − penger t ian PBO dan d e f i n i s i obyek −> s e l e s a i36 Menambahkan Aj i Kisworo Mukti ke kont r ibuto r d i README.md37 Minor r e v i s i o n d i bab 5 , menambahkan gambar npmls ( soa lnya kode ASCII keluarannya38 kacau di LaTex dan saya blm tau workaround−nya39 Mengubah cover −> l eb i h umum, gant i dg logo NodeJS , menambahkan Aj i ke kontr ibutor ,40 appendix B −> commit h i s t da r i kont r ibuto r41 Menambahkan mater i PBO => melengkapi d e f i n i s i obyek s e r t a i nh e r i t an c e . Contoh42 i nh e r i t an c e . j s ditambahkan43 Bab 3 − Pemrograman fung s i ona l d i JS => penge r t i a + beberapa po int yg akan dibahas44 Menambahkan i n f o tentang koma−s c r i p t d i README.md dan Make f i l e v e r s i t e r a kh i r45 Menambahkan nested func t i on s d i bab 246 Menambahkan source code nested . j s ( bab 2)47 Bab 3 − beberapa penambahan di pemrograman fung s i ona l48 Bab 3 − Lambda Express ion + contoh49 Higher−order function − Bab 350 Menyelesaikan Closure dan Currying d i Bab 3 . Bab 3 sudah s e l e s a i .51 Mengganti s t ruk tu r − bab 4 −> 5 dan seba l i knya . Bab 4 s e l e s a i , Bab 3 minor rev52 Bab 5 −> (A) Synchronous programming53 Bab 5 −> reo r g an i s a s i , minor r e v i s i o n54 Bab 5 : Event−Driven Programming menggunakan events . EventEmitter . => Bab 5 s e l e s a i55 Bab 6 : S ed i k i t pen j e l a san tentang db NoSQL56 Bab 6 − menambahkan pen j e l a san t tg mongoDB: f i t u r , s e rver , c l i e n t web57 Bab 6 : node−gyp dan i n s t a l a s i d r i v e r mongodb58 Bab 6 : menambahkan i n s t a l a s i npm untuk mongodb59 Bab 6 : i n s t a l l mongojs , akses mongojs da r i Node . j s . Kurang a p l i k a s i web60 Bab 4 : menambahkan i n f o t tg i n s t a l l ke homedir ( j i k a berada dlm home) dan61 node_modules ( j i k a d i l ua r home)62 Bab 6 : memulai a p l i k a s i web dengan node j s+exp r e s s j s+mongodb63 Bab 6 : s r c code utk a p l i k a s i web node j s+expre s s+mongoDB s e l e s a i64 Bab 6 s e l e s a i65 Reorgan i sa s i bab 7 dan 8 , menghapus db mongoDB, menambahkan README.md utk l a t i han2 d i bab 666 Edit README.md bab 667 Menambah i s i bab 7 dan 868 Bab 8 : source code utk socke t . i o69 Bab 8 s e l e s a i , menambahkan contoh a p l i k a s i Socket . i o70 S e l e s a i . s e d i k i t pembenahan . ha r i i n i bab 7 dan 8 s e l e s a i71 Rev i s i minor bab 6 dan 872 Menambahkan da f t a r pustaka yang digunakan73 Rev i s i minor d i bbrp bab , terutama t e r k a i t margin kanan yg t e r l a l u bablas74 Menambahkan indeks7576 Bambang Purnomosidi D. P. ( 1 ) :77 Merge pu l l r eque s t #1 from adzymaniac/master

Listing B.1: Commit history

Page 92: cloud computing with nodejs (indonesian)

Indeks

AJAX, 64Aliran kendali, 27Array, 24Asynchronous, 45

Bayeux Protocol, 65Boolean, 24BOSH, 65

Callback, 45Closure, 34Cloud Computing, 1

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

CloudFoundry, 4vmc, 4

Comet, 65CommonJS, 19Currying, 34

Dynamically typed, 20

ECMAScript, 19Ekspresi Lambda, 32Event-Driven, 44events.EventEmitter, 44

Floating-point, 25

Fungsi, 22Fungsi Anonim, 23Fungsi rekursif, 23

Higher-order Function, 33

Identifier, 21if, 27Integer, 24

JSON, 26Validator, 43

Konstanta, 21

Literal, 24Looping, 28

mongoDB, 47Driver, 52

Multitenancy, 3MVC, 58

dan ExpressJS, 60

Nested functions, 23Node-gyp, 51Node.js, 4

Hosting, 4Non-blocking IO, 45NOSQL, 47npm, 38

Cari paket, 40

81

Page 93: cloud computing with nodejs (indonesian)

Indeks 82

Hapus paket, 40Info paket, 41install paket, 39Struktur paket, 39Update paket, 42

Obyek, 25, 35

PBO, 35Penanganan error, 31Pewarisan, 36Pola arsitektur, 58

Readline, 19Real-time Web, 64REPL, 17

Server-Sent Events, 65Socket.io, 66String, 25switch, 27

Tipe data, 20

Variabel, 21

WebSocket, 66