Cloud Computing Nodejs 121226072217 Phpapp02

94
Pengembangan Aplikasi Cloud Computing Menggunakan Node.js Oleh: Bambang Purnomosidi D. P. (http://bpdp.name) Aji Kisworo Mukti (http://adzymaniac.web.id) January 7, 2013

description

Enter

Transcript of Cloud Computing Nodejs 121226072217 Phpapp02

Page 1: Cloud Computing Nodejs 121226072217 Phpapp02

Pengembangan Aplikasi Cloud ComputingMenggunakan Node.js

Oleh:

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

January 7, 2013

Page 2: Cloud Computing Nodejs 121226072217 Phpapp02

Kata Pengantar

Buku bebas ini merupakan buku yang dirancang untuk keperluan memberikan penge-tahuan mendasar pengembangan aplikasi berbasis Cloud Computing, khususnya menggu-nakan Node.js. Pada buku ini akan dibahas penggunaan Node.js untuk mengembangkanaplikasi SaaS (Software as a Service). Node.js merupakan software di sisi server yangdikembangkan dari engine JavaScript dari Google, yaitu V8. Jika selama ini kebanyakanorang mengenal JavaScript hanya di sisi klien (browser), dengan Node.js ini, pemro-gram bisa menggunakan JavaScript di sisi server. Meskipun ini bukan hal baru, tetapiparadigma pemrograman yang dibawa oleh Node.js menarik untuk mengembangkan ap-likasi Web (selain kita hanya perlu menggunakan 1 bahasa yang sama di sisi servermaupun di sisi klien).Untuk mengikuti materi yang ada pada buku ini, pembaca diharapkan menyiapkan

peranti komputer dengan beberapa software berikut terpasang:

X Sistem operasi Linux (distribusi apa saja) - lihat di http://www.distrowatch.com.

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

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

X mongoDB (basis data NOSQL) - bisa diperoleh di http://www.mongodb.org

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

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

i

Page 3: Cloud Computing Nodejs 121226072217 Phpapp02

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 . . . . . . . . . . . . . . . . . . . . . . . . . 121.8.1. Push, Delete, Update Aplikasi . . . . . . . . . . . . . . . . . . . . . 121.8.2. Menggunakan Framework ExpressJS . . . . . . . . . . . . . . . . . 121.8.3. Tanpa Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2. REPL dan Dasar-dasar JavaScript di Node.js 192.1. REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.1.1. Mengaktifkan REPL . . . . . . . . . . . . . . . . . . . . . . . . . . 19

ii

Page 4: Cloud Computing Nodejs 121226072217 Phpapp02

Daftar Isi iii

2.1.2. Perintah-perintah REPL . . . . . . . . . . . . . . . . . . . . . . . . 202.2. Dasar-dasar JavaScript di Node.js . . . . . . . . . . . . . . . . . . . . . . . 21

2.2.1. Membaca Masukan dari Stream / Masukan Standar (stdin) . . . . 212.2.2. Nilai/Value dan Tipe Data . . . . . . . . . . . . . . . . . . . . . . 222.2.3. Variabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2.4. Konstanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2.5. Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Pengertian Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Definisi Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Fungsi Anonim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Fungsi Rekursif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Fungsi di dalam Fungsi / Nested Functions . . . . . . . . . . . . . 25

2.2.6. Literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Literal Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Literal Boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Literal Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Literal Floating-point . . . . . . . . . . . . . . . . . . . . . . . . . 27Literal Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Literal String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.2.7. Struktur Data dan Representasi JSON . . . . . . . . . . . . . . . . 282.2.8. Aliran Kendali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Pernyataan Kondisi if .. else if .. else . . . . . . . . . . . . . . . . 29Pernyataan switch . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Looping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

2.2.9. Penanganan Error . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3. Paradigma Pemrograman di JavaScript 343.1. Pemrograman Fungsional . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

3.1.1. Ekspresi Lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.1.2. Higher-order Function . . . . . . . . . . . . . . . . . . . . . . . . . 353.1.3. Closure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363.1.4. Currying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

3.2. Pemrograman Berorientasi Obyek . . . . . . . . . . . . . . . . . . . . . . . 373.2.1. Pengertian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.2.2. Definisi Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.2.3. Inheritance / Pewarisan . . . . . . . . . . . . . . . . . . . . . . . . 38

4. Mengelola Paket Menggunakan npm 404.1. Apakah npm Itu? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404.2. Menggunakan npm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

4.2.1. Instalasi Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.2.2. Struktur Instalasi Paket Node.js . . . . . . . . . . . . . . . . . . . 414.2.3. Menghapus Paket / Uninstall . . . . . . . . . . . . . . . . . . . . . 424.2.4. Mencari Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Page 5: Cloud Computing Nodejs 121226072217 Phpapp02

Daftar Isi iv

4.2.5. Menampilkan Informasi Paket . . . . . . . . . . . . . . . . . . . . . 434.2.6. Memperbaharui Paket . . . . . . . . . . . . . . . . . . . . . . . . . 44

5. Node.js dan Web: Teknik Pengembangan Aplikasi 455.1. Pendahuluan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.2. Event-Driven Programming dan EventEmitter . . . . . . . . . . . . . . . . 465.3. Asynchronous / Non-blocking IO dan Callback . . . . . . . . . . . . . . . 47

6. Mengakses Basis Data NoSQL: mongoDB 496.1. Apa itu Basis Data NoSQL? . . . . . . . . . . . . . . . . . . . . . . . . . . 496.2. Mengenal mongoDB dan Fitur-fiturnya . . . . . . . . . . . . . . . . . . . . 49

6.2.1. Memulai Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506.2.2. Klien dan Shell mongoDB . . . . . . . . . . . . . . . . . . . . . . . 516.2.3. Documents dan Collections . . . . . . . . . . . . . . . . . . . . . . 51

6.3. Node.js dan MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.3.1. Node-gyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.3.2. Driver Node.js untuk mongoDB . . . . . . . . . . . . . . . . . . . . 536.3.3. Mengakses mongoDB dari Node.js . . . . . . . . . . . . . . . . . . 54

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

7. Pola Arsitektur Aplikasi Web: MVC dan ExpressJS 597.1. Apa itu Pola Arsitektur? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597.2. Pola Arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS . . . . . . . 61

7.3.1. Struktur Aplikasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617.3.2. File-file yang Diperlukan . . . . . . . . . . . . . . . . . . . . . . . . 627.3.3. Hasil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

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

8. Real-time Web Menggunakan Socket.io 658.1. Apa itu Real-time Web? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658.2. Teknologi Pendukung Real-time Web . . . . . . . . . . . . . . . . . . . . . 65

8.2.1. Ajax Technology . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658.2.2. Comet dan Push Technology . . . . . . . . . . . . . . . . . . . . . . 66

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

8.2.3. WebSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678.3. Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

8.3.1. Apa itu Socket.io? . . . . . . . . . . . . . . . . . . . . . . . . . . . 678.3.2. Menggunakan Socket.io untuk Real-time Web . . . . . . . . . . . . 68

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

Page 6: Cloud Computing Nodejs 121226072217 Phpapp02

Daftar Isi v

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

Daftar Pustaka 73

Lampiran 75

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

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

B. Commit History dari Penulis Utama dan Kontributor 80

Indeks 81

Page 7: Cloud Computing Nodejs 121226072217 Phpapp02

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.6. Hasil update dengan menyertakan versi Node.js . . . . . . . . . . . . . . . 161.7. Deployement menggunakan versi runtime tertentu . . . . . . . . . . . . . . 171.8. Hasil deployement app.js tanpa framework . . . . . . . . . . . . . . . . . . 18

4.1. Hasil perintah npm ls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

6.1. Admin web console untuk mongoDB . . . . . . . . . . . . . . . . . . . . . 52

7.1. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607.2. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

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

vi

Page 8: Cloud Computing Nodejs 121226072217 Phpapp02

Listing Program

1.1. Instalasi vmc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2. Hasil gem yang terinstall . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3. Mengaktifkan direktori "bin" hasil instalasi gem . . . . . . . . . . . . . . . 81.4. Hasil opsi help dari vmc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.5. Mengubah target server - belum ada konfigurasi . . . . . . . . . . . . . . . 91.6. Mengubah target server - setelah konfigurasi . . . . . . . . . . . . . . . . . 91.7. Login ke server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.8. Mengubah password server . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.9. Hasil dari download Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . 111.10. Ekstraksi Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.11. Konfigurasi variabel lingkungan Node.js . . . . . . . . . . . . . . . . . . . 111.12. Instalasi ExpressJS menggunakan npm . . . . . . . . . . . . . . . . . . . . 121.13. Perintah express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.14. Menggunakan express untuk membuat rerangka aplikasi . . . . . . . . . . 121.15. package.json untuk ExpressJS . . . . . . . . . . . . . . . . . . . . . . . . . 131.16. app.js untuk ExpressJS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.17. Hasil edit routes/index.js . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.18. Deployment aplikasi ExpressJS ke CF . . . . . . . . . . . . . . . . . . . . 141.19. Update: menambahkan versi Node.js ke routes/index.js . . . . . . . . . . . 151.20. Mengupdate aplikasi di server . . . . . . . . . . . . . . . . . . . . . . . . . 151.21. Menghapus aplikasi yang di-deploy di CF . . . . . . . . . . . . . . . . . . 161.22. Deployment ke CF dengan memilih runtime Node.js . . . . . . . . . . . . 161.23. app.js tanpa framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.24. Deployment app.js tanpa framework . . . . . . . . . . . . . . . . . . . . . 17

2.1. Node.js REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.2. Contoh penggunaan .load dalam REPL . . . . . . . . . . . . . . . . . . . . 202.3. Contoh penggunaan perintah .save di sesi REPL . . . . . . . . . . . . . . 20

vii

Page 9: Cloud Computing Nodejs 121226072217 Phpapp02

Listing Program viii

2.4. readline.js: penggunaan pustaka Readline untuk masukan . . . . . . . . . 222.5. Hasil eksekusi readline.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.6. Fitur dynamically typed language . . . . . . . . . . . . . . . . . . . . . . . 232.7. Contoh konstanta dalam JavaScript . . . . . . . . . . . . . . . . . . . . . . 232.8. Sintaksis Fungsi dalam JavaScript . . . . . . . . . . . . . . . . . . . . . . . 242.9. Pemanggilan Fungsi dalam JavaScript . . . . . . . . . . . . . . . . . . . . 242.10. Contoh deklarasi fungsi dan pemanggilannya . . . . . . . . . . . . . . . . 242.11. Fungsi anonim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.12. Fungsi rekursif untuk menghitung faktorial . . . . . . . . . . . . . . . . . 252.13. Fungsi di dalam Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.14. Array di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.15. Representasi JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.16. Pernyataan if .. else if .. else . . . . . . . . . . . . . . . . . . . . . . . . . 292.17. Pernyataan if .. else if .. else . . . . . . . . . . . . . . . . . . . . . . . . . 292.18. Pernyataan for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.19. Pernyataan for .. in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.20. Pernyataan do .. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.21. Pernyataan while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.22. Pernyataan break dan continue . . . . . . . . . . . . . . . . . . . . . . . . 322.23. Pernyataan break dengan label . . . . . . . . . . . . . . . . . . . . . . . . 322.24. Pernyataan break dengan label . . . . . . . . . . . . . . . . . . . . . . . . 332.25. Pernyataan break dengan label . . . . . . . . . . . . . . . . . . . . . . . . 33

3.1. Ekspresi Lambda di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . 353.2. Higher-order Function di JavaScript . . . . . . . . . . . . . . . . . . . . . 353.3. Closure di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363.4. Currying di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363.5. Definisi obyek di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . 373.6. Pewarisan di PBO JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.1. Sintaksis lengkap perintah npm . . . . . . . . . . . . . . . . . . . . . . . . 404.2. Cara install paket menggunakan npm . . . . . . . . . . . . . . . . . . . . . 414.3. Argumen npm untuk melihat daftar paket terpasang . . . . . . . . . . . . 424.4. Perintah menghapus paket di npm . . . . . . . . . . . . . . . . . . . . . . 424.5. Perintah menghapus paket di npm . . . . . . . . . . . . . . . . . . . . . . 434.6. Menampilkan rincian suatu paket dalam format JSON . . . . . . . . . . . 434.7. Memperbaharui paket lokal . . . . . . . . . . . . . . . . . . . . . . . . . . 444.8. Memperbaharui paket secara global . . . . . . . . . . . . . . . . . . . . . . 44

5.1. pegawai.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.2. server.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.3. server-on-error.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.4. Membaca file secara synchronous . . . . . . . . . . . . . . . . . . . . . . . 475.5. Membaca file secara asynchronous . . . . . . . . . . . . . . . . . . . . . . 48

Page 10: Cloud Computing Nodejs 121226072217 Phpapp02

Listing Program ix

6.1. Menjalankan server MongoDB (mongod) . . . . . . . . . . . . . . . . . . . 506.2. Mengakhiri server MongoDB (mongod) . . . . . . . . . . . . . . . . . . . . 516.3. Shell mongoDB (mongo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.4. Sesi dalam shell mongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.5. Instalasi node-gyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.6. Instalasi driver mongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.7. Instalasi driver mongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.8. Mengakses mongoDB dari Node.js . . . . . . . . . . . . . . . . . . . . . . 546.9. Mengakses mongoDB dari Node.js . . . . . . . . . . . . . . . . . . . . . . 556.10. app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.11. package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.12. routes/employee.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.13. views/employee.jade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.14. views/index.jade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

7.1. Struktur direktori asli aplikasi ExpressJS . . . . . . . . . . . . . . . . . . . 617.2. Struktur direktori ExpressJS sesuai pola MVC . . . . . . . . . . . . . . . 617.3. app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.4. controllers/user.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.5. models/db.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637.6. package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

8.1. Membuat kerangka aplikasi dengan ExpressJS . . . . . . . . . . . . . . . . 688.2. package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698.3. Isi direktori dist di socket.io-client . . . . . . . . . . . . . . . . . . . . . . 698.4. app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.5. views/index.jade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.6. routes/index.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.7. Menjalankan server Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . 718.8. Kode sumber di browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

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

B.1. Commit history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Page 11: Cloud Computing Nodejs 121226072217 Phpapp02

Daftar Tabel

x

Page 12: Cloud Computing Nodejs 121226072217 Phpapp02

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 Nodejs 121226072217 Phpapp02

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 Nodejs 121226072217 Phpapp02

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 Nodejs 121226072217 Phpapp02

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 Nodejs 121226072217 Phpapp02

1.7. Layanan Hosting Aplikasi: CloudFoundry 5

Gambar 1.2.: Pendaftaran di CF

1 $ gem search vmc −−remote | grep "\bvmc\ s "2 vmc ( 0 . 4 . 7 )3 $ gem i n s t a l l vmc4 Fetching : json_pure −1 . 6 . 7 . gem (100%)5 Fetching : i n t e r a c t −0 . 5 . 1 . gem (100%)6 Fetching : mult ipart−post −1 . 1 . 5 . gem (100%)7 Fetching : multi_json −1 . 4 . 0 . gem (100%)8 Fetching : rubyzip −0 . 9 . 9 . gem (100%)9 Fetching : cfoundry −0 .4 . 17 . gem (100%)

10 Fetching : c louseau −0 . 0 . 2 . gem (100%)11 Fetching : mothership −0 . 3 . 5 . gem (100%)12 Fetching : mani fes t s−vmc−plugin −0 .4 . 19 . gem (100%)13 Fetching : tunnel−dummy−vmc−plugin −0 . 0 . 2 . gem (100%)14 Fetching : vmc−0 . 4 . 7 . gem (100%)15 Su c c e s s f u l l y i n s t a l l e d json_pure −1.6 .716 Su c c e s s f u l l y i n s t a l l e d i n t e r a c t −0.5 .117 Su c c e s s f u l l y i n s t a l l e d mult ipart−post −1.1 .518 Su c c e s s f u l l y i n s t a l l e d multi_json −1.4 .019 Su c c e s s f u l l y i n s t a l l e d rubyzip −0.9 .920 Su c c e s s f u l l y i n s t a l l e d cfoundry −0.4.1721 Su c c e s s f u l l y i n s t a l l e d c louseau −0.0 .222 Su c c e s s f u l l y i n s t a l l e d mothership −0.3 .523 Su c c e s s f u l l y i n s t a l l e d mani fes t s−vmc−plugin −0.4.1924 Su c c e s s f u l l y i n s t a l l e d tunnel−dummy−vmc−plugin −0.0 .225 Su c c e s s f u l l y i n s t a l l e d vmc−0.4 .726 11 gems i n s t a l l e d27 I n s t a l l i n g r i documentation for json_pure − 1 . 6 . 7 . . .

Page 17: Cloud Computing Nodejs 121226072217 Phpapp02

1.7. Layanan Hosting Aplikasi: CloudFoundry 6

Gambar 1.3.: Hasil proses pendaftaran di CF

28 I n s t a l l i n g r i documentation for i n t e r a c t − 0 . 5 . 1 . . .29 I n s t a l l i n g r i documentation for mult ipart−post − 1 . 1 . 5 . . .30 I n s t a l l i n g r i documentation for multi_json − 1 . 4 . 0 . . .31 I n s t a l l i n g r i documentation for rubyzip − 0 . 9 . 9 . . .32 I n s t a l l i n g r i documentation for cfoundry − 0 . 4 . 1 7 . . .33 I n s t a l l i n g r i documentation for c louseau − 0 . 0 . 2 . . .34 I n s t a l l i n g r i documentation for mothership − 0 . 3 . 5 . . .35 I n s t a l l i n g r i documentation for mani fest s−vmc−plugin − 0 . 4 . 1 9 . . .36 I n s t a l l i n g r i documentation for tunnel−dummy−vmc−plugin − 0 . 0 . 2 . . .37 I n s t a l l i n g r i documentation for vmc− 0 . 4 . 7 . . .38 I n s t a l l i n g RDoc documentation for json_pure − 1 . 6 . 7 . . .39 I n s t a l l i n g RDoc documentation for i n t e r a c t − 0 . 5 . 1 . . .40 I n s t a l l i n g RDoc documentation for mult ipart−post − 1 . 1 . 5 . . .41 I n s t a l l i n g RDoc documentation for multi_json − 1 . 4 . 0 . . .42 I n s t a l l i n g RDoc documentation for rubyzip − 0 . 9 . 9 . . .43 I n s t a l l i n g RDoc documentation for cfoundry − 0 . 4 . 1 7 . . .44 I n s t a l l i n g RDoc documentation for c louseau − 0 . 0 . 2 . . .45 I n s t a l l i n g RDoc documentation for mothership − 0 . 3 . 5 . . .46 I n s t a l l i n g RDoc documentation for mani fes t s−vmc−plugin − 0 . 4 . 1 9 . . .47 I n s t a l l i n g RDoc documentation for tunnel−dummy−vmc−plugin − 0 . 0 . 2 . . .48 I n s t a l l i n g RDoc documentation for vmc− 0 . 4 . 7 . . .49 $

Listing 1.1: Instalasi vmc

Hasil dari instalasi tersebut adalah sebagai berikut:1 $ gem l i s t23 ∗∗∗ LOCAL GEMS ∗∗∗4

Page 18: Cloud Computing Nodejs 121226072217 Phpapp02

1.7. Layanan Hosting Aplikasi: CloudFoundry 7

Gambar 1.4.: E-mail persetujuan dan pemberitahuan credentials

5 b igdec imal ( 1 . 1 . 0 )6 cfoundry ( 0 . 4 . 1 7 )7 c louseau ( 0 . 0 . 2 )8 i n t e r a c t ( 0 . 5 . 1 )9 io−conso l e ( 0 . 3 )

10 j son ( 1 . 5 . 4 )11 json_pure ( 1 . 6 . 7 )12 mani fes t s−vmc−p lug in ( 0 . 4 . 1 9 )13 min i t e s t ( 2 . 5 . 1 )14 mothership ( 0 . 3 . 5 )15 multi_json ( 1 . 4 . 0 )16 mult ipart−post ( 1 . 1 . 5 )17 rake ( 0 . 9 . 2 . 2 )18 rdoc ( 3 . 9 . 4 )19 rubyzip ( 0 . 9 . 9 )20 tunnel−dummy−vmc−p lug in ( 0 . 0 . 2 )21 vmc ( 0 . 4 . 7 )22 $

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):

Page 19: Cloud Computing Nodejs 121226072217 Phpapp02

1.7. Layanan Hosting Aplikasi: CloudFoundry 8

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:1 $ vmc help2 Showing ba s i c command set . Pass −−a l l to l i s t a l l commands .34 Gett ing Started5 l o g i n [USERNAME] Authent icate with the t a r g e t6 t a r g e t [URL] Set or d i sp l ay the t a r g e t cloud , o rgan i za t i on , and space7 logout Log out from the t a r g e t8 i n f o Display in fo rmat ion on the cur rent target , user , e t c .9

10 App l i ca t i on s11 apps L i s t your app l i c a t i o n s12 app [APP] Show app in fo rmat ion1314 Management15 s t a r t APPS . . . S ta r t an app l i c a t i on16 d e l e t e APPS . . . De lete an app l i c a t i on17 push [NAME] Push an app l i c a t i on , sync ing changes i f i t e x i s t s18 stop APPS . . . Stop an app l i c a t i o n19 r e s t a r t APPS . . . Stop and s t a r t an app l i c a t i o n2021 S e r v i c e s22 s e r v i c e INSTANCE Show s e r v i c e i n s t ance in fo rmat ion23 s e r v i c e s L i s t your s e r v i c e i n s t an c e s2425 Management26 create−s e r v i c e [SERVICE] [NAME] Create a s e r v i c e27 bind−s e r v i c e SERVICE APP Bind a s e r v i c e to an app l i c a t i on28 unbind−s e r v i c e SERVICE APP Unbind a s e r v i c e from an app l i c a t i on29 de l e t e−s e r v i c e [ INSTANCE] Delete a s e r v i c e30 tunne l [ INSTANCE] [CLIENT] Te l l s you to i n s t a l l tunnel−vmc−p lug in3132 Organ izat ions33 create−org [NAME] Create an o rgan i z a t i on34 orgs L i s t a v a i l a b l e o r gan i z a t i on s35 de l e t e−org [ORGANIZATION] Delete an o rgan i z a t i on36 org [ORGANIZATION] Show organ i z a t i on in fo rmat ion3738 Spaces39 create−space [NAME] [ORGANIZATION] Create a space in an o rgan i z a t i on40 space [SPACE] Show space in fo rmat ion41 de l e t e−space SPACES . . . De lete a space and i t s contents42 spaces [ORGANIZATION] L i s t spaces in an o rgan i z a t i on4344 Routes45 create−route [URL] Create a route46 de l e t e−route [ROUTE] Delete a route47 route s L i s t route s in a space4849 Domains50 create−domain NAME Create a domain51 de l e t e−domain [DOMAIN] Delete a domain52 add−domain NAME Add a domain to a space53 remove−domain [DOMAIN] Remove a domain from a space54 domains [SPACE] L i s t domains in a space5556 Options :

Page 20: Cloud Computing Nodejs 121226072217 Phpapp02

1.7. Layanan Hosting Aplikasi: CloudFoundry 9

57 −−[no−] c o l o r Use c o l o r f u l output58 −−[no−] s c r i p t Shortcut for −−qu i e t and −−f o r c e59 −V, −−verbose Pr int ext ra in fo rmat ion60 −f , −−[no−] f o r c e Skip i n t e r a c t i o n when po s s i b l e61 −h , −−help Show command usage & i n s t r u c t i o n s62 −m, −−mani fe s t FILE Path to mani f e s t f i l e to use63 −q , −−[no−] qu i e t S imp l i f y output format64 −t , −−t r a c e Show API r eque s t s and re sponse s65 −u , −−proxy EMAIL Act as another user ( admin only )66 −v , −−ve r s i on Pr int v e r s i on number67 $

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 t2 Errno : :ENOENT: No such f i l e or d i r e c t o r y − /home/bpdp / .vmc/ ta r g e t3 For more in format ion , s ee ~/.vmc/ crash4 $

Listing 1.5: Mengubah target server - belum ada konfigurasi

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

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

Listing 1.6: Mengubah target server - setelah konfigurasi

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

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

10 $ vmc i n f o −−a l l11 Gett ing runtimes . . . OK12 Gett ing frameworks . . . OK13 Gett ing s e r v i c e s . . . OK14

Page 21: Cloud Computing Nodejs 121226072217 Phpapp02

1.7. Layanan Hosting Aplikasi: CloudFoundry 10

15 VMware ’ s Cloud Appl i ca t ion Platform1617 ta r g e t : https : // api . c loudfoundry . com18 ve r s i on : 0 .99919 support : http :// support . c loudfoundry . com2021 user : bambangpdp@yahoo . com2223 runtime d e s c r i p t i o n24 java 1 . 6 . 0_2425 java7 1 . 7 . 0_0426 node 0 . 4 . 1 227 node06 0 . 6 . 828 node08 0 . 8 . 229 ruby18 1 . 8 . 7 p35730 ruby19 1 . 9 . 2 p1803132 framework d e s c r i p t i o n33 g r a i l s34 java_web35 l i f t36 node37 play38 rack39 r a i l s 340 s i n a t r a41 spr ing42 standa lone4344 s e r v i c e v e r s i on prov ide r d e s c r i p t i o n45 mongodb 2 .0 core MongoDB NoSQL s t o r e46 mysql 5 . 1 core MySQL database s e r v i c e47 po s t g r e s q l 9 . 0 core PostgreSQL database s e r v i c e ( vFabric )48 rabbitmq 2 .4 core RabbitMQ message queue49 r e d i s 2 . 4 core Redis key−value s t o r e s e r v i c e50 r e d i s 2 . 2 core Redis key−value s t o r e s e r v i c e51 r e d i s 2 . 6 core Redis key−value s t o r e s e r v i c e5253 $

Listing 1.7: Login ke server

Untuk mengubah password:1 $ vmc passwd2 New Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗34 Ver i f y Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗56 Changing password . . . OK7 $

Listing 1.8: 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 bisa

Page 22: Cloud Computing Nodejs 121226072217 Phpapp02

1.7. Layanan Hosting Aplikasi: CloudFoundry 11

menginstall 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 Linux(versi 0.8.16 pada tanggal 7 Januari 2012).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.16. Downloadfile tersebut, kemudian simpan di direktori tertentu (terserah anda, dibuku inidiletakkan di $HOME/master/nodejs).

1 $ l s −l a2 . . .3 . . .4 −rw−r−−r−− 1 bpdp use r s 4406113 Dec 13 06 :16 node−v0 .8.16− l inux−x86 . ta r . gz5 . . .6 . . .7 $

Listing 1.9: Hasil dari download Node.js

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

1 $ cd2 $ cd so f tware3 $ ta r −xzvf ~/master / node j s /node−v0 .8.16− l inux−x86 . ta r . gz4 $ ln −s node−v0 .8.16− l inux−x86 node j s5 $ l s −l a6 . . . .7 . . . .8 lrwxrwxrwx 1 bpdp use r s 22 Dec 14 23 :45 node j s −> node−v0 .8.16− l inux−x869 drwxr−xr−x 6 bpdp use r s 4096 Dec 13 06 :16 node−v0 .8.16− l inux−x86

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

Listing 1.10: 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.11: Konfigurasi variabel lingkungan Node.js

Page 23: Cloud Computing Nodejs 121226072217 Phpapp02

1.8. Pengelolaan Aplikasi di Cloud 12

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

1.8. Pengelolaan Aplikasi di Cloud

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

1.8.1. Push, Delete, Update Aplikasi

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

1.8.2. Menggunakan Framework ExpressJS

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

Listing 1.12: Instalasi ExpressJS menggunakan npm

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

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

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

Listing 1.13: Perintah express

Setelah itu, kita bisa membuat rerangka aplikasi ExpressJS dengan cara berikut:1 $ mkdir h e l l o2 $ cd h e l l o3 $ expre s s45 c r e a t e : .6 c r e a t e : . / package . j son

Page 24: Cloud Computing Nodejs 121226072217 Phpapp02

1.8. Pengelolaan Aplikasi di Cloud 13

7 c r e a t e : . / app . j s8 c r e a t e : . / pub l i c9 c r e a t e : . / pub l i c / images

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

Listing 1.14: Menggunakan express untuk membuat rerangka aplikasi

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

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

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

Listing 1.15: package.json untuk ExpressJS

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 , user = r equ i r e ( ’./ routes/user’ )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 ( ) ) ;

Page 25: Cloud Computing Nodejs 121226072217 Phpapp02

1.8. Pengelolaan Aplikasi di Cloud 14

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 ( ’/users ’ , u se r . 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 } ) ;

Listing 1.16: app.js untuk ExpressJS

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

Listing 1.17: Hasil edit routes/index.js

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

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

10 1 : node11 2 : node0612 3 : node0813 4 : other14 Runtime> 31516 1 : 64M17 2 : 128M18 3 : 256M19 4 : 512M20 5 : 1G21 Memory Limit> 64M22

Page 26: Cloud Computing Nodejs 121226072217 Phpapp02

1.8. Pengelolaan Aplikasi di Cloud 15

Gambar 1.5.: Hasil push ke server

23 Creat ing he l l o−expre s s . . . OK2425 1 : he l l o−expre s s . c loudfoundry . com26 2 : none27 URL> he l l o−expre s s . c loudfoundry . com2829 Updating he l l o−expre s s . . . FAILED30 The URI : "hello -express.cloudfoundry.com" has a l r eady been taken or r e s e rved3132 1 : he l l o−expre s s . c loudfoundry . com33 2 : none34 URL> bpdp−he l l o−expre s s . c loudfoundry . com3536 Updating he l l o−expre s s . . . OK3738 Create s e r v i c e s for app l i c a t i on?> n3940 Save c on f i gu r a t i on?> n4142 Uploading he l l o−expre s s . . . OK43 Sta r t i ng he l l o−expre s s . . . OK44 Checking he l l o−expre s s . . . OK4546 $

Listing 1.18: 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 /*2 * GET home page.3 */45 export s . index = function ( req , r e s ){6 var nv = proce s s . v e r s i on ;7 r e s . render ( ’index’ , { t i t l e : ’Express app at CloudFoundry with Node.js ’ + nv } ) ;8 } ;

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

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

Page 27: Cloud Computing Nodejs 121226072217 Phpapp02

1.8. Pengelolaan Aplikasi di Cloud 16

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

6 $ vmc push he l l o−expre s s7 Uploading he l l o−expre s s . . . OK8 Stopping he l l o−expre s s . . . OK9

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

Listing 1.20: Mengupdate aplikasi di server

Hasilnya bisa dilihat di Gambar 1.6Untuk menghapus aplikasi:

1 $ vmc de l e t e bpdp−m1−hel lonoframework2 Rea l ly d e l e t e bpdp−m1−hel lonoframework?> y34 De le t ing bpdp−m1−hel lonoframework . . . OK56 $

Listing 1.21: Menghapus aplikasi yang di-deploy di CF

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

10 1 : 64M11 2 : 128M12 3 : 256M13 4 : 512M14 5 : 1G15 Memory Limit> 64M1617 Creat ing bpdp−he l l o−expres s06 . . . OK1819 1 : bpdp−he l l o−expres s06 . c loudfoundry . com20 2 : none21 URL> bpdp−he l l o−expres s06 . c loudfoundry . com2223 Updating bpdp−he l l o−expres s06 . . . OK24

Page 28: Cloud Computing Nodejs 121226072217 Phpapp02

1.8. Pengelolaan Aplikasi di Cloud 17

Gambar 1.7.: Deployement menggunakan versi runtime tertentu

25 Create s e r v i c e s for app l i c a t i on?> n2627 Save c on f i gu r a t i on?> n2829 Uploading bpdp−he l l o−expres s06 . . . OK30 Sta r t i ng bpdp−he l l o−expres s06 . . . OK31 Checking bpdp−he l l o−expres s06 . . . OK32 $

Listing 1.22: 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):

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.23: app.js tanpa framework

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

Page 29: Cloud Computing Nodejs 121226072217 Phpapp02

1.8. Pengelolaan Aplikasi di Cloud 18

Gambar 1.8.: Hasil deployement app.js tanpa framework

10 1 : node11 2 : node0612 3 : node0813 4 : other14 Runtime> 31516 1 : 64M17 2 : 128M18 3 : 256M19 4 : 512M20 5 : 1G21 Memory Limit> 64M2223 Creat ing he l l o−noframework . . . OK2425 1 : he l l o−noframework . c loudfoundry . com26 2 : none27 URL> he l l o−noframework . c loudfoundry . com2829 Updating he l l o−noframework . . . OK3031 Create s e r v i c e s for app l i c a t i on?> n3233 Save c on f i gu r a t i on?> n3435 Uploading he l l o−noframework . . . OK36 Sta r t i ng he l l o−noframework . . . OK37 Checking he l l o−noframework . . . OK38 $

Listing 1.24: Deployment app.js tanpa framework

Hasilnya bisa dilihat pada Gambar 1.8

Page 30: Cloud Computing Nodejs 121226072217 Phpapp02

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

19

Page 31: Cloud Computing Nodejs 121226072217 Phpapp02

2.1. REPL 20

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 32: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 21

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 33: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 22

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 34: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 23

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 35: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 24

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 36: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 25

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 37: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 26

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 38: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 27

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 39: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 28

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 40: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 29

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 41: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 30

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 42: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 31

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 43: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 32

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 44: Cloud Computing Nodejs 121226072217 Phpapp02

2.2. Dasar-dasar JavaScript di Node.js 33

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 45: Cloud Computing Nodejs 121226072217 Phpapp02

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

34

Page 46: Cloud Computing Nodejs 121226072217 Phpapp02

3.1. Pemrograman Fungsional 35

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 47: Cloud Computing Nodejs 121226072217 Phpapp02

3.1. Pemrograman Fungsional 36

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 48: Cloud Computing Nodejs 121226072217 Phpapp02

3.2. Pemrograman Berorientasi Obyek 37

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 49: Cloud Computing Nodejs 121226072217 Phpapp02

3.2. Pemrograman Berorientasi Obyek 38

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 50: Cloud Computing Nodejs 121226072217 Phpapp02

3.2. Pemrograman Berorientasi Obyek 39

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 51: Cloud Computing Nodejs 121226072217 Phpapp02

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

40

Page 52: Cloud Computing Nodejs 121226072217 Phpapp02

4.2. Menggunakan npm 41

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 . 7 0 /home/bpdp/ so f tware /node−v0 .8.16− 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 53: Cloud Computing Nodejs 121226072217 Phpapp02

4.2. Menggunakan npm 42

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 instalasi dari aplikasi yang sudah kita buatmenggunakan ExpressJS (lihat bab 1):

4.2.3. Menghapus Paket / Uninstall

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

1 $ npm un i n s t a l l 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):

Page 54: Cloud Computing Nodejs 121226072217 Phpapp02

4.2. Menggunakan npm 43

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 . . .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 :

Page 55: Cloud Computing Nodejs 121226072217 Phpapp02

4.2. Menggunakan npm 44

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

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 56: Cloud Computing Nodejs 121226072217 Phpapp02

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.

45

Page 57: Cloud Computing Nodejs 121226072217 Phpapp02

5.2. Event-Driven Programming dan EventEmitter 46

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 58: Cloud Computing Nodejs 121226072217 Phpapp02

5.3. Asynchronous / Non-blocking IO dan Callback 47

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 59: Cloud Computing Nodejs 121226072217 Phpapp02

5.3. Asynchronous / Non-blocking IO dan Callback 48

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 60: Cloud Computing Nodejs 121226072217 Phpapp02

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

49

Page 61: Cloud Computing Nodejs 121226072217 Phpapp02

6.2. Mengenal mongoDB dan Fitur-fiturnya 50

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 62: Cloud Computing Nodejs 121226072217 Phpapp02

6.2. Mengenal mongoDB dan Fitur-fiturnya 51

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 63: Cloud Computing Nodejs 121226072217 Phpapp02

6.2. Mengenal mongoDB dan Fitur-fiturnya 52

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 64: Cloud Computing Nodejs 121226072217 Phpapp02

6.3. Node.js dan MongoDB 53

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−gyp

Listing 6.5: Instalasi node-gyp

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

6.3.2. Driver Node.js untuk mongoDB

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

1 $ npm i n s t a l l mongodb2 npm WARN package . j son app l i c a t i on−name@0 . 0 . 1 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 200 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 /mongodb/−/mongodb−1 . 2 . 7 . tgz6 npm http 200 https : // r e g i s t r y . npmjs . org /mongodb/−/mongodb−1 . 2 . 7 . tgz7 npm http GET https : // r e g i s t r y . npmjs . org /bson /0 . 1 . 58 npm http 304 https : // r e g i s t r y . npmjs . org /bson /0 . 1 . 59

10 > bson@0 . 1 . 5 i n s t a l l /home/bpdp/tmp/ h e l l o /node_modules/mongodb/node_modules/bson11 > node i n s t a l l . j s | | ( exit 0)

Page 65: Cloud Computing Nodejs 121226072217 Phpapp02

6.3. Node.js dan MongoDB 54

1213 ================================================================================14 = =15 = Attempting to bu i ld bson c++ extens i on =16 = Windows : no bu i ld w i l l be attempted as b i n a r i e s are prepackaged =17 = 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 =18 = =19 ================================================================================20 node−gyp c l ean21 node−gyp con f i gu r e bu i ld22 gyp http GET http :// node j s . org / d i s t /v0 . 8 . 1 6 / node−v0 . 8 . 1 6 . ta r . gz23 gyp http 200 http :// node j s . org / d i s t /v0 . 8 . 1 6 / node−v0 . 8 . 1 6 . ta r . gz24 make [ 1 ] : Enter ing d i r e c t o r y ‘/home/bpdp/node_modules/mongodb/node_modules/bson/ bui ld ’25 CXX( ta r g e t ) Re lease / obj . t a r g e t /bson/ ext /bson . o26 SOLINK_MODULE( ta r g e t ) Re lease / obj . t a r g e t /bson . node27 SOLINK_MODULE( ta r g e t ) Re lease / obj . t a r g e t /bson . node : F in i shed28 COPY Release /bson . node29 make [ 1 ] : Leaving d i r e c t o r y ‘/home/bpdp/node_modules/mongodb/node_modules/bson/ bui ld ’30 ch i l d p roce s s ex i t ed with code 031 mongodb@1 . 2 . 7 . . / . . / . . / . . / . . / node_modules/mongodb32 +−− 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 66: Cloud Computing Nodejs 121226072217 Phpapp02

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 55

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 67: Cloud Computing Nodejs 121226072217 Phpapp02

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 56

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 68: Cloud Computing Nodejs 121226072217 Phpapp02

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 57

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.6" ,

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 69: Cloud Computing Nodejs 121226072217 Phpapp02

6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 58

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 70: Cloud Computing Nodejs 121226072217 Phpapp02

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.

59

Page 71: Cloud Computing Nodejs 121226072217 Phpapp02

7.2. Pola Arsitektur MVC 60

Gambar 7.1.: Pola arsitektur MVC

Page 72: Cloud Computing Nodejs 121226072217 Phpapp02

7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 61

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 73: Cloud Computing Nodejs 121226072217 Phpapp02

7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 62

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 74: Cloud Computing Nodejs 121226072217 Phpapp02

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya 63

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 75: Cloud Computing Nodejs 121226072217 Phpapp02

7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya 64

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 76: Cloud Computing Nodejs 121226072217 Phpapp02

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

65

Page 77: Cloud Computing Nodejs 121226072217 Phpapp02

8.2. Teknologi Pendukung Real-time Web 66

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 78: Cloud Computing Nodejs 121226072217 Phpapp02

8.3. Socket.io 67

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 79: Cloud Computing Nodejs 121226072217 Phpapp02

8.3. Socket.io 68

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 80: Cloud Computing Nodejs 121226072217 Phpapp02

8.3. Socket.io 69

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 81: Cloud Computing Nodejs 121226072217 Phpapp02

8.3. Socket.io 70

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 82: Cloud Computing Nodejs 121226072217 Phpapp02

8.3. Socket.io 71

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 83: Cloud Computing Nodejs 121226072217 Phpapp02

8.3. Socket.io 72

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 84: Cloud Computing Nodejs 121226072217 Phpapp02

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.

73

Page 85: Cloud Computing Nodejs 121226072217 Phpapp02

Lampiran

74

Page 86: Cloud Computing Nodejs 121226072217 Phpapp02

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.

75

Page 87: Cloud Computing Nodejs 121226072217 Phpapp02

A.2. npm’s Coding Style 76

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 88: Cloud Computing Nodejs 121226072217 Phpapp02

A.2. npm’s Coding Style 77

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 89: Cloud Computing Nodejs 121226072217 Phpapp02

A.2. npm’s Coding Style 78

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 90: Cloud Computing Nodejs 121226072217 Phpapp02

A.2. npm’s Coding Style 79

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 91: Cloud Computing Nodejs 121226072217 Phpapp02

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

80

Page 92: Cloud Computing Nodejs 121226072217 Phpapp02

B. Commit History dari Penulis Utama dan Kontributor 81

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 93: Cloud Computing Nodejs 121226072217 Phpapp02

Indeks

AJAX, 65Aliran kendali, 29Array, 26Asynchronous, 47

Bayeux Protocol, 66Boolean, 26BOSH, 66

Callback, 47Closure, 36Cloud Computing, 1

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

CloudFoundry, 4vmc, 4

Comet, 66CommonJS, 21Currying, 36

Dynamically typed, 22

ECMAScript, 21Ekspresi Lambda, 34Event-Driven, 46events.EventEmitter, 46

Floating-point, 27

Fungsi, 24Fungsi Anonim, 25Fungsi rekursif, 25

Higher-order Function, 35

Identifier, 23if, 29Integer, 26

JSON, 28Validator, 45

Konstanta, 23

Literal, 26Looping, 30

mongoDB, 49Driver, 53

Multitenancy, 3MVC, 59

dan ExpressJS, 61

Nested functions, 25Node-gyp, 53Node.js, 4

Hosting, 4Non-blocking IO, 47NOSQL, 49npm, 40

Cari paket, 42

82

Page 94: Cloud Computing Nodejs 121226072217 Phpapp02

Indeks 83

Hapus paket, 42Info paket, 43install paket, 41Struktur paket, 41Update paket, 44

Obyek, 27, 37

PBO, 37Penanganan error, 33Pewarisan, 38Pola arsitektur, 59

Readline, 21Real-time Web, 65REPL, 19

Server-Sent Events, 66Socket.io, 67String, 27switch, 29

Tipe data, 22

Variabel, 23

WebSocket, 67