Upload
ngodiep
View
229
Download
0
Embed Size (px)
Citation preview
Pengembangan Aplikasi Cloud ComputingMenggunakan Node.js
Oleh:
Bambang Purnomosidi D. P. (http://bpdp.name)Kontributor:
Aji Kisworo Mukti (http://adzymaniac.web.id)
Buku bebas dengan lisensi Creative Common BY-SA. Silahkan membaca isiselengkapnya serta penjelasannya di
http://wiki.creativecommons.org/Licenses/by-sa/3.0LegalText_(Indonesian)
May 6, 2013
Kata Pengantar
Buku bebas ini merupakan buku yang dirancang untuk keperluan memberikan penge-tahuan mendasar pengembangan aplikasi berbasis Cloud Computing, khususnya meng-gunakan Node.js. Pada buku ini akan dibahas penggunaan Node.js untuk mengem-bangkan aplikasi SaaS (Software as a Service). Node.js merupakan software di sisiserver yang dikembangkan dari engine JavaScript V8 dari Google serta libuv (https://github.com/joyent/libuv)1.Jika selama ini kebanyakan orang mengenal JavaScript hanya di sisi klien (browser),
dengan Node.js ini, pemrogram bisa menggunakan JavaScript di sisi server. Meskipunini bukan hal baru, tetapi paradigma pemrograman yang dibawa oleh Node.js denganevented - asynchronous I/O menarik dalam pengembangan aplikasi Web (selain kitahanya perlu menggunakan 1 bahasa yang sama di sisi server maupun di sisi klien).Untuk mengikuti materi yang ada pada buku ini, pembaca diharapkan menyiapkan
peranti komputer dengan beberapa software berikut terpasang:
X Sistem operasi Linux (distribusi apa saja) - lihat di http://www.distrowatch.com.Sistem operasi Linux ini bukan keharusan, anda bisa menggunakan Windows tetapisilahkan membuat penyesuaian-penyesuaian sendiri yang diperlukan. Kirimi sayapull request jika anda menuliskan pengalaman anda di Windows!
X Git (untuk version control system) - bisa diperoleh di http://git-scm.com. Sayamenggunakan versi 1.8.2.2.
X Ruby (http://www.ruby-lang.org/en/) - diperlukan untuk menginstall dan mengek-sekusi vmc, perintah command line untuk mengelola aplikasi Cloud di Cloud-Foundry. Versi Ruby yang digunakan adalah versi 2.0.0p0 (2013-02-24 revision39474).
X mongoDB (basis data NOSQL) - bisa diperoleh di http://www.mongodb.org, sayamenggunakan versi 2.4.4-pre-
X Vim (untuk mengedit source code) - bisa diperoleh di http://www.vim.org. Jikatidak terbiasa menggunakan Vim, bisa menggunakan editor teks lainnya (atauIDE), misalnya gedit (ada di GNOME), geany (http://geany.org), KATE (adadi KDE), dan lain-lain.
Software utama untuk keperluan workshop ini yaitu Node.js serta command line toolsdari provider Cloud Computing (materi ini menggunakan fasilitas dari CloudFoundry),akan dibahas pada pada bab-bab tertentu. Materi akan lebih banyak berorientasi ke com-mand line / shell sehingga para pembaca sebaiknya sudah memahami cara-cara menggu-nakan shell di Linux. Anda bisa menggunakan shell apa saja (bash, tcsh, zsh, ksh, danlain-lain), saya menggunakan bash 4.2.45(2)-release.Have fun!
1Versi sebelum 0.9.0 menggunakan libev dari Mark Lechmann
i
Daftar Isi
Kata Pengantar i
Daftar Gambar iii
Listing Program iv
Daftar Tabel v
1. Pengenalan Cloud Computing dan Infrastruktur Pengembangan Aplikasi Berba-sis Node.js 11.1. Apa itu Cloud Computing? . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2. Karakteristik Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . 11.3. Public dan Private Cloud Computing . . . . . . . . . . . . . . . . . . . . . 31.4. Model Layanan Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . 31.5. Pengembangan Aplikasi di Cloud Computing . . . . . . . . . . . . . . . . 31.6. Node.js dan Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . . 41.7. Layanan Hosting Aplikasi: CloudFoundry . . . . . . . . . . . . . . . . . . 4
1.7.1. Pendaftaran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.7.2. Instalasi Command Line Utilities . . . . . . . . . . . . . . . . . . . 41.7.3. Konfigurasi di Server Cloud . . . . . . . . . . . . . . . . . . . . . . 101.7.4. Instalasi dan Konfigurasi Node.js di Komputer Lokal . . . . . . . . 12
1.8. Pengelolaan Aplikasi di Cloud . . . . . . . . . . . . . . . . . . . . . . . . . 131.8.1. Push, Delete, Update Aplikasi . . . . . . . . . . . . . . . . . . . . . 141.8.2. Menggunakan Framework ExpressJS . . . . . . . . . . . . . . . . . 141.8.3. Tanpa Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2. REPL dan Dasar-dasar JavaScript di Node.js 212.1. REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.1.1. Mengaktifkan REPL . . . . . . . . . . . . . . . . . . . . . . . . . . 21
ii
Daftar Isi iii
2.1.2. Perintah-perintah REPL . . . . . . . . . . . . . . . . . . . . . . . . 222.2. Dasar-dasar JavaScript di Node.js . . . . . . . . . . . . . . . . . . . . . . . 23
2.2.1. Membaca Masukan dari Stream / Masukan Standar (stdin) . . . . 232.2.2. Nilai/Value dan Tipe Data . . . . . . . . . . . . . . . . . . . . . . 242.2.3. Variabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.2.4. Konstanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.2.5. Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Pengertian Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Definisi Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Fungsi Anonim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Fungsi Rekursif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Fungsi di dalam Fungsi / Nested Functions . . . . . . . . . . . . . 27
2.2.6. Literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Literal Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Literal Boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal Floating-point . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.7. Struktur Data dan Representasi JSON . . . . . . . . . . . . . . . . 302.2.8. Aliran Kendali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Pernyataan Kondisi if .. else if .. else . . . . . . . . . . . . . . . . 31Pernyataan switch . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Looping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2.9. Penanganan Error . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3. Paradigma Pemrograman di JavaScript 373.1. Pemrograman Fungsional . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.1.1. Ekspresi Lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.1.2. Higher-order Function . . . . . . . . . . . . . . . . . . . . . . . . . 383.1.3. Closure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.1.4. Currying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2. Pemrograman Berorientasi Obyek . . . . . . . . . . . . . . . . . . . . . . . 403.2.1. Pengertian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.2.2. Definisi Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.2.3. Inheritance / Pewarisan . . . . . . . . . . . . . . . . . . . . . . . . 41
4. Mengelola Paket Menggunakan npm 434.1. Apakah npm Itu? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.2. Menggunakan npm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.2.1. Instalasi Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444.2.2. Struktur Instalasi Paket Node.js . . . . . . . . . . . . . . . . . . . 444.2.3. Menghapus Paket / Uninstall . . . . . . . . . . . . . . . . . . . . . 454.2.4. Mencari Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Daftar Isi iv
4.2.5. Menampilkan Informasi Paket . . . . . . . . . . . . . . . . . . . . . 464.2.6. Memperbaharui Paket . . . . . . . . . . . . . . . . . . . . . . . . . 47
5. Node.js dan Web: Teknik Pengembangan Aplikasi 485.1. Pendahuluan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.2. Event-Driven Programming dan EventEmitter . . . . . . . . . . . . . . . . 495.3. Asynchronous / Non-blocking IO dan Callback . . . . . . . . . . . . . . . 50
6. Mengakses Basis Data NoSQL: mongoDB 526.1. Apa itu Basis Data NoSQL? . . . . . . . . . . . . . . . . . . . . . . . . . . 526.2. Mengenal mongoDB dan Fitur-fiturnya . . . . . . . . . . . . . . . . . . . . 52
6.2.1. Memulai Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.2.2. Klien dan Shell mongoDB . . . . . . . . . . . . . . . . . . . . . . . 546.2.3. Documents dan Collections . . . . . . . . . . . . . . . . . . . . . . 56
6.3. Node.js dan MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.3.1. Node-gyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.3.2. Driver Node.js untuk mongoDB . . . . . . . . . . . . . . . . . . . . 576.3.3. Mengakses mongoDB dari Node.js . . . . . . . . . . . . . . . . . . 58
6.4. Aplikasi Web Menggunakan Node.js dan mongoDB . . . . . . . . . . . . . 59
7. Pola Arsitektur Aplikasi Web: MVC dan ExpressJS 627.1. Apa itu Pola Arsitektur? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.2. Pola Arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS . . . . . . . 64
7.3.1. Struktur Aplikasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.3.2. File-file yang Diperlukan . . . . . . . . . . . . . . . . . . . . . . . . 657.3.3. Hasil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya . . . . . . . . . . 66
8. Real-time Web Menggunakan Socket.io 688.1. Apa itu Real-time Web? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688.2. Teknologi Pendukung Real-time Web . . . . . . . . . . . . . . . . . . . . . 68
8.2.1. Ajax Technology . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688.2.2. Comet dan Push Technology . . . . . . . . . . . . . . . . . . . . . . 69
SSE (Server-Sent Events) . . . . . . . . . . . . . . . . . . . . . . . 69Bayeux Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69BOSH Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
8.2.3. WebSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.3. Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
8.3.1. Apa itu Socket.io? . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.3.2. Menggunakan Socket.io untuk Real-time Web . . . . . . . . . . . . 71
Tentang Aplikasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71Membuat Kerangka Aplikasi dengan ExpressJS . . . . . . . . . . . 71Instalasi Paket yang Diperlukan . . . . . . . . . . . . . . . . . . . . 71
Daftar Isi v
Konfigurasi JavaScript untuk Browser . . . . . . . . . . . . . . . . 72Hapus File yang Tidak Diperlukan . . . . . . . . . . . . . . . . . . 72Ubah File-file Tertentu . . . . . . . . . . . . . . . . . . . . . . . . . 72Menjalankan Server Socket.io . . . . . . . . . . . . . . . . . . . . . 73
Daftar Pustaka 76
Lampiran 78
A. Gaya Penulisan Kode / Coding Style 78A.1. Tentang Gaya Penulisan Kode . . . . . . . . . . . . . . . . . . . . . . . . . 78A.2. npm’s Coding Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
A.2.1. DESCRIPTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78A.2.2. Line Length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79A.2.3. Indentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79A.2.4. Curly braces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79A.2.5. Semicolons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79A.2.6. Comma First . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80A.2.7. Whitespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80A.2.8. Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80A.2.9. Callbacks, Sync/async Style . . . . . . . . . . . . . . . . . . . . . . 81A.2.10.Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81A.2.11.Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81A.2.12.Case, naming, etc. . . . . . . . . . . . . . . . . . . . . . . . . . . . 81A.2.13.null, undefined, false, 0 . . . . . . . . . . . . . . . . . . . . . . . . . 81
B. Commit History dari Penulis Utama dan Kontributor 83
Indeks 85
Daftar Gambar
1.1. Model Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2. Pendaftaran di CF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3. Hasil proses pendaftaran di CF . . . . . . . . . . . . . . . . . . . . . . . . 61.4. E-mail persetujuan dan pemberitahuan credentials . . . . . . . . . . . . . 71.5. Hasil push ke server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.6. Hasil update dengan menyertakan versi Node.js . . . . . . . . . . . . . . . 181.7. Deployment menggunakan versi runtime tertentu . . . . . . . . . . . . . . 191.8. Hasil deployement app.js tanpa framework . . . . . . . . . . . . . . . . . . 20
4.1. Tampilan “npm ls” pada direktori proyek dengan paket terinstall lengkap . 46
6.1. Admin web console untuk mongoDB . . . . . . . . . . . . . . . . . . . . . 55
7.1. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637.2. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.1. Hasil di browser dari ExpressJS + Socket.io . . . . . . . . . . . . . . . . . 75
vi
Listing Program
1.1. Instalasi vmc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2. Peringatan setting PATH untuk vmc . . . . . . . . . . . . . . . . . . . . . 81.3. Peringatan setting PATH untuk vmc . . . . . . . . . . . . . . . . . . . . . 81.4. Hasil gem yang terinstall . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.5. Hasil opsi help dari vmc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.6. Mengubah target server - belum ada konfigurasi . . . . . . . . . . . . . . . 101.7. Mengubah target server - setelah konfigurasi . . . . . . . . . . . . . . . . . 101.8. Login ke server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.9. Mengubah password server . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.10. Hasil dari download Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . 121.11. Ekstraksi Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.12. Konfigurasi variabel lingkungan Node.js . . . . . . . . . . . . . . . . . . . 131.13. Instalasi ExpressJS menggunakan npm . . . . . . . . . . . . . . . . . . . . 141.14. Perintah express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.15. Menggunakan express untuk membuat rerangka aplikasi . . . . . . . . . . 141.16. package.json untuk ExpressJS . . . . . . . . . . . . . . . . . . . . . . . . . 151.17. app.js untuk ExpressJS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.18. Hasil edit routes/index.js . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.19. Deployment aplikasi ExpressJS ke CF . . . . . . . . . . . . . . . . . . . . 161.20. Update: menambahkan versi Node.js ke routes/index.js . . . . . . . . . . . 171.21. Mengupdate aplikasi di server . . . . . . . . . . . . . . . . . . . . . . . . . 171.22. Menghapus aplikasi yang di-deploy di CF . . . . . . . . . . . . . . . . . . 171.23. Deployment ke CF dengan memilih runtime Node.js . . . . . . . . . . . . 181.24. app.js tanpa framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.25. Deployment app.js tanpa framework . . . . . . . . . . . . . . . . . . . . . 19
2.1. Node.js REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2. Contoh penggunaan .load dalam REPL . . . . . . . . . . . . . . . . . . . . 22
vii
Listing Program viii
2.3. Contoh penggunaan perintah .save di sesi REPL . . . . . . . . . . . . . . 232.4. readline.js: penggunaan pustaka Readline untuk masukan . . . . . . . . . 242.5. Fitur dynamically typed language . . . . . . . . . . . . . . . . . . . . . . . 252.6. Contoh konstanta dalam JavaScript . . . . . . . . . . . . . . . . . . . . . . 252.7. Sintaksis Fungsi dalam JavaScript . . . . . . . . . . . . . . . . . . . . . . . 262.8. Pemanggilan Fungsi dalam JavaScript . . . . . . . . . . . . . . . . . . . . 262.9. Contoh deklarasi fungsi dan pemanggilannya . . . . . . . . . . . . . . . . 262.10. Fungsi anonim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.11. Fungsi rekursif untuk menghitung faktorial . . . . . . . . . . . . . . . . . 272.12. Fungsi di dalam Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.13. Array di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.14. Representasi JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.15. Pernyataan if .. else if .. else . . . . . . . . . . . . . . . . . . . . . . . . . 312.16. Pernyataan Contoh penggunaan “switch” . . . . . . . . . . . . . . . . . . . 322.17. Pernyataan for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.18. Pernyataan for .. in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.19. Pernyataan do .. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342.20. Pernyataan while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342.21. Pernyataan break dan continue . . . . . . . . . . . . . . . . . . . . . . . . 352.22. Pernyataan break dengan label . . . . . . . . . . . . . . . . . . . . . . . . 352.23. Pernyataan try catch finally . . . . . . . . . . . . . . . . . . . . . . . . . . 362.24. Pernyataan try catch throw . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.1. Ekspresi Lambda di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . 383.2. Higher-order Function di JavaScript . . . . . . . . . . . . . . . . . . . . . 383.3. Closure di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.4. Currying di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.5. Definisi obyek di JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . 403.6. Pewarisan di PBO JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1. Sintaksis lengkap perintah npm . . . . . . . . . . . . . . . . . . . . . . . . 434.2. Cara install paket menggunakan npm . . . . . . . . . . . . . . . . . . . . . 444.3. Argumen npm untuk melihat daftar paket terpasang . . . . . . . . . . . . 454.4. npm ls pada aplikasi yang paket-paketnya belum terinstall . . . . . . . . . 454.5. Perintah menghapus paket di npm . . . . . . . . . . . . . . . . . . . . . . 454.6. Perintah menghapus paket di npm . . . . . . . . . . . . . . . . . . . . . . 464.7. Menampilkan rincian suatu paket dalam format JSON . . . . . . . . . . . 464.8. Memperbaharui paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.1. pegawai.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.2. server.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.3. server-on-error.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505.4. Membaca file secara synchronous . . . . . . . . . . . . . . . . . . . . . . . 505.5. Membaca file secara asynchronous . . . . . . . . . . . . . . . . . . . . . . 51
Listing Program ix
6.1. Menjalankan server MongoDB (mongod) . . . . . . . . . . . . . . . . . . . 536.2. Mengakhiri server MongoDB (mongod) . . . . . . . . . . . . . . . . . . . . 546.3. Shell mongoDB (mongo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.4. Sesi dalam shell mongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.5. Instalasi node-gyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.6. Instalasi driver mongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 576.7. Instalasi wrapper mongojs . . . . . . . . . . . . . . . . . . . . . . . . . . . 586.8. Mengakses mongoDB dari Node.js . . . . . . . . . . . . . . . . . . . . . . 586.9. Express+MongoDB web: app.js . . . . . . . . . . . . . . . . . . . . . . . . 596.10. Express+MongoDB web: package.json . . . . . . . . . . . . . . . . . . . . 606.11. Express+MonggoDB web: routes/index.js . . . . . . . . . . . . . . . . . . 606.12. Express+MongoDB web: routes/employee.js . . . . . . . . . . . . . . . . . 606.13. Express+MongoDB web: views/employee.jade . . . . . . . . . . . . . . . . 616.14. views/index.jade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.1. Struktur direktori asli aplikasi ExpressJS . . . . . . . . . . . . . . . . . . . 647.2. Struktur direktori ExpressJS sesuai pola MVC . . . . . . . . . . . . . . . 647.3. app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657.4. controllers/user.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657.5. models/db.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.6. package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
8.1. package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718.2. Isi direktori dist di socket.io-client . . . . . . . . . . . . . . . . . . . . . . 728.3. app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728.4. views/index.jade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738.5. routes/index.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738.6. Menjalankan server Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . 738.7. Kode sumber di browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
A.1. Bad curly braces placement - 1 . . . . . . . . . . . . . . . . . . . . . . . . 79A.2. Good curly braces placement - 1 . . . . . . . . . . . . . . . . . . . . . . . 79A.3. Bad curly braces placement - 2 . . . . . . . . . . . . . . . . . . . . . . . . 79A.4. Good curly braces placement - 2 . . . . . . . . . . . . . . . . . . . . . . . 79A.5. Good semicolon usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80A.6. Comma first . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
B.1. Commit history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Daftar Tabel
x
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
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
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
1.6. Node.js dan Cloud Computing 4
X Coding
X Test di komputer lokal
X Upload ke server (dalam Cloud Computing, proses ini diistilahkan dengan “push”
X Edit - push
Jika pengembangan aplikasi dilakukan oleh tim, maka perlu adanya software untukversion control, misalnya Git, mercurial, dan lain-lain. Setelah itu, aktivitas yang di-lakukan biasanya terpusat pada push (untuk mengupload instan dari aplikasi ke server)dan pull (untuk mengambil instan aplikasi dari server).
1.6. Node.js dan Cloud Computing
Node.js merupakan salah satu peranti pengembang yang bisa digunakan untuk membuataplikasi berbasis Cloud. Node.js dikembangkan dari engine JavaScript yang dibuat olehGoogle untuk browser Chrome / Chromium (V8) ditambah dengan libUV serta beberapapustaka internal lainnya. Dengan menggunakan Node.js, semua pengembangan akandilakukan menggunakan JavaScript, baik pada sisi klien maupun server. Node.js dibuatpertama kali oleh Ryan Dahl (twitter.com/ryah) dan sampai saat ini dikembangkan olehkomunitas sebagai software bebas dengan pendanaan utama dari Joyent, perusahaantempat Ryan Dahl bekerja.
1.7. Layanan Hosting Aplikasi: CloudFoundry
Saat ini, mulai banyak penyedia layanan Cloud yang mendukung Node.js, diantaranyaadalah CloudFoundry (http://www.cloudfoundry.com, selanjutnya akan kita sebut den-gan CF). Buku ini akan menggunakan fasilitas dari CF. Daftar lengkap dari penye-dia infrastruktur Node.js bisa dilihat pada https://github.com/joyent/node/wiki/Node-Hosting.
1.7.1. Pendaftaran
Untuk menggunakan fasilitas dari CF, kita akan mendaftar lebih dahulu di URL https://my.cloudfoundry.com/signup sepert yang terlihat pada Gambar 1.2.Setelah itu, CF akan mengirimkan pemberitahuan bahwa proses pendaftaran selesai
seperti di Gambar 1.3. Credentials atau informasi tentang akun kita di CF akan dikir-imkan ke e-mail kita seperti pada Gambar 1.4.
1.7.2. Instalasi Command Line Utilities
Command Line Utilities / CLU) adalah software yang dijalankan melalui shell / com-mand line / command prompt. CLU untuk CF ini dibuat dengan menggunakan Rubydan didistribusikan dalam bentuk gem sehingga untuk instalasi ini diperlukan ruby danrubygem. Berikut adalah perintah untuk instalasi vmc (CLU dari CF).
1.7. Layanan Hosting Aplikasi: CloudFoundry 5
Gambar 1.2.: Pendaftaran di CF
1 $ gem search vmc −−remote | grep "\bvmc\ s "2 vmc ( 0 . 5 . 0 )3 $ gem i n s t a l l vmc4 Fetching : json_pure −1 . 7 . 7 . gem (100%)5 WARNING: You don ’ t have /home/bpdp / . gem/ruby /2 . 0 . 0 / bin in your PATH,6 gem executab l e s w i l l not run .7 Su c c e s s f u l l y i n s t a l l e d json_pure −1.7 .78 Fetching : multi_json −1 . 7 . 2 . gem (100%)9 Su c c e s s f u l l y i n s t a l l e d multi_json −1.7 .2
10 Fetching : i n t e r a c t −0 . 5 . 2 . gem (100%)11 Su c c e s s f u l l y i n s t a l l e d i n t e r a c t −0.5 .212 Fetching : mult ipart−post −1 . 2 . 0 . gem (100%)13 Su c c e s s f u l l y i n s t a l l e d mult ipart−post −1.2 .014 Fetching : rubyzip −0 . 9 . 9 . gem (100%)15 Su c c e s s f u l l y i n s t a l l e d rubyzip −0.9 .916 Fetching : c f−uaa−l i b −1 .3 . 10 . gem (100%)17 Su c c e s s f u l l y i n s t a l l e d cf−uaa−l i b −1.3.1018 Fetching : cfoundry −0 . 5 . 2 . gem (100%)19 Su c c e s s f u l l y i n s t a l l e d cfoundry −0.5 .220 Fetching : c louseau −0 . 0 . 2 . gem (100%)21 Su c c e s s f u l l y i n s t a l l e d c louseau −0.0 .222 Fetching : mothership −0 . 5 . 1 . gem (100%)23 Su c c e s s f u l l y i n s t a l l e d mothership −0.5 .124 Fetching : mani fes t s−vmc−plugin −0 . 6 . 2 . gem (100%)25 Su c c e s s f u l l y i n s t a l l e d mani fes t s−vmc−plugin −0.6 .226 Fetching : addressab le −2 . 3 . 4 . gem (100%)27 Su c c e s s f u l l y i n s t a l l e d addressab le −2.3 .4
1.7. Layanan Hosting Aplikasi: CloudFoundry 6
Gambar 1.3.: Hasil proses pendaftaran di CF
28 Fetching : ca ldeco t t−c l i e n t −0 . 0 . 2 . gem (100%)29 Su c c e s s f u l l y i n s t a l l e d ca ldeco t t−c l i e n t −0.0 .230 Fetching : mime−types −1.23.gem (100%)31 Su c c e s s f u l l y i n s t a l l e d mime−types −1.2332 Fetching : r e s t−c l i e n t −1 . 6 . 7 . gem (100%)33 Su c c e s s f u l l y i n s t a l l e d re s t−c l i e n t −1.6 .734 Fetching : uu idtoo l s −2 . 1 . 4 . gem (100%)35 Su c c e s s f u l l y i n s t a l l e d uu idtoo l s −2.1 .436 Fetching : tunnel−vmc−plugin −0 . 2 . 2 . gem (100%)37 Su c c e s s f u l l y i n s t a l l e d tunnel−vmc−plugin −0.2 .238 Fetching : vmc−0 . 5 . 0 . gem (100%)39 Su c c e s s f u l l y i n s t a l l e d vmc−0.5 .040 Pars ing documentation for json_pure −1.7 .741 I n s t a l l i n g r i documentation for json_pure −1.7 .742 Pars ing documentation for multi_json −1.7 .243 I n s t a l l i n g r i documentation for multi_json −1.7 .244 Pars ing documentation for i n t e r a c t −0.5 .245 I n s t a l l i n g r i documentation for i n t e r a c t −0.5 .246 Pars ing documentation for mult ipart−post −1.2 .047 I n s t a l l i n g r i documentation for mult ipart−post −1.2 .048 Pars ing documentation for rubyzip −0.9 .949 I n s t a l l i n g r i documentation for rubyzip −0.9 .950 Pars ing documentation for c f−uaa−l i b −1.3.1051 I n s t a l l i n g r i documentation for cf−uaa−l i b −1.3.1052 Pars ing documentation for cfoundry −0.5 .253 I n s t a l l i n g r i documentation for cfoundry −0.5 .254 Pars ing documentation for c louseau −0.0 .255 I n s t a l l i n g r i documentation for c louseau −0.0 .256 Pars ing documentation for mothership −0.5 .157 I n s t a l l i n g r i documentation for mothership −0.5 .158 Pars ing documentation for mani fes t s−vmc−plugin −0.6 .2
1.7. Layanan Hosting Aplikasi: CloudFoundry 7
Gambar 1.4.: E-mail persetujuan dan pemberitahuan credentials
59 I n s t a l l i n g r i documentation for mani fest s−vmc−plugin −0.6 .260 Pars ing documentation for addressab le −2.3 .461 I n s t a l l i n g r i documentation for addressab le −2.3 .462 Pars ing documentation for ca ldeco t t−c l i e n t −0.0 .263 I n s t a l l i n g r i documentation for ca ldeco t t−c l i e n t −0.0 .264 Pars ing documentation for mime−types −1.2365 I n s t a l l i n g r i documentation for mime−types −1.2366 Pars ing documentation for r e s t−c l i e n t −1.6 .767 I n s t a l l i n g r i documentation for r e s t−c l i e n t −1.6 .768 Pars ing documentation for uu idtoo l s −2.1 .469 I n s t a l l i n g r i documentation for uu idtoo l s −2.1 .470 Pars ing documentation for tunnel−vmc−plugin −0.2 .271 I n s t a l l i n g r i documentation for tunnel−vmc−plugin −0.2 .272 Pars ing documentation for vmc−0.5 .073 I n s t a l l i n g r i documentation for vmc−0.5 .074 Done i n s t a l l i n g documentation for json_pure , multi_json ,75 i n t e r a c t , mult ipart−post , rubyzip , c f−uaa−l i b , cfoundry ,76 c louseau , mothership , mani fes t s−vmc−plugin , addressab le ,77 ca ldeco t t−c l i e n t , mime−types , r e s t−c l i e n t , uu idtoo l s ,78 tunnel−vmc−plugin , vmc (13 sec ) .79 17 gems i n s t a l l e d80 $
1.7. Layanan Hosting Aplikasi: CloudFoundry 8
Listing 1.1: Instalasi vmc
Pesan peringatan berikut ini:1 WARNING: You don ’ t have /home/bpdp / . gem/ruby /2 . 0 . 0 / bin in your PATH,2 gem execu tab l e s w i l l not run .
Listing 1.2: Peringatan setting PATH untuk vmc
terjadi karena path untuk executable script Ruby yang diinstall oleh vmc belum dita-mbahkan ke variabel lingkungan PATH. Edit file $HOME/.bashrc dan tambahkan barisberikut6:
1 export PATH=$PATH:/home/bpdp / . gem/ruby /2 . 0 . 0 / bin
Listing 1.3: Peringatan setting PATH untuk vmc
Setelah itu, ketikkan di shell prompt Bash: source /̃.bashrc7.Hasil dari instalasi vmc adalah sebagai berikut:
1 $ gem l i s t23 ∗∗∗ LOCAL GEMS ∗∗∗45 addre s sab l e ( 2 . 3 . 4 )6 b igdec imal ( 1 . 2 . 0 )7 ca ldeco t t−c l i e n t ( 0 . 0 . 2 )8 cf−uaa−l i b ( 1 . 3 . 1 0 )9 cfoundry ( 0 . 5 . 2 )
10 c louseau ( 0 . 0 . 2 )11 i n t e r a c t ( 0 . 5 . 2 )12 io−conso l e ( 0 . 4 . 2 )13 j son ( 1 . 7 . 7 )14 json_pure ( 1 . 7 . 7 )15 mani fes t s−vmc−p lug in ( 0 . 6 . 2 )16 mime−types ( 1 . 2 3 )17 min i t e s t ( 4 . 3 . 2 )18 mothership ( 0 . 5 . 1 )19 multi_json ( 1 . 7 . 2 )20 mult ipart−post ( 1 . 2 . 0 )21 psych ( 2 . 0 . 0 )22 rake ( 0 . 9 . 6 )23 rdoc ( 4 . 0 . 0 )24 re s t−c l i e n t ( 1 . 6 . 7 )25 rubyzip ( 0 . 9 . 9 )26 test−uni t ( 2 . 0 . 0 . 0 )27 tunnel−vmc−p lug in ( 0 . 2 . 2 )28 uu id too l s ( 2 . 1 . 4 )29 vmc ( 0 . 5 . 0 )30 $
Listing 1.4: Hasil gem yang terinstall
Periksa dengan menjalankan opsi help dari vmc:
6Catatan: "/home/bpdp/" adalah direktori $HOME saya, silahkan sesuaikan dengan tempat anda7Ini hanya untuk keperluan saat ini saja, setelah ini tidak perlu lagi karena setiap login sudah akandibaca oleh Bash
1.7. Layanan Hosting Aplikasi: CloudFoundry 9
1 $ vmc help2 Showing ba s i c command set . Run with ’ he lp −−a l l ’ to l i s t a l l commands .34 Gett ing Started5 ta r g e t [URL] Set or d i sp l ay the t a r g e t cloud , o rgan i za t i on , and space6 logout Log out from the t a r g e t7 l o g i n [EMAIL] Authent icate with the t a r g e t8 i n f o Display in fo rmat ion on the cur rent target , user , e t c .9
10 App l i ca t i on s11 app [APP] Show app in fo rmat ion12 apps L i s t your app l i c a t i o n s1314 Management15 s t a r t APPS . . . S ta r t an app l i c a t i on16 d e l e t e APPS . . . De lete an app l i c a t i on17 push [NAME] Push an app l i c a t i on , sync ing changes i f i t e x i s t s18 r e s t a r t APPS . . . Stop and s t a r t an app l i c a t i o n19 stop APPS . . . Stop an app l i c a t i o n2021 S e r v i c e s22 s e r v i c e SERVICE Show s e r v i c e in fo rmat ion23 s e r v i c e s L i s t your s e r v i c e2425 Management26 de l e t e−s e r v i c e [SERVICE] Delete a s e r v i c e27 bind−s e r v i c e [SERVICE] [APP] Bind a s e r v i c e to an app l i c a t i o n28 create−s e r v i c e [OFFERING] [NAME] Create a s e r v i c e29 unbind−s e r v i c e [SERVICE] [APP] Unbind a s e r v i c e from an app l i c a t i on30 tunne l [ INSTANCE] [CLIENT] Create a local tunne l to a s e r v i c e .3132 Organ izat ions33 org [ORGANIZATION] Show organ i z a t i on in fo rmat ion34 de l e t e−org [ORGANIZATION] Delete an o rgan i z a t i on35 orgs L i s t a v a i l a b l e o r gan i z a t i on s36 create−org [NAME] Create an o rgan i z a t i on3738 Spaces39 de l e t e−space SPACES . . . De lete a space and i t s contents40 spaces [ORGANIZATION] L i s t spaces in an o rgan i z a t i on41 create−space [NAME] [ORGANIZATION] Create a space in an o rgan i z a t i on42 space [SPACE] Show space in fo rmat ion4344 Routes45 route s L i s t route s in a space4647 Domains48 domains [SPACE] L i s t domains in a space49 map−domain NAME Map a domain to an o rgan i z a t i on or space50 unmap−domain DOMAIN Unmap a domain from an o rgan i z a t i on or space5152 Options :53 −−[no−] c o l o r Use c o l o r f u l output54 −−[no−] s c r i p t Shortcut for −−qu i e t and −−f o r c e55 −−debug Pr int f u l l s tack t r a c e ( i n s t ead o f crash log )56 −V, −−verbose Pr int ext ra in fo rmat ion57 −f , −−[no−] f o r c e Skip i n t e r a c t i o n when po s s i b l e58 −h , −−help Show command usage59 −m, −−mani fe s t FILE Path to mani f e s t f i l e to use60 −q , −−[no−] qu i e t S imp l i f y output format61 −t , −−t r a c e Show API t r a f f i c
1.7. Layanan Hosting Aplikasi: CloudFoundry 10
62 −u , −−proxy EMAIL Run t h i s command as another user ( admin )63 −v , −−ve r s i on Pr int v e r s i on number64 $
Listing 1.5: Hasil opsi help dari vmc
1.7.3. Konfigurasi di Server Cloud
Pada dasarnya, yang diperlukan hanyalah mengubah target ke server cloud dari CF dankemudian mengubah password.
1 $ vmc ta r g e t2 NoMethodError : undef ined method ‘ target ’ for n i l : N i lC la s s3 For more in format ion , s ee ~/.vmc/ crash4 $
Listing 1.6: Mengubah target server - belum ada konfigurasi
Error di atas terjadi karena file konfigurasi belum dibuat. File konfigurasi tersim-pan di direktori $HOME/.vmc. Mengubah target dilakukan dengan membuat file targetdi direktori tersebut. Isi dari file target tersebut adalah server CloudFoundry, yaituhttps://api.cloudfoundry.com. Setelah itu, jika dieksekusi lagi, hasilnya adalah sebagaiberikut:
1 $ vmc ta r g e t2 t a r g e t : https : // api . c loudfoundry . com3 $
Listing 1.7: Mengubah target server - setelah konfigurasi
Setelah itu, setiap kali kita akan melakukan berbagai proses yang melibatkan serverini, kita harus melakukan proses login terlebih dahulu:
1 $ vmc l o g i n2 t a r g e t : https : // api . c loudfoundry . com34 Email> bambangpdp@yahoo . com56 Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗78 Authent icat ing . . . OK9 $ vmc i n f o −−a l l
10 Gett ing runtimes . . . OK11 Gett ing frameworks . . . OK12 Gett ing s e r v i c e s . . . OK1314 VMware ’ s Cloud Appl i ca t ion Platform1516 ta r g e t : https : // api . c loudfoundry . com17 ve r s i on : 0 .99918 support : http :// support . c loudfoundry . com1920 user : bambangpdp@yahoo . com2122 runtime d e s c r i p t i o n23 java 1 . 6 . 0_2424 java7 1 . 7 . 0_04
1.7. Layanan Hosting Aplikasi: CloudFoundry 11
25 node 0 . 4 . 1 226 node06 0 . 6 . 827 node08 0 . 8 . 228 ruby18 1 . 8 . 7 p35729 ruby19 1 . 9 . 2 p1803031 framework d e s c r i p t i o n32 g r a i l s33 java_web34 l i f t35 node36 play37 rack38 r a i l s 339 s i n a t r a40 spr ing41 standa lone4243 s e r v i c e v e r s i on prov ide r d e s c r i p t i o n44 mongodb 2 .0 core MongoDB NoSQL database45 mysql 5 . 1 core MySQL database46 po s t g r e s q l 9 . 0 core PostgreSQL database ( vFabric )47 rabbitmq 2 .4 core RabbitMQ message queue48 r e d i s 2 . 4 core Redis key−value s t o r e49 r e d i s 2 . 2 core Redis key−value s t o r e50 r e d i s 2 . 6 core Redis key−value s t o r e51 $525354 $ vmc l o g i n55 t a r g e t : https : // api . c loudfoundry . com5657 Email> bambangpdp@yahoo . com5859 Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗6061 Authent icat ing . . . OK6263 $ vmc i n f o −−a l l64 Gett ing runtimes . . . OK65 Gett ing frameworks . . . OK66 Gett ing s e r v i c e s . . . OK6768 VMware ’ s Cloud Appl i ca t ion Platform6970 ta r g e t : https : // api . c loudfoundry . com71 ve r s i on : 0 .99972 support : http :// support . c loudfoundry . com7374 user : bambangpdp@yahoo . com7576 runtime d e s c r i p t i o n77 java 1 . 6 . 0_2478 java7 1 . 7 . 0_0479 node 0 . 4 . 1 280 node06 0 . 6 . 881 node08 0 . 8 . 282 ruby18 1 . 8 . 7 p35783 ruby19 1 . 9 . 2 p1808485 framework d e s c r i p t i o n86 g r a i l s
1.7. Layanan Hosting Aplikasi: CloudFoundry 12
87 java_web88 l i f t89 node90 play91 rack92 r a i l s 393 s i n a t r a94 spr ing95 standa lone9697 s e r v i c e v e r s i on prov ide r d e s c r i p t i o n98 mongodb 2 .0 core MongoDB NoSQL database99 mysql 5 . 1 core MySQL database
100 po s t g r e s q l 9 . 0 core PostgreSQL database ( vFabric )101 rabbitmq 2 .4 core RabbitMQ message queue102 r e d i s 2 . 4 core Redis key−value s t o r e103 r e d i s 2 . 6 core Redis key−value s t o r e104 r e d i s 2 . 2 core Redis key−value s t o r e105 $
Listing 1.8: Login ke server
Untuk mengubah password:1 $ vmc passwd2 New Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗34 Ver i f y Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗56 Your password s t r ength i s : good7 Changing password . . . OK8 $
Listing 1.9: Mengubah password server
1.7.4. Instalasi dan Konfigurasi Node.js di Komputer Lokal
Node.js tersedia untuk Linux, Windows, Mac OS X, serta SunOS. Untuk versi Linux,kebanyakan distro sudah menyertakan paket Node.js, hanya saja ada banyak versi dariNode.js dan jika kita menggunakan manajemen paket dari distro Linux, kita hanya bisamenginstall 1 versi saja. Sebagai contoh, di Arch Linux, paket Node.js bisa diinstalldengan perintah “pacman -S nodejs” tetapi hanya pada versi resmi di repo Arch Linux(versi 0.10.5 pada tanggal 6 Mei 2013).Langkah instalasi berikut ini adalah langkah untuk instalasi tanpa manajemen paket
dari distro Linux.
X Ambil paket binary executable dari http://nodejs/download atau langsung kehttp://nodejs.org/dist/. Versi yang digunakan disini adalah 0.10.5. Downloadfile tersebut, kemudian simpan di direktori tertentu (terserah anda, dibuku inidiletakkan di $HOME/master/nodejs).
1 20:30:31−bpdp@bpdp−arch :~/ master / nodej s$ l s2 t o t a l 46723 drwxr−xr−x 2 bpdp bpdp 4096 Apr 26 20 :37 .4 drwxr−xr−x 46 bpdp bpdp 4096 May 4 23 :33 . .5 −rw−r−−r−− 1 bpdp bpdp 4770726 Apr 24 03 :34 node−v0 .10.5− l inux−x86 . ta r . gz
1.8. Pengelolaan Aplikasi di Cloud 13
6 20:30:31−bpdp@bpdp−arch :~/ master / nodej s$
Listing 1.10: Hasil dari download Node.js
X Ekstrak ke direktori yang diinginkan. Node.js akan diinstall di direktori $HOME-/software:
1 $ cd2 $ cd so f tware3 $ ta r −xzvf ~/master / node j s /node−v0 .10.5− l inux−x86 . ta r . gz4 $ ln −s node−v0 .10.5− l inux−x86 node j s5 $ l s −l a6 . . . .7 . . . .8 lrwxrwxrwx 1 bpdp bpdp 22 May 1 07 :58 node j s −> node−v0 .10.5− l inux−x869 drwxr−xr−x 5 bpdp bpdp 4096 Apr 24 03 :31 node−v0 .10.5− l inux−x86
10 . . . .11 . . . .12 $
Listing 1.11: Ekstraksi Node.js
X Konfigurasi variabel lingkungan. Sebaiknya disimpan pada suatu file (pada bukuini, konfigurasi akan disimpan di $HOME/environment/nodejs):
1 NODEJS_HOME=/home/bpdp/ so f tware / node j s23 PATH=$PATH:$NODEJS_HOME/bin4 MANPATH=$MANPATH:$NODEJS_HOME/ share /man5 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NODEJS_HOME/ l i b6 C_INCLUDE_PATH=$C_INCLUDE_PATH:$NODEJS_HOME/ inc lude7 CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$NODEJS_HOME/ inc lude89 export PATH
10 export MANPATH11 export LD_LIBRARY_PATH12 export C_INCLUDE_PATH13 export CPLUS_INCLUDE_PATH
Listing 1.12: Konfigurasi variabel lingkungan Node.js
X Setiap akan menggunakan Node.js, yang diperlukan adalah men-source file konfig-urasi tersebut: source /̃environment/nodejs.
1.8. Pengelolaan Aplikasi di Cloud
Aplikasi yang dibuat nantinya akan di-deploy ke server CF. Pada umumnya, developerakan melakukan proses untuk upload (push), menghapus (delete), serta memperbaharui(update) aplikasi di server. Jika belum memahami sintaksis JavaScript serta penggunaannpm, jangan kuatir. Tujuan dari bab ini hanya mengenalkan pengelolaan aplikasi diCloud. Aspek lainnya akan dibahas di bab-bab berikutnya.
1.8. Pengelolaan Aplikasi di Cloud 14
1.8.1. Push, Delete, Update Aplikasi
Pada pembahasan ini, akan diberikan contoh menggunakan dua kategori, yaitu den-gan menggunakan framework (ExpressJS - http://expressjs.com) serta tanpa meng-gunakan framework.
1.8.2. Menggunakan Framework ExpressJS
1 $ npm i n s t a l l −g expre s s
Listing 1.13: Instalasi ExpressJS menggunakan npm
Jika berhasil, maka kita bisa menggunakan perintah express untuk membuat rerangkaaplikasi. Sintaksis penggunaan ExpressJS adalah sebagai berikut:
1 $ expre s s −−help23 Usage : expre s s [ opt i ons ]45 Options :67 −h , −−help output usage in fo rmat ion8 −V, −−ve r s i on output the ve r s i on number9 −s , −−s e s s i o n s add s e s s i o n support
10 −e , −−e j s add e j s eng ine support ( d e f a u l t s to jade )11 −J , −−j shtml add jshtml engine support ( d e f a u l t s to jade )12 −H, −−hogan add hogan . j s eng ine support13 −c , −−c s s <engine> add s t y l e s h e e t <engine> support ( l e s s | s t y l u s ) ( d e f a u l t s to p l a i n c s s )14 −f , −−f o r c e f o r c e on non−empty d i r e c t o r y1516 $
Listing 1.14: Perintah express
Setelah itu, kita bisa membuat rerangka aplikasi ExpressJS dengan cara berikut:1 $ mkdir h e l l o2 $ cd h e l l o3 $ expre s s45 c r e a t e : .6 c r e a t e : . / package . j son7 c r e a t e : . / app . j s8 c r e a t e : . / pub l i c9 c r e a t e : . / pub l i c / j a v a s c r i p t s
10 c r e a t e : . / route s11 c r e a t e : . / route s / index . j s12 c r e a t e : . / route s / user . j s13 c r e a t e : . / pub l i c / s t y l e s h e e t s14 c r e a t e : . / pub l i c / s t y l e s h e e t s / s t y l e . c s s15 c r e a t e : . / views16 c r e a t e : . / views / layout . jade17 c r e a t e : . / views / index . jade18 c r e a t e : . / pub l i c / images1920 i n s t a l l dependenc ies :21 $ cd . && npm i n s t a l l2223 run the app :
1.8. Pengelolaan Aplikasi di Cloud 15
24 $ node app2526 $
Listing 1.15: Menggunakan express untuk membuat rerangka aplikasi
Pada rerangka aplikasi tersebut, terdapat file package.json untuk mendefinisikan ap-likasi serta dependensi-nya dan app.js yang merupakan file utama untuk dijalankan padaserver.
1 {2 "name" : "hello -node" ,3 "version" : "0.0.1" ,4 "private" : true ,5 "scripts" : {6 "start" : "node app.js"7 } ,8 "dependencies" : {9 "express" : "3.2.2" ,
10 "jade" : "*"11 }12 }
Listing 1.16: package.json untuk ExpressJS
a12 /**3 * Module dependencies.4 */56 var expre s s = r equ i r e ( ’express ’ )7 , r oute s = r equ i r e ( ’./ routes ’ )8 , user = r equ i r e ( ’./ routes/user’ )9 , http = r equ i r e ( ’http’ )
10 , path = r equ i r e ( ’path’ ) ;1112 var app = expre s s ( ) ;1314 // all environments15 app . s e t ( ’port’ , p ro c e s s . env .PORT | | 3000 ) ;16 app . s e t ( ’views’ , __dirname + ’/views ’ ) ;17 app . s e t ( ’view engine ’ , ’jade’ ) ;18 app . use ( expre s s . f av i con ( ) ) ;19 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;20 app . use ( expre s s . bodyParser ( ) ) ;21 app . use ( expre s s . methodOverride ( ) ) ;22 app . use ( app . rou te r ) ;23 app . use ( expre s s . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;2425 // development only26 i f ( ’development ’ == app . get ( ’env’ ) ) {27 app . use ( expre s s . e r rorHandle r ( ) ) ;28 }2930 app . get ( ’/’ , r ou t e s . index ) ;31 app . get ( ’/users ’ , u se r . l i s t ) ;3233 http . c r e a t eS e rv e r ( app ) . l i s t e n ( app . get ( ’port’ ) , function ( ){34 conso l e . l og ( ’Express server listening on port ’ + app . get ( ’port’ ) ) ;
1.8. Pengelolaan Aplikasi di Cloud 16
35 } ) ;
Listing 1.17: app.js untuk ExpressJS
Edit file routes/index.js sebagai berikut:12 /*3 * GET home page.4 */56 export s . index = function ( req , r e s ){7 r e s . render ( ’index’ , { t i t l e : ’Express app at CloudFoundry ’ } ) ;8 } ;
Listing 1.18: Hasil edit routes/index.js
Setelah itu, install modul-modul yang diperlukan dengan perintah npm install padadirektori tersebut. npm akan membaca file package.json kemudian menginstall modul-modul sesuai dengan deskripsi pada dependencies. Setelah diuji pada komputer lokal den-gan perintah node app.js, dan sukses bisa diakses di browser dengan alamat http://localhost:3000,maka aplikasi tersebut bisa di-deploy di CloudFoundry. Proses deployment digambarkansebagai berikut (anda sudah harus login menggunakan perintah vmc login sebelumnya)dan berada di direktori tempat aplikasi tersebut berada:
1 $ vmc push2 Name> bpdp−he l l o−expre s s34 Instances> 156 1 : node7 2 : other8 Framework> node9
10 1 : node11 2 : node0612 3 : node0813 4 : other14 Runtime> 31516 1 : 64M17 2 : 128M18 3 : 256M19 4 : 512M20 5 : 1G21 6 : 2G22 Memory Limit> 64M2324 Creat ing bpdp−he l l o−expre s s . . . OK2526 1 : bpdp−he l l o−expre s s . c loudfoundry . com27 2 : none28 Domain> bpdp−he l l o−expre s s . c loudfoundry . com2930 Updating bpdp−he l l o−expre s s . . . OK3132 Create s e r v i c e s for app l i c a t i on?> n3334 Save c on f i gu r a t i on?> n35
1.8. Pengelolaan Aplikasi di Cloud 17
Gambar 1.5.: Hasil push ke server
36 Uploading bpdp−he l l o−expre s s . . . OK37 Sta r t i ng bpdp−he l l o−expre s s . . . OK38 Checking bpdp−he l l o−expre s s . . .39 1/1 i n s t an c e s : 1 running40 OK41 $
Listing 1.19: Deployment aplikasi ExpressJS ke CF
Hasilnya terlihat pada tampilan browser di Gambar 1.5Aplikasi yang sudah dibuat seringkali diubah, oleh karena itu vmc juga menyediakan
fasilitas untuk Mengupdate aplikasi.12 /*3 * GET home page.4 */56 export s . index = function ( req , r e s ){7 var nv = proce s s . v e r s i on ;8 r e s . render ( ’index’ , { t i t l e : ’Express app at CloudFoundry with Node.js ’ + nv } ) ;9 } ;
Listing 1.20: Update: menambahkan versi Node.js ke routes/index.js
1 $ vmc apps2 Gett ing app l i c a t i o n s . . . OK34 name s ta tu s usage runtime u r l5 he l l o−expre s s running 1 x 64M node08 bpdp−he l l o−expre s s . c loudfoundry . com6 $ vmc push he l l o−expre s s7 Uploading he l l o−expre s s . . . OK8 Stopping he l l o−expre s s . . . OK9
10 Sta r t i ng he l l o−expre s s . . . OK11 Checking he l l o−expre s s . . . OK12 $
Listing 1.21: Mengupdate aplikasi di server
Hasilnya bisa dilihat di Gambar 1.6Untuk menghapus aplikasi:
1 $ vmc de l e t e bpdp−m1−hel lonoframework2 Rea l ly d e l e t e bpdp−m1−hel lonoframework?> y3
1.8. Pengelolaan Aplikasi di Cloud 18
Gambar 1.6.: Hasil update dengan menyertakan versi Node.js
4 De l e t ing bpdp−m1−hel lonoframework . . . OK56 $
Listing 1.22: Menghapus aplikasi yang di-deploy di CF
Pada saat deployment, kita juga bisa memilih versi Node.js (runtime) sebagai berikut:1 $ vmc push −−runtime=node082 Name> bpdp−he l l o−expres s0634 Instances> 156 1 : node7 2 : other8 Framework> node9
10 1 : 64M11 2 : 128M12 3 : 256M13 4 : 512M14 5 : 1G15 Memory Limit> 64M1617 Creat ing bpdp−he l l o−expres s06 . . . OK1819 1 : bpdp−he l l o−expres s06 . c loudfoundry . com20 2 : none21 URL> bpdp−he l l o−expres s06 . c loudfoundry . com2223 Updating bpdp−he l l o−expres s06 . . . OK2425 Create s e r v i c e s for app l i c a t i on?> n2627 Save c on f i gu r a t i on?> n2829 Uploading bpdp−he l l o−expres s06 . . . OK30 Sta r t i ng bpdp−he l l o−expres s06 . . . OK31 Checking bpdp−he l l o−expres s06 . . . OK32 $
Listing 1.23: Deployment ke CF dengan memilih runtime Node.js
Hasilnya bisa dilihat di Gambar 1.7
1.8. Pengelolaan Aplikasi di Cloud 19
Gambar 1.7.: Deployment menggunakan versi runtime tertentu
1.8.3. Tanpa Framework
Tanpa framework, yang kita perlukan hanyalah langsung mem-push file yang kita buat(dalam contoh ini adalah app.js):
1 var http = r equ i r e ( ’http’ ) ;2 var u r l = r equ i r e ( "url" ) ;34 http . c r e a t eS e rv e r ( function ( req , r e s ) {56 var pathname = ur l . parse ( req . u r l ) . pathname ;78 r e s . writeHead (200 , {’Content -Type’ : ’text/html’ } ) ;9 r e s . wr i t e ( "Hello NodeJS <u>" + proce s s . v e r s i on + "</u>" ) ;
10 r e s . wr i t e ( "<br />Request for <b>" + pathname + "</b> received." ) ;11 r e s . end ( ) ;1213 } ) . l i s t e n ( 1337 ) ;
Listing 1.24: app.js tanpa framework
Proses deployement adalah sebagai berikut:1 $ vmc push2 Name> he l l o−noframework34 Instances> 156 1 : node7 2 : other8 Framework> node9
10 1 : node11 2 : node0612 3 : node0813 4 : other14 Runtime> 31516 1 : 64M17 2 : 128M18 3 : 256M19 4 : 512M20 5 : 1G21 Memory Limit> 64M2223 Creat ing he l l o−noframework . . . OK2425 1 : he l l o−noframework . c loudfoundry . com
1.8. Pengelolaan Aplikasi di Cloud 20
Gambar 1.8.: Hasil deployement app.js tanpa framework
26 2 : none27 URL> he l l o−noframework . c loudfoundry . com2829 Updating he l l o−noframework . . . OK3031 Create s e r v i c e s for app l i c a t i on?> n3233 Save c on f i gu r a t i on?> n3435 Uploading he l l o−noframework . . . OK36 Sta r t i ng he l l o−noframework . . . OK37 Checking he l l o−noframework . . . OK38 $
Listing 1.25: Deployment app.js tanpa framework
Hasilnya bisa dilihat pada Gambar 1.8
BAB 2
REPL dan Dasar-dasar JavaScript di Node.js
2.1. REPL
REPL adalah lingkungan pemrograman interaktif, tempat developer bisa mengetikkanprogram per baris dan langsung mengeksekusi hasilnya. Biasanya ini digunakan un-tuk menguji perintah-perintah yang cukup dijalankan pada satu baris atau satu bloksegmen kode sumber saja. Karena fungsinya itu, maka istilah yang digunakan adalahREPL (read-eval-print-loop), yaitu loop atau perulangan baca perintah - evaluasi per-intah - tampilkan hasil. REPL sering juga disebut sebagai interactive top level ataulanguage shell. “Tradisi” ini sudah dimulai sejak jaman LISP di mesin UNIX di era awalpengembangan development tools. Saat ini hampir semua interpreter/compiler mempun-yai REPL, misalnya Python, Ruby, Scala, PHP, berbagai interpreter/compiler LISP, dantidak ketinggalan Node.js.
2.1.1. Mengaktifkan REPL
Untuk mengaktifkan REPL dari Node.js, executable command line program-nya adalahnode. Jika node dipanggil dengan argumen nama file JavaScript, maka file JavaScripttersebut akan dieksekusi, sementara jika tanpa argumen, akan masuk ke REPL:
1 $ node2 > . help3 . break Sometimes you get stuck , t h i s g e t s you out4 . c l e a r A l i a s for . break5 . exit Exit the r ep l6 . he lp Show r ep l opt ions7 . load Load JS from a f i l e i n to the REPL s e s s i o n8 . save Save a l l eva luated commands in t h i s REPL s e s s i o n to a f i l e9 >
Listing 2.1: Node.js REPL
21
2.1. REPL 22
Tanda “>” adalah tanda bahwa REPL Node.js siap untuk menerima perintah. Untukmelihat perintah-perintah REPL, bisa digunakan .help.
2.1.2. Perintah-perintah REPL
Pada sesi REPL, kita bisa memberikan perintah internal REPL maupun perintah-perintahlain yang sesuai dan dikenali sebagai perintah JavaScript. Perintah internal REPLNode.js terdiri atas:
X .break: keluar dan melepaskan diri dari "keruwetan" baris perintah di REPL.
X .clear: alias untuk .break
X .exit: keluar dari sesi REPL (bisa juga dengan menggunakan Ctrl-D)
X .help: menampilkan pertolong perintah internal REPL
X .load: membaca dan mengeksekusi perintah-perintah JavaScript yang terdapatpada suatu file.
X .save: menyimpan sesi REPL ke dalam suatu file.
Contoh untuk .load:1 $ node2 > . load /home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s / h e l l o . j s3 > var http = r equ i r e ( ’http’ ) ;4 undef ined5 > http . c r e a t eS e rv e r ( function ( req , r e s ) {6 . . . r e s . writeHead (200 , {’Content -Type’ : ’text/plain ’ } ) ;7 . . . r e s . end ( ’Hello World\n’ ) ;8 . . . } ) . l i s t e n (1337 , ’127.0.0.1 ’ ) ;9 { domain : null ,
10 _events :11 { reque s t : [ Function ] ,12 connect ion : [ Function : c onnec t i onL i s t ene r ] ,13 c l i e n tE r r o r : [ Function ] } ,14 _maxListeners : 10 ,15 _connections : 0 ,16 connect i ons : [ Getter / Se t t e r ] ,17 _handle : null ,18 _usingSlaves : false ,19 _slaves : [ ] ,20 allowHalfOpen : true ,21 httpAllowHalfOpen : false ,22 timeout : 120000 }23 > conso l e . l og ( ’Server running at http ://127.0.0.1:1337/ ’ ) ;24 Server running at http : // 127.0.0.1:1337/25 undef ined26 >
Listing 2.2: Contoh penggunaan .load dalam REPL
Setelah keluar dari sesi REPL, maka port akan ditutup dan hasil eksekusi di atas akandibatalkan.Untuk menyimpan hasil sesi REPL menggunakan .save, jika tanpa menyebutkan di-
rektori, maka akan disimpan di direktori aktif saat itu. Contoh:
2.2. Dasar-dasar JavaScript di Node.js 23
1 $ node2 > conso l e . l og ( "Selamat datang di Node.js" )3 Selamat datang d i Node . j s4 undef ined5 > . save /home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s /welcome . j s6 Se s s i on saved to : / home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s /welcome . j s7 > $ cat /home/bpdp/ ker jaan / s r c / j a v a s c r i p t / node j s /welcome . j s8 conso l e . l og ( "Selamat datang di Node.js" )9 $
Listing 2.3: Contoh penggunaan perintah .save di sesi REPL
2.2. Dasar-dasar JavaScript di Node.js
Node.js merupakan sistem peranti lunak yang merupakan implementasi dari bahasapemrograman JavaScript. Spesifikasi JavaScript yang diimplementasikan merupakanspesifikasi resmi dari ECMAScript serta CommonJS (http://commonjs.org). Dengandemikian, jika anda sudah pernah mempelajari JavaScript sebelumnya, tata bahasa dariperintah yang dipahami oleh Node.js masih tetap sama dengan JavaScript.
2.2.1. Membaca Masukan dari Stream / Masukan Standar (stdin)
Untuk lebih memahami dasar-dasar JavaScript serta penerapannya di Node.js, seringkalikita perlu melakukan simulasi pertanyaan - proses - keluaran jawaban. Proses akan kitapelajari seiring dengan materi-materi berikutnya, sementara untuk keluaran, kita bisamenggunakan console.log. Bagian ini akan menjelaskan sedikit tentang masukan.
Perintah untuk memberi masukan di Node.js sudah tersedia pada pustaka API Read-line1. Pola dari masukan ini adalah sebagai berikut:
X me-require pustaka Readline
X membuat interface untuk masukan dan keluaran
X .. gunakan interface ..
X .. gunakan interface ..
X .. gunakan interface ..
X .. gunakan interface ..
X ..
X ..
X tutup interface
1Lengkapnya bisa diakses di http://nodejs.org/api/readline.html
2.2. Dasar-dasar JavaScript di Node.js 24
Implementasi dari pola diatas bisa dilihat pada kode sumber berikut ini (diambil darimanual Node.js):
1 var r e ad l i n e = r equ i r e ( ’readline ’ ) ;23 var r l = r e ad l i n e . c r e a t e I n t e r f a c e ({4 input : p roce s s . s td in ,5 output : p roce s s . s tdout6 } ) ;78 r l . ques t i on ( "What do you think of node.js? " , function ( answer ) {9 conso l e . l og ( "Thank you for your valuable feedback:" , answer ) ;
10 r l . c l o s e ( ) ;11 } ) ;1213 // hasil:14 // $ node readline.js15 // What do you think of node.js? awesome!16 // Thank you for your valuable feedback: awesome!17 // $
Listing 2.4: readline.js: penggunaan pustaka Readline untuk masukan
Catatan: function(answer) pada listing di atas merupakan anonymous function ataufungsi anonimus (sering juga disebut lambda function / fungsi lambda. Posisi fungsipada listing tersebut disebut dengan fungsi callback. Untuk keperluan pembahasan saatini, untuk sementara yang perlu dipahami adalah hasil input akan dimasukkan ke an-swer untuk diproses lebih lanjut. Fungsi dan callback akan dibahas lebih lanjut padapembahasan berikutnya.
2.2.2. Nilai/Value dan Tipe Data
Program dalam JavaScript akan berhubungan dengan data atau nilai. Setiap nilai mem-punyai tipe tertentu. JavaScript mengenali berbagai tipe berikut ini:
X Angka: bulat (misalnya 4) atau pecahan (misalnya 3.75)
X Boolean: nilai benar (true) dan salah (false)
X String: diapit oleh tanda petik ganda ("contoh string") atau tunggal (’contohstring’)
X null
X undefined
JavaScript adalah bahasa pemrograman yang mengijinkan pemrogram untuk tidakmendefinisikan tipe data pada saat deklarasi, atau sering juga disebut sebagai dynami-cally typed language:
2.2. Dasar-dasar JavaScript di Node.js 25
1 var jumlahMahasiswa = 302 conso l e . l og ( ’Jumlah mahasiswa dalam satu kelas = ’ + jumlahMahasiswa ) ;3 // Jumlah mahasiswa dalam satu kelas = 30
Listing 2.5: Fitur dynamically typed language
Pada contoh di atas, kita bisa melihat bahwa data akan dikonversi secara otomatispada saat program dieksekusi.
Catatan:
X Khusus untuk operator "+", JavaScript akan melakukan penggabungan string(string concatenation), tetapi untuk operator lain, akan dilakukan operasi matem-atis sesuai operator tersebut (-,/,*).
X Konversi string ke tipe numerik bisa dilakukan dengan parseInt(string) (jika bilan-gan bulat) dan parseFloat(string) (jika bilangan pecahan).
2.2.3. Variabel
Variabel adalah suatu nama yang didefinisikan untuk menampung suatu nilai. Nama iniakan digunakan sebagai referensi yang akan menunjukkan ke nilai yang ditampungnya.Nama variabel disebut dengan identifier / pengenal. Ada beberapa syarat pemberiannama identifier di JavaScript:
X Dimulai dengan huruf, underscore (_), atau tanda dollar ($).
X Karakter berikutnya bisa berupa angka, selain ketentuan pertama di atas.
X Membedakan huruf besar - kecil.
Konvensi yang digunakan oleh pemrogram JavaScript terkait dengan penamaan ini adalahvariasi dari metode camel case, yaitu camelBack. Contoh: jumlahMahasiswa, linkMenu,status.
2.2.4. Konstanta
Konstanta mirip dengan variabel, hanya saja sifatnya read-only, tidak bisa diubah-ubahsetelah ditetapkan. Untuk menetapkan konstanta di JavaScript, digunakan kata kunciconst. Contoh:
1 const MENU = "Home" ;23 conso l e . l og ( "Posisi menu = " + MENU) ;45 // mencoba mengisi MENU. berhasil?67 MENU = "About" ;8
2.2. Dasar-dasar JavaScript di Node.js 26
9 conso l e . l og ( "Posisi menu = " + MENU) ;1011 // Posisi menu = Home12 // Posisi menu = Home
Listing 2.6: Contoh konstanta dalam JavaScript
Konvensi penamaan konstanta adalah menggunakan huruf besar semua. Bagian ini(sampai saat buku ini ditulis) hanya berlaku di Firefox dan Google Chrome - V8 (artinyaberlaku juga untuk Node.js).
2.2.5. Fungsi
Pengertian Fungsi
Fungsi merupakan subprogram atau suatu bagian dari keseluruhan program yang ditu-jukan untuk mengerjakan suatu pekerjaan tertentu dan (biasanya) menghasilkan suatunilai kembalian. Subprogram ini relatif independen terhadap bagian-bagian lain sehinggamemenuhi kaidah "bisa-digunakan-kembali" atau reusable pada beberapa program yangmemerlukan fungsionalitasnya. Fungsi dalam ilmu komputer sering kali juga disebutdengan prcedure, routine, atau method.
Definisi Fungsi
Definisi fungsi dari JavaScript di Node.js bisa dilakukan dengan sintaksis berikut ini:1 function namaFungsi ( argumen1 , argumen2 , . . . , argumentN ) {2 . .3 JavaScr ipt code . .4 JavaScr ipt code . .5 JavaScr ipt code . .6 JavaScr ipt code . .7 . .8 }
Listing 2.7: Sintaksis Fungsi dalam JavaScript
Setelah dideklarasikan, fungsi tersebut bisa dipanggil dengan cara sebagai berikut:1 . .2 . .3 namaFungsi ( argumen1 , argumen2 , . . . , argumenN ) ;4 . .5 . .
Listing 2.8: Pemanggilan Fungsi dalam JavaScript
Contoh dalam program serta pemanggilannya adalah sebagai berikut:1 $ node2 > function addX( angka ) {3 . . . c on so l e . l og ( angka + 10 ) ;4 . . . }5 undef ined6 > addX ( 2 0 ) ;7 30
2.2. Dasar-dasar JavaScript di Node.js 27
8 undef ined9 >
10 > function add2Numbers ( angka1 , angka2 ) {11 . . . return angka1 + angka2 ;12 . . . }13 undef ined14 > conso l e . l og ( "232 + 432 = " + add2Numbers (232 , 4 3 2 ) ) ;15 232 + 432 = 66416 undef ined17 >
Listing 2.9: Contoh deklarasi fungsi dan pemanggilannya
Fungsi Anonim
Fungsi anonim adalah fungsi tanpa nama, pemrogram tidak perlu memberikan namake fungsi. Biasanya fungsi anonimus ini hanya digunakan untuk fungsi yang dikerjakanpada suatu bagian program saja dan tidak dengan maksud untuk dijadikan komponenyang bisa dipakai di bagian lain dari program (biasanya untuk menangani event ataucallback). Untuk mendeklarasikan fungsi ini, digunakan literal function.
1 var pangkat = function ( angka ) {return angka ∗ angka } ;2 conso l e . l og ( pangkat ( 1 0 ) ) ;3 // output: 100
Listing 2.10: Fungsi anonim
Fungsi Rekursif
Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri. Contoh dari aplikasi fungsirekursif adalah pada penghitungan faktorial berikut:
1 function f a c t o r i a l (n ) {23 i f ( ( n == 0) | | (n == 1))4 return 1 ;5 else6 return (n ∗ f a c t o r i a l (n − 1 ) ) ;78 }9
10 conso l e . l og ( "factorial (6) = " + f a c t o r i a l ( 6 ) ) ;1112 // hasil:13 // factorial (6) = 720
Listing 2.11: Fungsi rekursif untuk menghitung faktorial
Fungsi di dalam Fungsi / Nested Functions
Saat mendefinisikan fungsi, di dalam fungsi tersebut pemrogram bisa mendefinisikanfungsi lainnya. Meskipun demikian, fungsi yang terletak dalam suatu definisi fungsi tidakbisa diakses dari luar fungsi tersebut dan hanya tersedia untuk fungsi yang didefinisikan.
2.2. Dasar-dasar JavaScript di Node.js 28
1 function induk ( ) {23 var awal = 0 ;4 function tambahkan ( ) {5 awal++;6 }78 tambahkan ( ) ;9 tambahkan ( ) ;
1011 conso l e . l og ( ’Nilai = ’ + awal ) ;1213 }1415 induk ( ) ;16 tambahkan ( ) ;1718 // hasil:19 // Nilai = 220 //21 // /home/bpdp/kerjaan/git -repos/buku -cloud -nodejs/22 // src/bab -02/ nested.js:1223 // tambahkan ();24 // ^25 // ReferenceError: tambahkan is not defined26 // at Object.<anonymous > (/home/bpdp/kerjaan/git -repos/27 // buku -cloud -nodejs/src/bab -02/ nested.js :12:1)28 // at Module._compile (module.js :456:26)29 // at Object.Module._extensions ..js (module.js :474:10)30 // at Module.load (module.js :356:32)31 // at Function.Module._load (module.js :312:12)32 // at Function.Module.runMain (module.js :497:10)33 // at startup (node.js :119:16)34 // at node.js :901:3
Listing 2.12: Fungsi di dalam Fungsi
2.2.6. Literal
Literal digunakan untuk merepresentasikan nilai dalam JavaScript. Ada beberapa tipeliteral.
Literal Array
Array atau variabel berindeks adalah penampung untuk obyek yang menyerupai list ataudaftar. Obyek array juga menyediakan berbagai fungsi dan metode untuk mengolahanggota yang terdapat dalam daftar tersebut (terutama untuk operasi traversal danpermutasi. Listing berikut menunjukkan beberapa operasi untuk literal array.
1 var arrMembers = [ ’one’ , ’two’ , , ’three ’ , ] ;2 // sengaja ada koma di bagian akhir3 conso l e . l og ( arrMembers [ 0 ] ) ;4 // hasil: one5 conso l e . l og ( arrMembers [ 2 ] ) ;6 // hasil: undefined7 conso l e . l og ( arrMembers [ 3 ] ) ;8 // hasil: three
2.2. Dasar-dasar JavaScript di Node.js 29
9 conso l e . l og ( arrMembers [ 4 ] ) ;10 // hasil: undefined - karena tidak ada11 conso l e . l og ( arrMembers . l ength ) ;12 // hasil: 413 var multiArray = [14 [ ’0-0’ , ’0-1’ , ’0-2’ ] ,15 [ ’1-0’ , ’1-1’ , ’1-2’ ] ,16 [ ’2-0’ , ’2-1’ , ’2-2’ ] ] ;17 conso l e . l og ( multiArray [ 0 ] [ 2 ] ) ;18 // hasil: 0-219 conso l e . l og ( multiArray [ 1 ] [ 2 ] ) ;20 // hasil: 1-2
Listing 2.13: Array di JavaScript
Literal Boolean
Literal boolean menunjukkan nilai benar (true) atau salah (false).
Literal Integer
Literal integer digunakan untuk mengekspresikan nilai bilangan bulat. Nilai bulanganbulat dalam JavaScript bisa dalam bentuk:
X decimal (basis 10): digit tanpa awalan nol.
X octal (basis 8): digit diawali dengan 1 angka nol.2
X hexadecimal (basis 16): digit diawali dengan 0x.
Literal Floating-point
Literal ini digunakan untuk mengekspresikan nilai bilangan pecahan, misalnya 0.4343atau bisa juga menggunakan E/e (nilai eksponensial), misalnya -3.1E12.
Literal Obyek
Literal ini akan dibahas di bab yang menjelaskan tentang paradigma pemrograman beror-ientasi obyek di JavaScript.
Literal String
Literal string mengekspresikan suatu nilai dalam bentuk sederetan karakter dan beradadalam tanda petik (ganda/“” maupun tunggal/”). Contoh:
X “Kembali ke halaman utama”
X ’Lisensi’
X “Hari ini, Jum’at, tanggal 21 November”2pada ECMA-262, bilangan octal ini sudah tidak digunakan lagi.
2.2. Dasar-dasar JavaScript di Node.js 30
X “1234.543”
X “baris pertama \n baris kedua”
Contoh terakhir di atas menggunakan karakter khusus (\n). Beberapa karakter khususlainnya adalah:
X \b: Backspace
X \f: Form feed
X \n: New line
X \r: Carriage return
X \t: Tab
X \v: Vertical tab
X \’: Apostrophe atau single quote
X \": Double quote
X \\: Backslash (\).
X \XXX: Karakter dengan pengkodean Latin-1 dengan tiga digit octal antara 0 and377. (misal, \251 adalah simbol hak cipta).
X \xXX: seperti di atas, tetapi hexadecimal (2 digit).
X \uXXXX: Karakter Unicode dengan 3 digit karakter hexadecimal.
Backslash sendiri sering digunakan sebagai escape character, misalnya “NaN seringdisebut juga sebagai \”Not a Number\“”.
2.2.7. Struktur Data dan Representasi JSON
JSON (JavaScript Object Notation) adalah subset dari JavaScript dan merupakan struk-tur data native di JavaScript. Bentuk dari representasi struktur data JSON adalahsebagai berikut3:
1 var data = {2 "firstName" : "John" ,3 "lastName" : "Smith" ,4 "age" : 25 ,5 "address" : {6 "streetAddress" : "21 2nd Street" ,7 "city" : "New York" ,8 "state" : "NY" ,9 "postalCode" : "10021"
10 } ,
3http://en.wikipedia.org/wiki/JSON dengan sedikit perubahan
2.2. Dasar-dasar JavaScript di Node.js 31
11 "phoneNumber" :12 {13 "home" : "212 555 -1234" ,14 "fax" : "646 555 -4567"15 }16 }1718 conso l e . l og ( data . f i r stName + " " + data . lastName +19 " has this phone number = "20 + data . phoneNumber . home ) ;2122 // hasil:23 // John Smith has this phone number = 212 555 -1234
Listing 2.14: Representasi JSON
Dari representasi di atas, kita bisa membaca:
X Nilai data “firstname” adalah “John”
X Data “address” terdiri atas sub data “streetAddress”, “city”, “state”, dan “postal-Code” yang masing-masing mempunyai nilai data sendiri-sendiri.
X dan seterusnya
2.2.8. Aliran Kendali
Alur program dikendalikan melalui pernyataan-pernyataan untuk aliran kendali. Adabeberapa pernyataan aliran kendali yang akan dibahas.
Pernyataan Kondisi if .. else if .. else
Pernyataan ini digunakan untuk mengerjakan atau tidak mengerjakan suatu bagian ataublok program berdasarkan hasil evaluasi kondisi tertentu.
1 var kond i s i = fa l se ;2 i f ( kond i s i ) {3 conso l e . l og ( ’hanya dikerjakan jika kondisi bernilai benar/true’ ) ;4 } ;5 // hasil: n/a, tidak ada hasilnya6 var kond i s i = true ;7 i f ( kond i s i ) {8 conso l e . l og ( ’hanya dikerjakan jika kondisi bernilai benar/true’ ) ;9 } ;
10 // hasil: hanya dikerjakan jika kondisi bernilai benar/true11 // Contoh berikut lebih kompleks , melibatkan input1213 var r e ad l i n e = r equ i r e ( ’readline ’ ) ;1415 var r l = r e ad l i n e . c r e a t e I n t e r f a c e ({16 input : p roce s s . s td in ,17 output : p roce s s . s tdout18 } ) ;1920 r l . ques t i on ( "Masukkan angka nilai: " , function ( answer ) {21 i f ( answer > 80) {22 conso l e . l og ( "Nilai: A" ) ;
2.2. Dasar-dasar JavaScript di Node.js 32
23 } else i f ( answer > 70) {24 conso l e . l og ( "Nilai: B" ) ;25 } else i f ( answer > 40) {26 conso l e . l og ( "Nilai: C" ) ;27 } else i f ( answer > 30) {28 conso l e . l og ( "Nilai: D" ) ;29 } else {30 conso l e . l og ( "Tidak lulus" ) ;31 }32 r l . c l o s e ( ) ;33 } ) ;3435 // hasil:36 // hanya dikerjakan jika kondisi bernilai benar/true37 // Masukkan angka nilai: 5038 // Nilai: C
Listing 2.15: Pernyataan if .. else if .. else
Pernyataan switch
Pernyataan ini digunakan untuk mengevaluasi suatu ekspresi dan membandingkan samaatau tidaknya dengan suatu label tertentu di dalam struktur pernyataan switch, sertamengeksekusi perintah-perintah sesuai dengan label yang cocok.
1 var r e ad l i n e = r equ i r e ( ’readline ’ ) ;23 var r l = r e ad l i n e . c r e a t e I n t e r f a c e ({4 input : p roce s s . s td in ,5 output : p roce s s . s tdout6 } ) ;78 conso l e . l og ( "Menu" ) ;9 conso l e . l og ( "====" ) ;
10 conso l e . l og ( "1. Mengisi data" ) ;11 conso l e . l og ( "2. Mengedit data" ) ;12 conso l e . l og ( "3. Menghapus data" ) ;13 conso l e . l og ( "4. Mencari data" ) ;14 r l . ques t i on ( "Masukkan angka pilihan anda: " , function ( answer ) {15 conso l e . l og ( "Pilihan anda: " + answer ) ;16 switch ( answer ) {17 case "1" :18 conso l e . l og ( "Anda memilih menu pengisian data" ) ;19 break ;20 case "2" :21 conso l e . l og ( "Anda memilih menu pengeditan data" ) ;22 break ;23 case "3" :24 conso l e . l og ( "Anda memilih menu penghapusan data" ) ;25 break ;26 case "4" :27 conso l e . l og ( "Anda memilih menu pencarian data" ) ;28 break ;29 d e f au l t :30 conso l e . l og ( "Anda tidak memilih salah satu dari menu di atas" ) ;31 break ;32 }33 r l . c l o s e ( ) ;34 } ) ;35
2.2. Dasar-dasar JavaScript di Node.js 33
36 // hasil:37 // $ node switch.js38 // Menu39 // ====40 // 1. Mengisi data41 // 2. Mengedit data42 // 3. Menghapus data43 // 4. Mencari data44 // Masukkan angka pilihan anda: 1045 // Pilihan anda: 1046 // Anda tidak memilih salah satu dari menu di atas47 // $ node switch.js48 // Menu49 // ====50 // 1. Mengisi data51 // 2. Mengedit data52 // 3. Menghapus data53 // 4. Mencari data54 // Masukkan angka pilihan anda: 255 // Pilihan anda: 256 // Anda memilih menu pengeditan data
Listing 2.16: Pernyataan Contoh penggunaan “switch”
Looping
Looping atau sering juga disebut “kalang” adalah konstruksi program yang digunakanuntuk melakukan suatu blok perintah secara berulang-ulang.for
1 f o r (var i = 0 ; i < 9 ; i++) {2 conso l e . l og ( i ) ;3 }45 // hasil:6 // 07 // 18 // 29 // 3
10 // 411 // 512 // 613 // 714 // 8
Listing 2.17: Pernyataan for
Pernyataan “for” juga bisa digunakan untuk mengakses data yang tersimpam dalamstruktur data JavaScript (JSON).
1 var data = {a : 1 , b : 2 , c : 3 } ;23 f o r (var i t e r a s i in data ) {4 conso l e . l og ( "Nilai dari iterasi " + i t e r a s i + " adalah: " + data [ i t e r a s i ] ) ;5 }67 // hasil:8 // Nilai dari iterasi a adalah: 19 // Nilai dari iterasi b adalah: 2
2.2. Dasar-dasar JavaScript di Node.js 34
10 // Nilai dari iterasi c adalah: 3
Listing 2.18: Pernyataan for .. in
do .. whilePernyataan ini digunakan untuk mengerjakan suatu blok program selama suatu kondisi
bernilai benar dengan jumlah minimal pengerjaan sebanyak 1 kali.1 var i = 0 ;2 do {3 i += 2 ;4 conso l e . l og ( i ) ;5 } while ( i < 20 ) ;67 // hasil:8 // 29 // 4
10 // 611 // 812 // 1013 // 1214 // 1415 // 1616 // 1817 // 20
Listing 2.19: Pernyataan do .. while
whileSeperti do .. while, pernyataan ini digunakan untuk mengerjakan suatu blok program
secara berulang-ulang selama kondisi bernilai benar. Meskipun demikian, bisa saja blokprogram tersebut tidak pernah dikerjakan jika pada saat awal expresi dievaluasi sudahbernilai false.
1 var n = 0 ;2 var x = 0 ;34 while (n < 5) {5 n ++;6 x += n ;7 conso l e . l og ( "Nilai n = " + n ) ;8 conso l e . l og ( "Nilai x = " + x ) ;9 }
1011 // hasil:12 // Nilai n = 113 // Nilai x = 114 // Nilai n = 215 // Nilai x = 316 // Nilai n = 317 // Nilai x = 618 // Nilai n = 419 // Nilai x = 1020 // Nilai n = 521 // Nilai x = 15
Listing 2.20: Pernyataan while
label, break, dan continueBagian ini digunakan dalam looping dan switch.
2.2. Dasar-dasar JavaScript di Node.js 35
X label digunakan untuk memberi pengenal pada suatu lokasi program sehingga bisadireferensi oleh break maupun continue (jika dikehendaki).
X break digunakan untuk menghentikan eksekusi dan meneruskan alur program kepernyataan setelah looping atau switch
X continue digunakan untuk meneruskan eksekusi ke iterasi atau ke kondisi switchberikutnya.
1 var n = 0 ;2 var x = 0 ;34 while (n < 5) {5 n ++;6 x += n ;78 i f ( x%2 == 0) {9 cont inue ;
10 } ;1112 i f (x>10) {13 break ;14 } ;1516 conso l e . l og ( "Nilai n = " + n ) ;17 conso l e . l og ( "Nilai x = " + x ) ;1819 } ;20 // hasil:21 //Nilai n = 122 //Nilai x = 123 //Nilai n = 224 //Nilai x = 3
Listing 2.21: Pernyataan break dan continue
1 topLabel :2 f o r (var k = 0 ; k < 10 ; k++){3 f o r (var m = 0 ; m < 20 ; m++){4 i f (m == 5){5 conso l e . l og ( "Nilai k = " + k ) ;6 conso l e . l og ( "Nilai m = " + m) ;7 break topLabel ;8 }9 }
10 }11 // hasil:12 //Nilai k = 013 //Nilai m = 5
Listing 2.22: Pernyataan break dengan label
2.2.9. Penanganan Error
JavaScript mendukung pernyataan try .. catch .. finally serta throw untuk menangani er-ror. Meskipun demikian, banyak hal yang tidak sesuai dengan konstruksi ini karena sifat
2.2. Dasar-dasar JavaScript di Node.js 36
JavaScript yang asynchronous. Untuk kasus asynchrous, pemrogram lebih disarankanmenggunakan function callback.
1 try {2 gakAdaFungsiIni ( ) ;3 } catch ( e ) {4 conso l e . l og ( "Error: " + e . message ) ;5 } f i n a l l y {6 conso l e . l og ( "Bagian ’pembersihan ’, akan dikerjakan , apapun yang terjadi" ) ;7 } ;89 // hasil:
10 // Error: gakAdaFungsiIni is not defined11 // Bagian ’pembersihan ’, akan dikerjakan , apapun yang terjadi
Listing 2.23: Pernyataan try catch finally
Jika diperlukan, kita bisa mendefinisikan sendiri error dengan menggunakan perny-ataan throw.
1 try {2 var a = 1/0 ;3 throw "Pembagian oleh angka 0" ;4 } catch ( e ) {5 conso l e . l og ( "Error: " + e ) ;6 } ;78 // hasil:9 // Error: Pembagian oleh angka 0
Listing 2.24: Pernyataan try catch throw
BAB 3
Paradigma Pemrograman di JavaScript
3.1. Pemrograman Fungsional
Pemrograman fungsional, atau sering disebut functional programming, selama ini lebihsering dibicarakan di level para akademisi. Meskipun demikian, saat ini terdapat kecen-derungan paradigma ini semakin banyak digunakan di industri. Contoh nyata dari im-plementasi paradigma ini di industri antara lain adalah Scala (http://www.scala-lang.org), OCaml (http://www.ocaml.org), Haskell (http://www.haskell.org), MicrosoftF# (http://fsharp.org), dan lain-lain. Dalam konteks paradigma pemrograman, per-anti lunak yang dibangun menggunakan pendekatan paradigma ini akan terdiri atasberbagai fungsi yang mirip dengan fungsi matematis. Fungsi matematis tersebut di-evaluasi dengan penekanan pada penghindaran state serta mutable data. Bandingkandengan paradigma pemrograman prosedural yang menekankan pada immutable data dandefinisi berbagai prosedur dan fungsi untuk mengubah state serta data.JavaScript bukan merupakan bahasa pemrograman fungsional yang murni, tetapi ada
banyak fitur dari pemrograman fungsional yang terdapat dalam JavaScript. Dalam halini, JavaScript banyak dipengaruhi oleh bahasa pemrograman Scheme (http://www.schemers.org/). Bab ini akan membahas beberapa fitur pemrograman fungsional diJavaScript. Pembahasan ini didasari pembahasan di bab sebelumnya tentang Fungsi diJavaScript.
3.1.1. Ekspresi Lambda
Ekspresi lambda / lambda expression merupakan hasil karya dari ALonzo Church sekitartahun 1930-an. Aplikasi dari konsep ini di dalam pemrograman adalah penggunaanfungsi sebagai parameter untuk suatu fungsi. Dalam pemrograman, lambda functionsering juga disebut sebagai fungsi anonimus (fungsi yang dipanggil/dieksekusi tanpa
37
3.1. Pemrograman Fungsional 38
ditautkan (bound) ke suatu identifier). Berikut adalah implementasi dari konsep ini diJavaSCript:
1 // Diambil dari2 // http :// stackoverflow.com/questions /3865335/ what -is -a-lambda -language3 // dengan beberapa perubahan45 function applyOperation (a , b , opera t i on ) {6 return opera t i on (a , b ) ;7 }89 function add (a , b) {
10 return a+b ;11 }1213 function subt rac t ( a , b ) {14 return a−b ;15 }1617 conso l e . l og ( ’1,2, add: ’ + applyOperation (1 , 2 , add ) ) ;18 conso l e . l og ( ’43,21, subtract: ’ + applyOperation (43 ,21 , subt rac t ) ) ;1920 conso l e . l og ( ’4^3: ’ + applyOperation (4 , 3 , function ( a , b ) {return Math . pow(a , b ) } ) )2122 // hasil:23 // 1,2, add: 324 // 43,21, subtract: 2225 // 4^3: 64
Listing 3.1: Ekspresi Lambda di JavaScript
3.1.2. Higher-order Function
Higher-order function (sering disebut juga sebagai functor adalah suatu fungsi yangsetidak-tidaknya menggunakan satu atau lebih fungsi lain sebagai parameter dari fungsi,atau menghasilkan fungsi sebagai nilai kembalian.
1 function forEach ( array , a c t i on ) {2 f o r (var i = 0 ; i < array . l ength ; i++ )3 ac t i on ( array [ i ] ) ;4 }56 function pr in t (word ) {7 conso l e . l og (word ) ;8 }9
10 function makeUpperCase (word ) {11 conso l e . l og (word . toUpperCase ( ) ) ;12 }1314 forEach ( [ "satu" , "dua" , "tiga" ] , p r i n t ) ;15 forEach ( [ "satu" , "dua" , "tiga" ] , makeUpperCase ) ;1617 // hasil:18 //satu19 //dua20 //tiga21 //SATU22 //DUA
3.1. Pemrograman Fungsional 39
23 //TIGA
Listing 3.2: Higher-order Function di JavaScript
3.1.3. Closure
Suatu closure merupakan definisi suatu fungsi bersama-sama dengan lingkungannya.Lingkungan tersebut terdiri atas fungsi internal serta berbagai variabel lokal yang masihtetap tersedia saat fungsi utama / closure tersebut selesai dieksekusi.
1 // Diambil dengan sedikit perubahan dari:2 // https :// developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures3 function makeAdder (x ) {4 return function ( y ) {5 return x + y ;6 } ;7 }89 var add5 = makeAdder ( 5 ) ;
10 var add10 = makeAdder ( 1 0 ) ;1112 conso l e . l og ( add5 ( 2 ) ) ; // 713 conso l e . l og ( add10 ( 2 ) ) ; // 12
Listing 3.3: Closure di JavaScript
3.1.4. Currying
Currying memungkinkan pemrogram untuk membuat suatu fungsi dengan cara menggu-nakan fungsi yang sudah tersedia secara parsial, artinya tidak perlu menggunakan semuaargumen dari fungsi yang sudah tersedia tersebut.
1 // Diambil dari:2 // http :// javascriptweblog.wordpress.com /2010/04/05/3 // curry -cooking -up -tastier -functions/4 // dengan sedikit perubahan56 function toArray ( fromEnum) {7 return Array . prototype . s l i c e . c a l l ( fromEnum ) ;8 }9
10 Function . prototype . curry = function ( ) {11 i f ( arguments . length <1) {12 return this ; // nothing to curry with - return function13 }14 var __method = this ;15 var args = toArray ( arguments ) ;16 return function ( ) {17 return __method . apply ( this , a rgs . concat ( toArray ( arguments ) ) ) ;18 }19 }2021 var add = function ( a , b ) {22 return a + b ;23 }2425 // create function that returns 10 + argument
3.2. Pemrograman Berorientasi Obyek 40
26 var addTen = add . curry ( 1 0 ) ;27 conso l e . l og ( addTen ( 2 0 ) ) ; //30
Listing 3.4: Currying di JavaScript
3.2. Pemrograman Berorientasi Obyek
3.2.1. Pengertian
Pemrograman Berorientasi Obyek (selanjutnya akan disingkat PBO) adalah suatu paradigmapemrograman yang memandang bahwa pemecahan masalah pemrograman akan dilakukanmelalui definisi berbagai kelas kemudian membuat berbagai obyek berdasarkan kelas yngdibuat tersebut dan setelah itu mendefinisikan interaksi antar obyek tersebut dalammemecahkan masalah pemrograman. Obyek bisa saling berinteraksi karena setiap obyekmempunyai properti (sifat / karakteristik) dan method untuk mengerjakan suatu peker-jaan tertentu. Jadi, bisa dikatakan bahwa paradigma ini menggunakan cara pandangyang manusiawi dalam penyelesaian masalah.Dengan demikian, inti dari PBO sebenarnya terletak pada kemampuan untuk mengab-
straksikan berbagai obyek ke dalam kelas (yang terdiri atas properti serta method).Paradigma PBO biasanya juga mencakup inheritance atau pewarisan (sehingga terben-tuk skema yang terdiri atas superclass dan subclass). Ciri lainnya adalah polymorphismdan encapsulation / pengkapsulan.JavaScript adalah bahasa pemrograman yang mendukung PBO dan merupakan im-
plementasi dari ECMAScript. Implementasi PBO di JavaScript adalah prototype-basedprogramming yang merupakan salah satu subset dari PBO. Pada prototype-based pro-gramming, kelas / class tidak ada. Pewarisan diimplementasikan melalui prototype.
3.2.2. Definisi Obyek
Definisi obyek dilakukan dengan menggunakan definisi function, sementara this digu-nakan di dalam definisi untuk menunjukkan ke obyek tersebut. Sementara itu, Ke-las.prototype.namaMethod digunakan untuk mendefinisikan method dengan nama methodnamaMethod pada kelas Kelas. Perhatikan contoh pada listing berikut.
1 var u r l = r equ i r e ( ’url’ ) ;23 // Definisi obyek4 function Halaman( alamatUrl ) {5 this . u r l = alamatUrl ;6 conso l e . l og ( "Mengakses alamat " + alamatUrl ) ;7 }89 Halaman . prototype . getDomainName = function ( ) {
10 return u r l . parse ( this . ur l , true ) . host ;11 }12 // sampai disini definisi obyek13 // Halaman.prototype.getDomainName => menetapkan method getDomainName14 // untuk obyek1516 var halSatu = new Halaman( "http :// nodejs.org/api/http.html" ) ;
3.2. Pemrograman Berorientasi Obyek 41
17 var halDua = new Halaman( "http :// bpdp.name/login?fromHome" ) ;1819 conso l e . l og ( "Alamat URL yang diakses oleh halSatu = " + halSatu . u r l ) ;20 conso l e . l og ( "Alamat URL yang diakses oleh halDua = " + halDua . u r l ) ;2122 conso l e . l og ( "Nama domain halDua = " + halDua . getDomainName ( ) ) ;2324 // hasil:25 // Mengakses alamat http :// nodejs.org/api/http.html26 // Mengakses alamat http :// bpdp.name/login?fromHome27 // Alamat URL yang diakses oleh halSatu = http :// nodejs.org/api/http.html28 // Alamat URL yang diakses oleh halDua = http :// bpdp.name/login?fromHome29 // Nama domain halDua = bpdp.name
Listing 3.5: Definisi obyek di JavaScript
3.2.3. Inheritance / Pewarisan
Pewarisan di JavaScript bisa dicapai menggunakan prototype. Listing program berikutmemperlihatkan bagaimana pewarisan diimplementasikan di JavaScript.
1 // Definisi obyek2 function Kelas (param) {3 this . property1 = new St r ing (param ) ;4 }56 Kelas . prototype . methodSatu = function ( ) {7 return this . property1 ;8 }9
10 var ke la sSatu = new Kelas ( "ini parameter 1 dari kelas 1" ) ;1112 conso l e . l og ( "Property 1 dari kelasSatu = " + ke lasSatu . property1 ) ;13 conso l e . l og ( "Property 1 dari kelasSatu , diambil dari method = " + ke lasSatu . methodSatu ( ) ) ;1415 // Definisi inheritance:16 // SubKelas merupakan anak dari Kelas yang didefinisikan17 // di atas.1819 SubKelas . prototype = new Kelas ( ) ;20 SubKelas . prototype . c on s t ruc to r = SubKelas ;2122 function SubKelas (param) {23 this . property1 = new St r ing (param ) ;24 }2526 // method overriding27 SubKelas . prototype . methodSatu = function ( keHurufBesar ) {28 conso l e . l og ( "Ubah ke huruf besar? = " + keHurufBesar ) ;29 i f ( keHurufBesar ) {30 return this . property1 . toUpperCase ( ) ;31 } else {32 return this . property1 . toLowerCase ( ) ;33 }34 }3536 SubKelas . prototype . methodDua = function ( ) {37 conso l e . l og ( "Berada di method dua dari SubKelas" ) ;38 }39
3.2. Pemrograman Berorientasi Obyek 42
40 // mari diuji41 var subKelasSatu = new SubKelas ( "Parameter 1 Dari Sub Kelas 1" ) ;4243 conso l e . l og ( "Property 1 dari sub kelas 1 = " + subKelasSatu . property1 ) ;44 conso l e . l og ( "Property 1 dari sub kelas 1, dr method+param = " + subKelasSatu . methodSatu ( true ) ) ;45 conso l e . l og ( "Property 1 dari sub kelas 1, dr method+param = " + subKelasSatu . methodSatu ( fa l se ) ) ;4647 conso l e . l og ( subKelasSatu . methodDua ( ) ) ;48 // hasil:49 //50 // Property 1 dari kelasSatu = ini parameter 1 dari kelas 151 // Property 1 dari kelasSatu , diambil dari method = ini52 // parameter 1 dari kelas 153 // Property 1 dari sub kelas 1 = Parameter 1 Dari Sub Kelas 154 //Ubah ke huruf besar? = true55 // Property 1 dari sub kelas 1, dr method+param =56 // PARAMETER 1 DARI SUB KELAS 157 //Ubah ke huruf besar? = false58 // Property 1 dari sub kelas 1, dr method+param =59 // parameter 1 dari sub kelas 160 // Berada di method dua dari SubKelas
Listing 3.6: Pewarisan di PBO JavaScript
BAB 4
Mengelola Paket Menggunakan npm
4.1. Apakah npm Itu?
Node.js memungkinkan developer untuk mengembangkan aplikasi secara modular denganmemisahkan berbagai komponen reusable code ke dalam pustaka (library). Berbagaipustaka tersebut bisa diperoleh di http://npmjs.org. Node.js menyediakan perintahnpm untuk mengelola paket pustaka di repositori tersebut. Untuk menggunakan utilitasini, pemrogram harus terkoneksi dengan Internet.
4.2. Menggunakan npm
Saat melakukan instalasi Node.js, secara otomatis npm akan disertakan. Dengan perin-tah npm tersebut, seorang pemrogram bisa mengelola pustaka yang tersedia di reposi-tori. Jika pemrogram mempunya pustakan yang bisa digunakan oleh orang lain, makapemrogram yang bersangkutan juga bisa menyimpan pustaka tersebut ke dalam reposi-tori sehingga memungkinkan untuk diinstall oleh pemrogram-pemrogram lain di seluruhdunia. Sintaksis lengkap dari penggunaan perintah npm ini adalah sebagai berikut1:
1 $ npm −−help23 Usage : npm <command>45 where <command> i s one o f :6 add−user , adduser , apihe lp , author , bin , bugs , c , cache ,7 completion , con f i g , ddp , dedupe , deprecate , docs , ed i t ,8 explore , faq , f ind , f ind−dupes , get , help , help−search ,9 home , i , in fo , i n i t , i n s t a l l , i s n t a l l , i s s u e s , la , l ink ,
10 l i s t , l l , ln , l og in , l s , outdated , owner , pack , p r e f i x ,11 prune , publ i sh , r , rb , r ebu i ld , remove , r e s t a r t , rm , root ,12 run−s c r i p t , s , se , search , set , show , shrinkwrap , s tar ,
1beberapa bagian tertulis spesifik lokasi direktori di komputer yang digunakan penulis
43
4.2. Menggunakan npm 44
13 s ta r s , s t a r t , stop , submodule , tag , test , t s t , un ,14 un i n s t a l l , unl ink , unpublish , unstar , up , update , ver s ion ,15 view , whoami1617 npm <cmd> −h quick help on <cmd>18 npm − l d i sp l ay f u l l usage i n f o19 npm faq commonly asked que s t i on s20 npm help <term> search for help on <term>21 npm help npm invo lved overview2223 Spec i f y c on f i g s in the in i−formatted f i l e :24 /home/bpdp / . npmrc25 or on the command l i n e v ia : npm <command> −−key value26 Config i n f o can be viewed v ia : npm help c on f i g2728 npm@1. 2 . 1 8 /home/bpdp/ so f tware /node−v0 .10.5− l inux−x86/ l i b /node_modules/npm
Listing 4.1: Sintaksis lengkap perintah npm
Pada bagian berikut, kita akan membahas lebih lanjut penggunaan perintah npm terse-but.
4.2.1. Instalasi Paket
npm sebenarnya bukan merupakan singkatan dari Node Package Manager, meskipunseringkali orang menterjemahkan dengan singkatan tersebut dan npm seharusnya ditulisdalam huruf kecil semua seperti yang dijelaskan pada FAQ (Frequently Asked Questions)2.npm merupakan bilah alat berbasis baris perintah, dijalankan melalui shell atau commandprompt. Sama seperti kebanyakan bilah alat berbasis baris perintah lain, npm memilikistruktur perintah npm perintah argumen. Installasi paket pustaka dilakukan denganperintah berikut :
1 $ npm i n s t a l l namapaket
Listing 4.2: Cara install paket menggunakan npm
Perintah diatas akan memasang versi terakhir dari paket “namapaket”. Selain itu npmjuga dapat memasang paket langsung pada sebuah folder, tarball atau tautan untuksebuah tarball.
4.2.2. Struktur Instalasi Paket Node.js
Dalam installasi paket pustaka, berkas-berkas akan terletak dalam folder lokal aplikasinode_modules. Pada mode installasi paket pustaka global (dengan -g atau –globaldibelakang baris perintah), paket pustaka akan dipasang pada /usr/lib/node_modules(dengan lokasi installasi Node.js standar). Mode global memungkinkan paket pustakadigunakan tanpa memasang paket pustaka pada setiap folder lokal aplikasi. Mode globalini juga membutuhkan hak administrasi lebih (sudo atau root) dari pengguna agar dapatmenulis pada lokasi standar.
2https://npmjs.org/doc/faq.html
4.2. Menggunakan npm 45
Jika berada pada direktori $HOME, maka paket-paket npm tersebut akan terinstall di$HOME/.npm, sedangkan jika kita berada di luar direktori $HOME, maka paket-pakettersebut akan terinstall di $CWD/node_modules ($CWD = Current Working Directory -direktori aktif saat ini). Daftar paket pustaka yang terpasang dapat dilihat menggunakanperintah berikut:
1 $ npm l s2 −−> untuk mel ihat pada $CWD3 atau4 $ npm l s −g5 −−> untuk mel ihat pada d i r e k t o r i g l oba l
Listing 4.3: Argumen npm untuk melihat daftar paket terpasang
Selain melihat daftar paket pustaka yang digunakan dalam aplikasi maupun global,perintah diatas juga akan menampilkan paket dependensi dalam struktur pohon. Jikakita belum menginstall paket-paket yang diperlukan, akan muncul peringatan. Berikutini adalah contoh peringatan dari paket-paket yang belum terinstall di aplikasi hello-express saat mengerjakan perintah “npm ls” di direktori tempat aplikasi tersebut berada(lihat bab 1):
1 $ npm l s2 npm WARN package . j son hel lo@0 . 0 . 1 No README.md f i l e found !3 hel lo@0 . 0 . 1 /home/bpdp/ ker jaan / g i t−repos /buku−cloud−node j s / s r c /bab−01/ h e l l o4 +−− UNMET DEPENDENCY expre s s 3 . 2 . 25 +−− UNMET DEPENDENCY jade ∗67 npm ERR! miss ing : express@3 . 2 . 2 , r equ i r ed by hel lo@0 . 0 . 18 npm ERR! miss ing : jade@ ∗ , r equ i r ed by hel lo@0 . 0 . 19 npm ERR! not ok code 0
10 $
Listing 4.4: npm ls pada aplikasi yang paket-paketnya belum terinstall
Jika sudah terinstall, perintah “npm ls” akan menampilkan struktur dari paket yangtelah terinstall dalam bentuk struktur pohon seperti pada Gambar 4.1.
4.2.3. Menghapus Paket / Uninstall
Menghapus paket pustaka menggunakan npm pada dasarnya hampir sama dengan saatmemasang paket, namun dengan perintah uninstall. Berikut perintah lengkapnya.
1 $ npm un i n s t a l l namapaket2 −−> un i n s t a l l namapaket d i $CWD/node_modules3 atau4 $ npm un i n s t a l l namapaket −g5 −−> un i n s t a l l paket d i d i r g l oba l
Listing 4.5: Perintah menghapus paket di npm
4.2.4. Mencari Paket
Untuk mencari paket, gunakan argumen search dan nama atau bagian dari nama paketyang dicari. Contoh berikut ini akan mencari paket dengan kata kunci ’sha512’ (tampilanberikut merupakan tampilan yang terpotong):
4.2. Menggunakan npm 46
Gambar 4.1.: Tampilan “npm ls” pada direktori proyek dengan paket terinstall lengkap
1 $ npm search sha5122 npm http GET https : // r e g i s t r y . npmjs . org/−/ a l l / s . . .3 npm http 200 https : // r e g i s t r y . npmjs . org/−/ a l l / s . . .4 NAME DESCRIPTION . . .5 j s ha she s A f a s t and independent hashing l i b r a r . . .6 krypto High−l e v e l crypto l i b r a ry , making the . . .7 passhash Eas i l y and s e cu r e l y hash passwords wi . . .8 pwhash Generate password hashes from the com . . .
Listing 4.6: Perintah menghapus paket di npm
Setelah menemukan paketnya, pemrogram bisa menginstall langsung ataupun melihatinformasi lebih lanjut tentang pustakan tersebut.
4.2.5. Menampilkan Informasi Paket
Setelah mengetahui nama paket, pemrogram bisa memperoleh informasi lebih lanjutdalam format JSON menggunakan parameter view. Contoh dibawah ini menampilkanrincian dalam format JSON dari paket arango.client :
1 $ npm view arango . c l i e n t2 npm http GET https : // r e g i s t r y . npmjs . org /arango . c l i e n t3 npm http 200 https : // r e g i s t r y . npmjs . org /arango . c l i e n t45 { name : ’ arango . c l i e n t ’ ,6 d e s c r i p t i o n : ’ArangoDB j a v a s c r i p t c l i e n t ’ ,7 ’ d i s t−tags ’ : { l a t e s t : ’ 0 . 5 . 6 ’ } ,8 v e r s i o n s :9 [ ’ 0 . 3 . 1 ’ ,
4.2. Menggunakan npm 47
10 ’ 0 . 3 . 2 ’ ,11 ’ 0 . 4 . 0 ’ ,12 ’ 0 . 5 . 0 ’ ,13 ’ 0 . 5 . 1 ’ ,14 ’ 0 . 5 . 4 ’ ,15 ’ 0 . 5 . 6 ’ ] ,16 mainta iner s : ’ kaerus <anders@kaerus . com> ’ ,17 time :18 { ’ 0 . 3 . 1 ’ : ’2012−08−09T12 : 0 4 : 3 4 . 5 9 4Z ’ ,19 ’ 0 . 3 . 2 ’ : ’2012−08−09T12 : 4 9 : 0 2 . 3 2 2Z ’ ,20 ’ 0 . 4 . 0 ’ : ’2012−09−17T10 : 4 4 : 4 3 . 1 8 7Z ’ ,21 ’ 0 . 5 . 0 ’ : ’2012−10−01T14 : 5 1 : 3 2 . 6 6 8Z ’ ,22 ’ 0 . 5 . 1 ’ : ’2012−10−03T22 : 1 1 : 5 8 . 3 7 6Z ’ ,23 ’ 0 . 5 . 4 ’ : ’2012−10−16T09 : 4 5 : 3 7 . 4 7 7Z ’ ,24 ’ 0 . 5 . 6 ’ : ’2012−10−26T17 : 3 4 : 2 8 . 4 9 1Z ’ } ,25 author : ’ Kaerus <contact@kaerus . com> ( http :// kaerus . com) ’ ,26 r epo s i t o r y :27 { type : ’ g i t ’ ,28 u r l : ’ g i t : // github . com/kaerus /arango−c l i e n t . g i t ’ } ,29 ve r s i on : ’ 0 . 5 . 6 ’ ,30 keywords :31 [ ’ arangodb ’ ,32 ’ nosql ’ ,33 ’ qunit ’ ,34 ’amd’ ] ,35 c on t r i bu t o r s : ’ anders e l o <anders@kaerus . com> ’ ,36 dependenc ies : { amdefine : ’ >=0.0.2 ’ } ,37 devDependencies : { r e q u i r e j s : ’ >=2.0.6 ’ } ,38 bugs : { u r l : ’ ht tps : // github . com/kaerus /arango−c l i e n t / i s s u e s ’ } ,39 main : ’ index . j s ’ ,40 l i c e n s e : ’MIT’ ,41 d i s t :42 { shasum : ’48279 e7cf9ea0b4b6766f09671224c46d6e716b0 ’ ,43 t a r b a l l : ’ http :// r e g i s t r y . npmjs . org /arango . c l i e n t /−/arango . c l i e n t −0 . 5 . 6 . tgz ’ } ,44 d i r e c t o r i e s : {} }4546 $
Listing 4.7: Menampilkan rincian suatu paket dalam format JSON
4.2.6. Memperbaharui Paket
Jika terdapat versi baru, kita bisa memperbaharui secara otomatis menggunakan argu-men update berikut ini:
1 $ npm update2 −−> update paket d i $CWD/node_modules3 $ npm update −g4 −−> update paket g l oba l
Listing 4.8: Memperbaharui paket
BAB 5
Node.js dan Web: Teknik Pengembangan Aplikasi
5.1. Pendahuluan
Pada saat membangun aplikasi Cloud dengan antarmuka web menggunakan Node.js, adabeberapa teknik pemrograman yang bisa digunakan. Bab ini akan membahas berbagaiteknik tersebut. Untuk mengerjakan beberapa latihan di bab ini, digunakan suatu filedengan format JSON. File pegawai.json berikut ini akan digunakan dalam pembahasanselanjutnya.
1 {2 "pegawai" : [3 {4 "id" : "1" ,5 "nama" : "Zaky" ,6 "alamat" : "Purwomartani"7 } ,8 {9 "id" : "2" ,
10 "nama" : "Ahmad" ,11 "alamat" : "Kalasan"12 } ,13 {14 "id" : "3" ,15 "name" : "Aditya" ,16 "alamat" : "Sleman"17 }18 ]19 }
Listing 5.1: pegawai.json
Jika ingin memeriksa validitas dari data berformat JSON, pemrogram bisa menggu-nakan validator di http://jsonlint.com.
48
5.2. Event-Driven Programming dan EventEmitter 49
5.2. Event-Driven Programming dan EventEmitter
Event-Driven Programming (selanjutnya akan disebut EDP) atau sering juga disebutEvent-Based Programming merupakan teknik pemrograman yang menggunakan eventatau suatu kejadian tertentu sebagai pemicu munculnya suatu aksi serta aliran program.Contoh event misalnya adalah sebagai berikut:
X Menu dipilih.
X Tombol "Submit" di klik.
X Server menerima permintaan dari klien.
Pada dasarnya ada beberapa bagian yang harus disiapkan dari paradigma dan teknikpemrograman ini:
X main loop atau suatu konstruksi utama program yang menunggu dan mengirimkansinyal event.
X definisi dari berbagai event yang mungkin muncul
X definisi event-handler untuk menangani event yang muncul dan dikirimkan olehmain loop
Node.js merupakan peranti pengembangan yang menggunakan teknik pemrograman ini.Pada Node.js, EDP ini semua dikendalikan oleh kelas events.EventEmitter. Jika inginmenggunakan kelas ini, gunakan require(’events’). Dalam terminologi Node.js, jika suatuevent terjadi, maka dikatakan sebagai emits an event, sehingga kelas yang digunakanuntuk menangani itu disebut dengan events.EventEmitter. Pada dasarnya banyak eventyang digunakan oleh berbagai kelas lain di Node.js. Contoh kecil dari penggunaan itudiantaranya adalah net.Server yang meng-emit event "connection", "listening", "close",dan "error".Untuk memahami mekanisme ini, pahami dua kode sumber berikut:
X server.js: mengaktifkan server http (diambil dari manual Node.js)
X server-on-error.js: mencoba mengaktifkan server pada host dan port yang samadengan server.js. Aktivasi ini akan menyebabkan Node.js meng-emit event ’error’karena host dan port sudah digunakan di server.js.
File server.js dijalankan lebih dulu, setelah itu baru menjalankan server-on-error.js.1 var http = r equ i r e ( ’http’ ) ;23 http . c r e a t eS e rv e r ( function ( req , r e s ) {45 r e s . writeHead (200 , {’Content -Type’ : ’text/plain ’ } ) ;6 r e s . end ( ’Hello World\n’ ) ;78 } ) . l i s t e n (1337 , ’127.0.0.1 ’ ) ;9
10 conso l e . l og ( ’Server running at http ://127.0.0.1:1337/ ’ ) ;
Listing 5.2: server.js
5.3. Asynchronous / Non-blocking IO dan Callback 50
1 var net = r equ i r e ( ’net’ ) ;23 var s e r v e r = net . c r e a t eS e rv e r ( function ( sock ) {45 // Event dan event -handler6 // ’data’ => jika ada data yang dikirimkan dari klien7 sock . on ( ’data’ , function ( data ) {8 conso l e . l og ( ’data ’ + sock . remoteAddress + ’: ’ + data ) ;9 } ) ;
1011 // ’close’ => jika koneksi ditutup12 sock . on ( ’close ’ , function ( data ) {13 conso l e . l og ( ’koneksi ditutup ’ ) ;14 } ) ;1516 } ) ;1718 s e r v e r . l i s t e n (1337 , function ( ) {19 conso l e . l og ( ’Server aktif di 127.0.0.1:1337 ’ ) ;20 } ) ;2122 s e r v e r . on ( ’error ’ , function ( e ) {2324 i f ( e . code == ’EADDRINUSE ’ ) {25 conso l e . l og ( ’Error: host dan port sudah digunakan.’ ) ;26 }2728 } ) ;
Listing 5.3: server-on-error.js
5.3. Asynchronous / Non-blocking IO dan Callback
Asynchronous input/output merupakan suatu bentuk pemrosesan masukan/keluaran yangmemungkinkan pemrosesan dilanjutkan tanpa menunggu proses tersebut selesai. Saatpemrosesan masukan/keluaran tersebut selesai, hasil akan diberikan ke suatu fungsi.Fungsi yang menangani hasil pemrosesan saat pemrosesan tersebut selesai disebut call-back (pemanggilan kembali). Jadi, mekanismenya adalah: proses masukan/keluaran -lanjut ke alur berikutnya - panggil kembali fungsi pemroses jika proses masukan/kelu-aran sudah selesai.
1 var f s = r equ i r e ( ’fs’ ) ;2 var sys = r equ i r e ( ’sys’ ) ;34 sys . puts ( ’Mulai baca file’ ) ;5 data = f s . readFi l eSync ( ’./ pegawai.json’ , "utf -8" ) ;6 conso l e . l og ( data ) ;7 sys . puts ( ’Baris setelah membaca file’ ) ;89 // hasil:
10 //Mulai baca file11 //{12 // "pegawai ": [13 // {14 // "id": "1",15 // "nama": "Zaky",
5.3. Asynchronous / Non-blocking IO dan Callback 51
16 // "alamat ": "Purwomartani"17 // },18 // {19 // "id": "2",20 // "nama": "Ahmad",21 // "alamat ": "Kalasan"22 // },23 // {24 // "id": "3",25 // "name": "Aditya",26 // "alamat ": "Sleman"27 // }28 // ]29 //}30 //31 //Baris setelah membaca file
Listing 5.4: Membaca file secara synchronous
1 var f s = r equ i r e ( ’fs’ ) ;2 var sys = r equ i r e ( ’sys’ ) ;34 sys . puts ( ’Mulai baca file’ ) ;5 f s . r e adF i l e ( ’./ pegawai.json’ , "utf -8" , function ( err , data ) {6 i f ( e r r ) throw e r r ;7 conso l e . l og ( data ) ;8 })9 sys . puts ( ’Baris setelah membaca file’ ) ;
1011 // hasil:12 //Mulai baca file13 //Baris setelah membaca file14 //{15 // "pegawai ": [16 // {17 // "id": "1",18 // "nama": "Zaky",19 // "alamat ": "Purwomartani"20 // },21 // {22 // "id": "2",23 // "nama": "Ahmad",24 // "alamat ": "Kalasan"25 // },26 // {27 // "id": "3",28 // "name": "Aditya",29 // "alamat ": "Sleman"30 // }31 // ]32 //}
Listing 5.5: Membaca file secara asynchronous
BAB 6
Mengakses Basis Data NoSQL: mongoDB
6.1. Apa itu Basis Data NoSQL?
Pada awalnya, istilah NoSQL digunakan oleh Carlo Strozzi untuk menyebut nama soft-ware basis data yang dibuat olehnya. Software basis data tersebut tidak mengikutistandar SQL, sehingga dia menyebut software tersebut dengan "NoSQL"1. Setelah itu,istilah NoSQL dipopulerkan oleh Eric Evans untuk menyebut jenis software basis datayang tidak menggunakan standar SQL. Dalam perkembangan berikutnya, NoSQL inilebih diarahkan pada "Not Only SQL" dan digunakan untuk kategorisasi basis datanon-relational (misalnya OODBMS, Graph Database, Document-oriented, dan lain-lain).Meski ada usaha untuk menstandarkan bahasa query untuk NoSQL (UnQL - Unstruc-tured Query Language), sampai saat ini usaha tersebut tidak menghasilkan sesuatu halyang disepakati bersama karena dunia NoSQL memang kompleks sekali. Untuk melihatdaftar dari basis data NoSQL, anda bisa melihat ke http://nosql-databases.org.
6.2. Mengenal mongoDB dan Fitur-fiturnya
mongoDB adalah salah satu software NoSQL yang termasuk dalam kategori DocumentStore / Document-Oriented Database, yaitu data disimpan dalam bentuk dokumen. Su-atu dokumen bisa diibaratkan seperti suatu record dalam basis data relasional dan isidari masing-masing dokumen tersebut bisa berbeda-beda dan ada pula yang sama. Halini berbeda dengan basis data relasional yang menetapkan keseragaman kolom serta tipedata dengan data yang NULL jika tidak terdapat data. mongoDB menyimpan datadalam bentuk dokumen dengan menggunakan format JSON. Berikut adalah fitur darimongoDB:
1http://www.strozzi.it/cgi-bin/CSA/tw7/I/en_US/nosql/Home%20Page
52
6.2. Mengenal mongoDB dan Fitur-fiturnya 53
X menggunakan format JSON dalam penyimpanan data
X mendukung indeks
X mendukung replikasi
X auto-sharding untuk skalabilitas horizontal
X query yang lengkap
X pembaruan data yang cepat
X mendukung Map/Reduce
X mendukung GridFS
6.2.1. Memulai Server
Seperti halnya basis data relasional seperti MySQL, PostgreSQL, dan lain-lain, mongoDBjuga memulai dengan menjalankan server yang memungkinkan server tersebut melayanipermintaan akses data dokumen melalui klien. Untuk memulai server, siapkan direk-tori yang akan menjadi tempat menyimpan data (defaultnya adalah /data/db). Jikamenginginkan lokasi lain, gunakan argumen –dbpath saat menjalankan server sebagaiberikut (buat direktorinya jika belum ada):
1 $ mkdir data2 $ mongod −−r e s t −−dbpath . / data3 Sun May 5 22 : 4 7 : 0 5 . 4 954 Sun May 5 22 : 4 7 : 0 5 . 4 95 warning : 32−b i t s e r v e r s don ’ t have j ou rna l i n g5 enabled by de f au l t . P lease use −−j ou rna l i f you want du r ab i l i t y .6 Sun May 5 22 : 4 7 : 0 5 . 4 957 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] MongoDB s t a r t i n g : pid=29948 port=27017 dbpath=./data 32−b i t host=bpdp−arch9 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ]
10 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] ∗∗ NOTE: This i s a 32 b i t11 MongoDB binary .12 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] ∗∗ 32 b i t bu i l d s are13 l im i t ed to l e s s than 2GB of data ( or l e s s with −−j ou rna l ) .14 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] ∗∗ Note that j ou rna l i n g15 d e f a u l t s to o f f for 32 b i t and i s cu r r en t l y o f f .16 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] ∗∗ See17 http :// dochub . mongodb . org / core /32 b i t18 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ]19 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] db ve r s i on v2 .4.4− pre−20 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] g i t v e r s i on : nog i t v e r s i on21 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] bu i ld i n f o : Linux fyan22 3.8.3−2−ARCH #1 SMP PREEMPT Sun Mar 17 13:04:22 CET 201323 i686 BOOST_LIB_VERSION=1_5324 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] a l l o c a t o r : system25 Sun May 5 22 : 4 7 : 0 5 . 5 81 [ i n i t a n d l i s t e n ] opt ions : { dbpath :26 "./data" , r e s t : true }27 Sun May 5 22 : 4 7 : 0 5 . 7 89 [ F i l eA l l o c a t o r ] a l l o c a t i n g new d a t a f i l e28 . / data/ local . ns , f i l l i n g with z e r o e s . . .29 Sun May 5 22 : 4 7 : 0 5 . 7 90 [ F i l eA l l o c a t o r ] c r e a t i n g d i r e c t o r y30 . / data/_tmp31 Sun May 5 22 : 4 7 : 0 5 . 9 97 [ F i l eA l l o c a t o r ] done a l l o c a t i n g d a t a f i l e32 . / data/ local . ns , s i z e : 16MB, took 0 .088 s e c s
6.2. Mengenal mongoDB dan Fitur-fiturnya 54
33 Sun May 5 22 : 4 7 : 0 5 . 9 98 [ F i l eA l l o c a t o r ] a l l o c a t i n g new d a t a f i l e34 . / data/ local . 0 , f i l l i n g with z e r o e s . . .35 Sun May 5 22 : 4 7 : 0 6 . 0 86 [ F i l eA l l o c a t o r ] done a l l o c a t i n g d a t a f i l e36 . / data/ local . 0 , s i z e : 16MB, took 0 .088 s e c s37 Sun May 5 22 : 4 7 : 0 6 . 0 91 [ i n i t a n d l i s t e n ] command local . $cmd command:38 { c r e a t e : "startup_log" , s i z e : 10485760 , capped : true }39 ntoreturn : 1 keyUpdates : 0 r e s l e n :37 301ms40 Sun May 5 22 : 4 7 : 0 6 . 0 93 [ i n i t a n d l i s t e n ] wa i t ing for connect i ons41 on port 2701742 Sun May 5 22 : 4 7 : 0 6 . 0 93 [ websvr ] admin web conso l e wa i t ing for43 connect i ons on port 28017
Listing 6.1: Menjalankan server MongoDB (mongod)
Untuk mengakhiri server, tekan Ctrl-C, mongoDB akan mengakhiri server sebagaiberikut:
1 ^CSun May 5 22 : 5 2 : 5 2 . 3 44 [ s i gna lProce s s ingThread ] got2 s i g n a l 2 ( In t e r rup t ) , w i l l terminate a f t e r cur r ent cmd ends3 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] now ex i t i n g4 Sun May 5 22 : 5 2 : 5 2 . 3 45 dbex i t :5 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] shutdown :6 going to c l o s e l i s t e n i n g so cke t s . . .7 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] c l o s i n g8 l i s t e n i n g socke t : 79 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] c l o s i n g
10 l i s t e n i n g socke t : 811 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] c l o s i n g12 l i s t e n i n g socke t : 913 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] removing14 socke t f i l e : /tmp/mongodb−27017. sock15 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] shutdown :16 going to f l u s h d i ag l og . . .17 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] shutdown :18 going to c l o s e s o cke t s . . .19 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] shutdown :20 wai t ing for f s p r e a l l o c a t o r . . .21 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] shutdown :22 c l o s i n g a l l f i l e s . . .23 Sun May 5 22 : 5 2 : 5 2 . 3 45 [ s i gna lProce s s ingThread ] c l o s e A l l F i l e s ( )24 f i n i s h e d25 Sun May 5 22 : 5 2 : 5 2 . 3 46 [ s i gna lProce s s ingThread ] shutdown :26 removing f s l o ck . . .27 Sun May 5 22 : 5 2 : 5 2 . 3 46 dbex i t : r e a l l y e x i t i n g now
Listing 6.2: Mengakhiri server MongoDB (mongod)
6.2.2. Klien dan Shell mongoDB
Setelah server hidup, pemrogram bisa menggunakan antarmuka administrasi web maupunmenggunakan shell. Admin web console bisa diakses menggunakan port 28017 sepertipada gambar 6.1. Sementara itu, untuk mengakses server menggunakan shell, bisa digu-nakan perintah mongo sebagai berikut:
1 mongo2 MongoDB s h e l l v e r s i on : 2.4.4− pre−3 connect ing to : test4 Server has s ta r tup warnings :
6.2. Mengenal mongoDB dan Fitur-fiturnya 55
Gambar 6.1.: Admin web console untuk mongoDB
5 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ]6 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ] ∗∗ NOTE: This i s7 a 32 b i t MongoDB binary .8 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ] ∗∗ 32 b i t9 bu i l d s are l im i t ed to l e s s than 2GB of data ( or l e s s
10 with −−j ou rna l ) .11 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ] ∗∗ Note that12 j ou rna l i n g d e f a u l t s to o f f for 32 b i t and i s cu r r en t l y o f f .13 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ] ∗∗ See14 http :// dochub . mongodb . org / core /32 b i t15 Sun May 5 22 : 5 6 : 0 0 . 0 15 [ i n i t a n d l i s t e n ]16 >
Listing 6.3: Shell mongoDB (mongo)
6.2. Mengenal mongoDB dan Fitur-fiturnya 56
6.2.3. Documents dan Collections
Konsep dasar yang harus dipahami dalam mongoDB sebagai document-oriented databaseadalah documents dan collections. Sama halnya dengan basis data relasional, mongoDBmenyimpan data dalam suatu basis data. Di dalam basis data tersebut terdapat col-lections yang bisa diibaratkan seperti tabel dalam basis data relasional. Collectionsdigunakan untuk menyimpan dokumen (documents). Dalam istilah basis data relasional,documents adalah records. Kerjakan latihan berikut untuk memahami pengertian daridocuments dan collections.
1 $ mongo2 MongoDB s h e l l v e r s i on : 2.4.4− pre3 connect ing to : test4 . . .5 . . . [ jgn pedul ikan warning i n i ]6 . . .7 . . .8 > db9 test
10 > use mydb11 switched to db mydb12 > show dbs13 local ( empty )14 > emp1 = { name : "Zaky" , address : "Griya Purwa Asri" }15 { "name" : "Zaky" , "address" : "Griya Purwa Asri" }16 > emp2 = { name : "Ahmad" , address : "Purwomartani" , emai l : "[email protected]" }17 {18 "name" : "Ahmad" ,19 "address" : "Purwomartani" ,20 "email" : "[email protected]"21 }22 > emp3 = { name : "Aditya" , address : "Kalasan" , phone : "08787878787" }23 { "name" : "Aditya" , "address" : "Kalasan" , "phone" : "08787878787" }24 > db . employees . i n s e r t ( emp1 )25 > db . employees . i n s e r t ( emp2 )26 > db . employees . i n s e r t ( emp3 )27 > show dbs28 local ( empty )29 mydb 0.0625GB30 > db31 mydb32 > show c o l l e c t i o n s33 employees34 system . indexes35 > db . employees . f i nd ( )36 { "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) , "name" : "Zaky" , "address" :37 "Griya Purwa Asri" }38 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "name" : "Ahmad" , "address" :39 "Purwomartani" , "email" : "[email protected]" }40 { "_id" : ObjectId ( "50 c74b79a7f83cba11e6b220" ) , "name" : "Aditya" , "address" :41 "Kalasan" , "phone" : "08787878787" }42 > db . employees . f i nd ( {name : "Ahmad"} )43 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "name" : "Ahmad" , "address" :44 "Purwomartani" , "email" : "[email protected]" }45 > db . employees . findOne ( )46 {47 "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) ,48 "name" : "Zaky" ,49 "address" : "Griya Purwa Asri"50 }
6.3. Node.js dan MongoDB 57
51 > db . employees . f i nd ( ) . l im i t (2 )52 { "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) , "name" : "Zaky" , "address" :53 "Griya Purwa Asri" }54 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "name" : "Ahmad" , "address" :55 "Purwomartani" , "email" : "[email protected]" }56 >
Listing 6.4: Sesi dalam shell mongoDB
Basis data mongoDB hanya akan dibuat jika sudah dilakukan perintah untuk meny-isipkan atau mengisikan data documents ke dalam collections seperti perintah di atas.
6.3. Node.js dan MongoDB
6.3.1. Node-gyp
Node-gyp merupakan native add-on build tool, berfungsi untuk membantu proses kom-pilasi modul add-on native di Node.js. Node-gyp merupakan software bebas dan bisadiinstall menggunakan npm:
1 $ npm i n s t a l l −g node−gyp
Listing 6.5: Instalasi node-gyp
Node-gyp ini diinstall pada lokasi global. Pada materi ini, Node-gyp diperlukan untukmembangun driver dari mongoDB sehingga mongoDB bisa diakses oleh Node.js.
6.3.2. Driver Node.js untuk mongoDB
Mengakses mongoDB dari Node.js bisa dilakukan dengan menggunakan driver atauberbagai wrapper serta solusi sejenis ORM Object-Relational Mapping. Salah satu solusiyang tersedia adalah paket mongodb.
1 $ npm i n s t a l l mongodb2 npm http GET https : // r e g i s t r y . npmjs . org /mongodb3 npm http 200 https : // r e g i s t r y . npmjs . org /mongodb4 npm http GET https : // r e g i s t r y . npmjs . org /mongodb/−/mongodb−1 . 3 . 0 . tgz5 npm http 200 https : // r e g i s t r y . npmjs . org /mongodb/−/mongodb−1 . 3 . 0 . tgz6 npm http GET https : // r e g i s t r y . npmjs . org / kerbero s7 npm http GET https : // r e g i s t r y . npmjs . org /bson /0 . 1 . 88 npm http 200 https : // r e g i s t r y . npmjs . org / kerberos9 npm http GET https : // r e g i s t r y . npmjs . org / kerbero s/−/kerberos −0 . 0 . 2 . tgz
10 npm http 200 https : // r e g i s t r y . npmjs . org /bson /0 . 1 . 811 npm http GET https : // r e g i s t r y . npmjs . org /bson/−/bson −0 . 1 . 8 . tgz12 npm http 200 https : // r e g i s t r y . npmjs . org / kerberos/−/kerberos −0 . 0 . 2 . tgz13 npm http 200 https : // r e g i s t r y . npmjs . org /bson/−/bson −0 . 1 . 8 . tgz1415 > kerberos@0 . 0 . 2 i n s t a l l /home/bpdp/ ker jaan / g i t−repos /buku−cloud−node j s /16 s r c /bab−06/node_modules/mongodb/node_modules/ ke rbero s17 > ( node−gyp r ebu i l d 2> bu i l d e r r o r . l og ) | | ( exit 0)181920 > bson@0 . 1 . 8 i n s t a l l /home/bpdp/ ker jaan / g i t−repos /buku−cloud−node j s / s r c /21 bab−06/node_modules/mongodb/node_modules/bson22 > ( node−gyp r ebu i l d 2> bu i l d e r r o r . l og ) | | ( exit 0)23
6.3. Node.js dan MongoDB 58
24 mongodb@1 . 3 . 0 node_modules/mongodb25 +−− bson@0 . 1 . 826 +−− kerberos@0 . 0 . 227 $
Listing 6.6: Instalasi driver mongoDB
Solusi lain yang bisa digunakan antara lain adalah:
X Mongoose (http://mongoosejs.com/)
X Mongojs (https://github.com/gett/mongojs)
X Mongolia (https://github.com/masylum/mongolia)
X Mongoskin (https://github.com/kissjs/node-mongoskin)
6.3.3. Mengakses mongoDB dari Node.js
Dengan menggunakan collections dan documents di atas, kita akan mengakses data terse-but menggunakan Node.js. Untuk lebih menyederhanakan, kita akan menggunakan wrap-per dari mongoDB native driver, yaitu Mongojs. Install Mongojs lebih dahulu menggu-nakan npm:
1 $ npm i n s t a l l mongojs2 npm http GET https : // r e g i s t r y . npmjs . org /mongojs3 npm http 200 https : // r e g i s t r y . npmjs . org /mongojs4 npm http GET https : // r e g i s t r y . npmjs . org /mongojs/−/mongojs −0 . 7 . 4 . tgz5 npm http 200 https : // r e g i s t r y . npmjs . org /mongojs/−/mongojs −0 . 7 . 4 . tgz6 npm http GET https : // r e g i s t r y . npmjs . org / readable−stream7 npm http GET https : // r e g i s t r y . npmjs . org /thunky8 npm http 200 https : // r e g i s t r y . npmjs . org / readable−stream9 npm http 200 https : // r e g i s t r y . npmjs . org /thunky
10 mongojs@0 . 7 . 4 node_modules/mongojs11 +−− thunky@0 . 1 . 012 +−− readable−stream@1 . 0 . 213 $
Listing 6.7: Instalasi wrapper mongojs
Setelah itu, buat program sesuai dengan listing program berikut.1 var databaseUrl = "localhost/mydb" ;2 var c o l l e c t i o n s = [ "employees" ] ;3 var db = r equ i r e ( "mongojs" ) . connect ( databaseUrl , c o l l e c t i o n s ) ;45 // mencari pegawai bernama Aditya6 db . employees . f i nd ({name : "Aditya" } , function ( err , employees ) {7 i f ( e r r | | ! employees ) con so l e . l og ( "Tidak ada pegawai dengan nama Aditya" ) ;8 else employees . forEach ( function ( emps ) {9 conso l e . l og ( emps ) ;
10 } ) ;11 } ) ;1213 // menyimpan data pegawai baru : Bambang14 db . employees . save ({name : "Bambang" , address : "Yogyakarta" , password : "ealhadalah" ,15 sex : "male" } , function ( err , saved ) {16 i f ( e r r | | ! saved ) conso l e . l og ( "Pegawai ’Bambang ’ gagal disimpan" ) ;
6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 59
17 else conso l e . l og ( "Data pegawai ’Bambang ’ tersimpan" ) ;18 } ) ;1920 // mengupdate data pegawai : Ahmad21 db . employees . update ({name : "Ahmad" } , { $ s e t : { address : "Finlandia" }} ,22 function ( err , updated ) {23 i f ( e r r | | ! updated ) conso l e . l og ( "Data ’Ahmad ’ gagal diperbaharui" ) ;24 else conso l e . l og ( "Data ’Ahmad ’ berhasil diperbaharui" ) ;25 } ) ;2627 // Has i l :28 //{ _id : 50 c74b79a7f83cba11e6b220 ,29 // name : ’ Aditya ’ ,30 // address : ’ Kalasan ’ ,31 // phone : ’08787878787 ’ }32 //Data pegawai ’Bambang ’ ters impan33 //Data ’Ahmad’ b e r h a s i l d ipe rbaharu i34 //35 // Has i l d i db :36 //> db . employees . f i nd ( )37 //{ "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e" ) , "name" :38 //"Zaky" , "address" : "Griya Purwa Asri" }39 //{ "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f" ) , "address" :40 //"Finlandia" , "email" : "[email protected]" , "name" : "Ahmad" }41 //{ "_id" : ObjectId ( "50 c74b79a7f83cba11e6b220" ) , "name" :42 //"Aditya" , "address" : "Kalasan" , "phone" : "08787878787" }43 //{ "name" : "Bambang" , "address" : "Yogyakarta" , "password" :44 //"ealhadalah" , "sex" : "male" , "_id" :45 // ObjectId ( "50 c75d43c111384846000001" ) }46 //>47 //
Listing 6.8: Mengakses mongoDB dari Node.js
6.4. Aplikasi Web Menggunakan Node.js dan mongoDB
Contoh aplikasi web berikut hanya digunakan untuk mengambil data dari mongoDBkemudian menampilkannya di web. Data diambil dari basis data mongoDB yang sudahdibuat sebelumnya (mydb). Untuk keperluan ini, kita akan menggunakan frameworkExpress (http://expressjs.com). Install Express di level global dengan npm install -gexpress. Setelah terinstall, buat subdirektori baru (lokasi bebas) yang akan digunakanuntuk menyimpan aplikasi web. Setelah itu, masuk ke direktori tersebut kemudian buatkerangka aplikasi di subdirektori tersebut menggunakan perintah “express” (lihat bab 1).Berikut ini adalah beberapa perubahan yang dilakukan untuk rerangka aplikasi yang
dihasilkan dari perintah express tersebut.12 /**3 * Module dependencies.4 */56 var expre s s = r equ i r e ( ’express ’ )7 , r oute s = r equ i r e ( ’./ routes ’ )8 , user = r equ i r e ( ’./ routes/employee ’ )9 , http = r equ i r e ( ’http’ )
10 , path = r equ i r e ( ’path’ ) ;
6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 60
1112 var app = expre s s ( ) ;1314 // all environments15 app . s e t ( ’port’ , p ro c e s s . env .PORT | | 3000 ) ;16 app . s e t ( ’views’ , __dirname + ’/views ’ ) ;17 app . s e t ( ’view engine ’ , ’jade’ ) ;18 app . use ( expre s s . f av i con ( ) ) ;19 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;20 app . use ( expre s s . bodyParser ( ) ) ;21 app . use ( expre s s . methodOverride ( ) ) ;22 app . use ( app . rou te r ) ;23 app . use ( expre s s . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;2425 // development only26 i f ( ’development ’ == app . get ( ’env’ ) ) {27 app . use ( expre s s . e r rorHandle r ( ) ) ;28 }2930 app . get ( ’/’ , r ou t e s . index ) ;31 app . get ( ’/employees ’ , employee . l i s t ) ;3233 http . c r e a t eS e rv e r ( app ) . l i s t e n ( app . get ( ’port’ ) , function ( ){34 conso l e . l og ( ’Express server listening on port ’ + app . get ( ’port’ ) ) ;35 } ) ;
Listing 6.9: Express+MongoDB web: app.js
1 {2 "name" : "show -employees" ,3 "version" : "0.0.1" ,4 "private" : true ,5 "scripts" : {6 "start" : "node app.js"7 } ,8 "dependencies" : {9 "express" : "3.2.2" ,
10 "jade" : "*" ,11 "mongojs" : "latest"12 }13 }
Listing 6.10: Express+MongoDB web: package.json
12 /*3 * GET home page.4 */56 export s . index = function ( req , r e s ){7 r e s . render ( ’index’ , { t i t l e : ’Contoh Express+mongoDB ’ } ) ;8 } ;
Listing 6.11: Express+MonggoDB web: routes/index.js
Selain itu, ada beberapa tambahan file (routes/employee.js dan views/employee.jade),penghapusan file (routes/user.js), dan perubahan yang cukup signifikan pada file views/in-dex.jade.
1 i /*
6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 61
2 * GET employees listing.3 */45 var databaseUrl = "localhost/mydb" ;6 var c o l l e c t i o n s = [ "employees" ] ;7 var db = r equ i r e ( "mongojs" ) . connect ( databaseUrl , c o l l e c t i o n s ) ;89 export s . l i s t = function ( req , r e s ){
1011 // mencari dan menampilkan semua pegawai12 db . employees . f i nd ( function ( err , employees ) {13 r e s . render ( ’employee ’ , { l i s tOfEmployee : employees , t i t l e : ’Daftar pegawai ’ } ) ;14 } ) ;1516 } ;
Listing 6.12: Express+MongoDB web: routes/employee.js
1 extends layout23 block content4 h1= t i t l e5 p #{ t i t l e }67 each employee in l i s tOfEmployee8 p #{employee . name}
Listing 6.13: Express+MongoDB web: views/employee.jade
1 extends layout23 block content4 h1= t i t l e5 p6 | Selamat datang d i #{ t i t l e } . Ap l i ka s i i n i hanya sekedar contoh7 a p l i k a s i web dengan mongoDB sebaga i backend . Untuk saat i n i hanya8 t e r s e d i a f a s i l i t a s untuk mel ihat9 a ( h r e f="/employees" ) da f t a r pegawai .
Listing 6.14: views/index.jade
BAB 7
Pola Arsitektur Aplikasi Web: MVC dan ExpressJS
7.1. Apa itu Pola Arsitektur?
Pola arsitektur (architectural pattern) adalah konsep dan standar arsitektur yang mem-bentuk suatu aplikasi. Pola disini mengacu pada best practices atau praktik-praktikterbaik yang terutama terkait dengan arsitektur dari software aplikasi. Pola arsitekturterdiri atas elemen-elemen software, properti dari elemen-elemen tersebut, serta hubun-gan antar elemen-elemen tersebut.
7.2. Pola Arsitektur MVC
MVC (Model-View-Controller) merupakan pola arsitektur aplikasi Web yang memisahkanaplikasi Web menjadi 3 komponen:
X Model: basis data
X View: tampilan antarmuka aplikasi Web, biasanya berisi semacam template danisi-isi dinamis dari tampilan antarmuka tersebut.
X Controller: menerima requests atau permintaan dari browser kemudian mengarahkanke event-handler untuk diproses. Proses tersebut bisa saja berupa langsung meng-hasilkan view (X)HTML atau format lainnya, atau bisa juga diproses terlebihdahulu di model dan kemudian hasilnya akan dikirimkan ke view untuk diisikanke isi-isi dinamis serta membentuk file (X)HTML untuk ditampilkan di browser(sebenarnya tidak selalu perlu harus (X)HTML).
Jika digambarkan dalam suatu diagram, pola arsitektur MVC ditampilkan pada gam-bar 7.1Pola ini dikenal juga dengan istilah Model 2 dan dipopulerkan oleh JavaEE.
62
7.2. Pola Arsitektur MVC 63
Gambar 7.1.: Pola arsitektur MVC
7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 64
7.3. Implementasi Pola Arsitektur MVC MenggunakanExpressJS
Sebenarnya ExpressJS bukan merupakan framework MVC, meskipun demikian karenaframework ini sangat fleksibel, maka pemrogram bisa mengatur sendiri lokasi dari file /direktori serta berbagai konfigurasi lainnya. Contoh implementasi disini adalah aplikasisederhana untuk menampilkan data yang tersimpan dalam basis data mongoDB ke dalamformat JSON yang bisa diakses dari browser.
7.3.1. Struktur Aplikasi
Setelah membuat kerangka aplikasi menggunakan ExpressJS, ada beberapa perubahanyang harus dilakukan. Perubahan ini terutama dilakukan untuk mengikuti pola ar-sitektur MVC (terutama peletakan file dan direktori). Pola asli dari kerangka aplikasiExpressJS adalah sebagai berikut:
1 $ t r e e .2 .3 |−− app . j s4 |−− package . j son5 |−− pub l i c6 | |−− images7 | |−− j a v a s c r i p t s8 | ‘−− s t y l e s h e e t s9 | ‘−− s t y l e . c s s
10 |−− route s11 | |−− index . j s12 | ‘−− user . j s13 ‘−− views14 |−− index . jade15 ‘−− l ayout . jade1617 6 d i r e c t o r i e s , 7 f i l e s18 $
Listing 7.1: Struktur direktori asli aplikasi ExpressJS
Struktur direktori tersebut akan diubah sesuai dengan pola MVC:1 $ t r e e .2 .3 +−− app . j s4 |−− c o n t r o l l e r s5 | +−− index . j s6 | +−− user . j s7 |−− models8 | +−− db . j s9 |−− package . j son
10 |−− pub l i c11 | +−− images12 | |−− j a v a s c r i p t s13 | +−− s t y l e s h e e t s14 | +−− s t y l e . c s s15 +−− views16 +−− index . jade17 +−− l ayout . jade18
7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 65
19 7 d i r e c t o r i e s , 8 f i l e s20 $
Listing 7.2: Struktur direktori ExpressJS sesuai pola MVC
Beberapa perubahan terhadap struktur direktori:
X direktori routes diubah menjadi controllers
X membuat direktori models untuk mendefinisikan skema basis data
7.3.2. File-file yang Diperlukan
Beberapa file diubah isinya dan ada juga file yang baru.12 /**3 * Module dependencies.4 */56 var expre s s = r equ i r e ( ’express ’ )7 , r oute s = r equ i r e ( ’./ controllers ’ )8 , user = r equ i r e ( ’./ controllers/user’ )9 , http = r equ i r e ( ’http’ )
10 , path = r equ i r e ( ’path’ ) ;1112 var mongoose = r equ i r e ( ’mongoose ’ ) ;1314 var app = expre s s ( ) ;1516 // all environments17 app . s e t ( ’port’ , p ro c e s s . env .PORT | | 3000 ) ;18 app . s e t ( ’views’ , __dirname + ’/views ’ ) ;19 app . s e t ( ’view engine ’ , ’jade’ ) ;20 app . use ( expre s s . f av i con ( ) ) ;21 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;22 app . use ( expre s s . bodyParser ( ) ) ;23 app . use ( expre s s . methodOverride ( ) ) ;24 app . use ( app . rou te r ) ;25 app . use ( expre s s . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;2627 // development only28 i f ( ’development ’ == app . get ( ’env’ ) ) {29 app . use ( expre s s . e r rorHandle r ( ) ) ;30 }3132 app . get ( ’/’ , c o n t r o l l e r s . index ) ;33 app . get ( ’/users ’ , u se r . l i s t ) ;3435 http . c r e a t eS e rv e r ( app ) . l i s t e n ( app . get ( ’port’ ) , function ( ){36 conso l e . l og ( ’Express server listening on port ’ + app . get ( ’port’ ) ) ;37 } ) ;
Listing 7.3: app.js
1 /*2 * GET employees listing.3 */45 var Employee = r equ i r e ( ’../ models/db.js’ ) ;
7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya 66
67 export s . l i s t = function ( req , r e s ){8 Employee . f i nd ( function ( err , employees ) {9 r e s . send ( employees ) ;
10 } ) ;11 } ;
Listing 7.4: controllers/user.js
1 var mongoose = r equ i r e ( ’mongoose ’ )2 , Schema = mongoose . Schema ;34 var employeeSchema = new Schema({5 name : Str ing ,6 address : Str ing ,7 phone : Str ing ,8 emai l : S t r ing9 } ) ;
1011 module . export s = mongoose . model ( ’Employee ’ , employeeSchema ) ;
Listing 7.5: models/db.js
1 {2 "name" : "express -mvc" ,3 "version" : "0.0.1" ,4 "private" : true ,5 "scripts" : {6 "start" : "node app.js"7 } ,8 "dependencies" : {9 "express" : "latest" ,
10 "jade" : "*" ,11 "mongoose" : "latest"12 }13 }
Listing 7.6: package.json
7.3.3. Hasil
Setelah server dieksekusi (menggunakan perintah node app.js), maka hasilnya akan bisadiakses di http://localhost:3000/users. Hasil di browser bisa dilihat di gambar 7.2
7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya
MVC bukan satu-satu pola arsitektur aplikasi Web. Berikut ini adalah beberapa daftarpola arsitektur aplikasi Web serta implementasinya di Node.js dan/atau JavaScript disisi klien:
X MVP (Model-View-Presenter): Google GWT.
X MVVM (Model-View-ViewModel): Batman.js (http://batmanjs.org) dan Knock-out.js (http://knockoutjs.com)
7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya 67
Gambar 7.2.: Pola arsitektur MVC
X RVP (Resource-View-Presenter): Flatiron (http://flatironjs.org)
X MVA (Model-View-Adapter).
X Hierarchical MVC
X Presentation-Abstract-Control.
BAB 8
Real-time Web Menggunakan Socket.io
8.1. Apa itu Real-time Web?
Real-time Web menunjukkan suatu pola interaksi aplikasi Web yang memungkinkan ke-dua sisi saling mengirimkan data saat terjadi perubahan, jadi tidak seperti pola interaksiyang menghendaki pemakai untuk me-refresh browser jika menginginkan data / infor-masi / update terbaru dari sisi server. Contoh dari real-time Web adalah Facebook danTwitter. Pemakai akan mendapatkan update secara langsung saat terjadi perubahan (ko-mentar baru, pesan masuk, permintaan pertemanan, retweet, dan lain-lain), tanpa perlume-refresh halaman.
8.2. Teknologi Pendukung Real-time Web
Real-time Web merupakan hal yang relatif kompleks. Terdapat beberapa teknologi yangbisa digunakan untuk mewujudkan real-time Web tersebut. Beberapa diantaranya meru-pakan standar (atau akan menjadi standar), sedangkan lainnya bukan merupakan stan-dar.
8.2.1. Ajax Technology
Teknologi Ajax (kadang juga ditulis AJAX, singkatan dari Asynchronous JavaScriptand XML adalah sekumpulan teknologi yang pertama kali dicetuskan oleh Jesse JamesGarrett. Ajax memungkinkan browser untuk mengirim data dan mengambil data dariserver secara asynchronous (di latar belakang) tanpa mengganggu keseluruhan tampilanhalaman Web. Kumpulan teknologi yang digunakan adalah:
X (X)HTML dan CSS untuk presentasi halaman Web
68
8.2. Teknologi Pendukung Real-time Web 69
X DOM (Document Object Model) untuk menampilkan data secara dinamis
X XML dan XSLT untuk pertukaran data (seringkali tidak menggunakan XML tetapiJSON).
X Obyek XMLHttpRequest untuk komunikasi asynchronous
X JavaScript
8.2.2. Comet dan Push Technology
Comet merupakan istilah payung yang merangkum berbagai teknologi push, yaitu teknologiyang memungkinkan server untuk mengirimkan data ke browser tanpa diminta olehbrowser.
SSE (Server-Sent Events)
SSE merupakan bagian dari spesifikasi standar HTML5 (bisa diakses di http://dev.w3.org/html5/eventsource/. Spesifikasi ini memungkinkan server untuk mem-push data kehalaman Web menggunakan protokol HTTP. Meski masih dalam pengembangan, tetapibeberapa browser sudah mendukung (misalnya Google Chrome / Chromium) serta Safari.Beberapa peranti pengembangan di sisi server juga sudah mendukung spesifikasi ini.Pada Node.js, pemrogram bisa menggunakan paket sse, nsse, atau EventSource.
Bayeux Protocol
Protokol ini dikembangkan oleh the Dojo Foundation yang mengembangkan softwareDojo Toolkit. Protokol ini digunakan sebagai transport untuk pesan-pesan asynchronousmelalui HTTP dengan latensi yang rendah antara klien dengan server. Pesan-pesantersebut di-rute-kan melalui channel-channel yang diberi nama dan bisa dikirimkan ke:
X server ke klien
X klien ke server
X klien ke klien (melalui server)
Spesifikasi lengkap dari protokol ini bisa dilihat di http://svn.cometd.com/trunk/bayeux/bayeux.html.
BOSH Protocol
BOSH (Bidirectional-streams Over Synchronous HTTP) adalah protokol transport yangmengemulasi stream dua arah antara dua entitas (misalnya antara klien dengan server)dengan menggunakan banyak HTTP req/resp yang synchronous tanpa memerlukan pollingyang sering atau respon yang terpotong-potong. Spesifikasi ini dikembangkan oleh ko-munitas serta yayasan XMPP dan bisa dilihat secara lengkap di http://xmpp.org/extensions/xep-0124.html
8.3. Socket.io 70
8.2.3. WebSocket
WebSocket merupakan teknologi Web yang menyediakan saluran komunikasi full du-plex pada satu koneksi TCP. Protokol WebSocket distandarkan oleh IETF di RFC 6455sedangkap API (Application Programming Interface) dikembangkan dan distandarkanoleh W3C sebagai bagian dari HTML5. Komunikasi antara klien dengan server dilak-sanakan menggunakan TCP dengan nomor port 80.WebSocket diimplementasikan di sisi server dan klien dan memungkinkan adanya in-
teraksi yang lebih real-time daripada teknologi push karena protokol dan API ini di-implementasikan dan bisa digunakan di sisi klien maupun server. Browser yang sudahmendukung protokol dan API WebSocket ini adalah Chrome, Firefox, Safari, Opera, danInternet Explorer.Perkembangan dari WebSocket bisa dilihat dan diikuti di http://www.websocket.
org/
8.3. Socket.io
8.3.1. Apa itu Socket.io?
Socket.io adalah pustaka JavaScript yang merupakan implementasi dari protokol Web-Socket serta berbagai improvisasi lain yang diperlukan untuk real-time web (heartbeats,timeouts, dan disconnection). Protokol transport yang didukung adalah sebagai berikut:
X WebSocket
X Adobe Flash Socket
X AJAX long polling
X AJAX multipart streaming
X Forever Iframe
X JSONP Polling
Pustaka ini terdiri atas pustaka untuk sisi klien (browser) dan server (menggunakanNode.js). Browser yang didukung adalah:
X Internet Explorer 5.5+ (desktop)
X Safari 3+ (desktop)
X Google Chrome 4+ (desktop)
X Firefox 3+ (desktop)
X Opera 10.61+ (desktop)
X iPhone Safari (mobile)
8.3. Socket.io 71
X iPad Safari (mobile)
X Android WebKit (mobile)
X WebOs WebKit (mobile)
8.3.2. Menggunakan Socket.io untuk Real-time Web
Socket.io melibatkan sisi klien dan sisi server. Pada sisi server, paket yang diperlukanadalah cocket.io, sementara untuk sisi klien (browser), diperlukan socket.io-client. Paketsocket.io-client tidak diperlukan langsung pada sisi node_modules, tetapi ada beberapafile yang harus ditempatkan pada akses publik dengan maksud supaya bisa digunakanoleh browser.
Tentang Aplikasi
Aplikasi ini hanya merupakan contoh kecil dari real-time Web. Aplikasi terdiri atas sisiserver dan klien/browser. Pada sisi server, aplikasi ini akan mengirimkan data ke browser(push). Sementara itu, browser akan menerima hasil push tersebut dan menampilkannyakemudian mengirimkan data ke server tanpa perlu melakukan proses refresh. Serverhanya akan menampilkan data yang dikirimkan browser.
Membuat Kerangka Aplikasi dengan ExpressJS
Untuk membuat aplikasi ini, kita akan menggunakan ExpressJS dan Socket.io. Padaawalnya, kita akan membuat kerangka aplikasi menggunakan express (jika ExpressJSbelum terinstall, install dengan menggunakan npm install -g express. Jika sudah terin-stall, buat direktori baru, kemudian buatlah kerangka aplikasi menggunakan express padadirektori tersebut: “express<Enter>”.Pada pembahasan berikutnya, kita akan mengadakan berbagai perubahan yang diper-
lukan.
Instalasi Paket yang Diperlukan
File package.json berisi beberapa informasi tentang aplikasi ini serta beberapa paketyang diperlukan. Isi dari file ini adalah sebagai berikut:
1 {2 "name" : "socket.io -expressjs" ,3 "version" : "0.0.1" ,4 "author" : "Bambang Purnomosidi D. P." ,5 "private" : true ,6 "scripts" : {7 "start" : "node app"8 } ,9 "dependencies" : {
10 "express" : "latest" ,11 "jade" : "*" ,12 "socket.io" : "latest" ,13 "socket.io-client" : "latest"
8.3. Socket.io 72
14 }15 }
Listing 8.1: package.json
Setelah itu. install paket-paket tersebut dengan menggunakan perintah npm install didirektori tersebut.
Konfigurasi JavaScript untuk Browser
Browser juga memerlukan pustaka untuk Socket.io yang diperoleh dari paket socket.io-client. Pada paket tersebut, terdapat direktori dist :
1 $ l s −l a node_modules/ socke t . io−c l i e n t / d i s t /2 t o t a l 4963 drwxr−xr−x 2 bpdp bpdp 4096 May 6 00 :00 .4 drwxr−xr−x 7 bpdp bpdp 4096 May 6 00 :01 . .5 −rw−r−−r−− 1 bpdp bpdp 101222 Nov 2 2012 socket . i o . j s6 −rw−r−−r−− 1 bpdp bpdp 44789 Nov 2 2012 socket . i o . min . j s7 −rw−r−−r−− 1 bpdp bpdp 175953 Mar 28 2012 WebSocketMainInsecure . swf8 −rw−r−−r−− 1 bpdp bpdp 175830 Mar 28 2012 WebSocketMain . swf9 $
Listing 8.2: Isi direktori dist di socket.io-client
Copy-kan file-file tersebut ke direktori public/javascripts.
Hapus File yang Tidak Diperlukan
Ada beberapa file yang tidak diperlukan dan harus dihapus:
X routes/user.js
Ubah File-file Tertentu
Beberapa file akan diedit. Beberapa diantaranya akan diuraikan di bagian ini.12 /**3 * Module dependencies.4 */56 var expre s s = r equ i r e ( ’express ’ )7 , app = expre s s ( )8 , r oute s = r equ i r e ( ’./ routes ’ )9 , http = r equ i r e ( ’http’ )
10 , path = r equ i r e ( ’path’ )11 , s e r v e r = http . c r e a t eS e rv e r ( app )12 , i o = r equ i r e ( ’socket.io’ ) . l i s t e n ( s e r v e r ) ;1314 s e r v e r . l i s t e n ( 8 0 ) ;1516 // all environments17 app . s e t ( ’views’ , __dirname + ’/views ’ ) ;18 app . s e t ( ’view engine ’ , ’jade’ ) ;19 app . use ( expre s s . f av i con ( ) ) ;20 app . use ( expre s s . l o gg e r ( ’dev’ ) ) ;
8.3. Socket.io 73
21 app . use ( expre s s . bodyParser ( ) ) ;22 app . use ( expre s s . methodOverride ( ) ) ;23 app . use ( app . rou te r ) ;24 app . use ( expre s s . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;2526 app . get ( ’/’ , r ou t e s . index ) ;2728 i o . s o cke t s . on ( ’connection ’ , function ( socke t ) {29 socket . emit ( ’kirim ke browser ’ , {30 ka l imatDar iServer : ’Kalimat ini dikirim dari server ’ } ) ;31 socket . on ( ’dari browser ’ , function ( data ) {32 conso l e . l og ( data . kal imatDariBrowser ) ;33 } ) ;34 } ) ;
Listing 8.3: app.js
1 extends layout23 block content4 h1= t i t l e5 p #{ t i t l e }6 s c r i p t ( s r c="/javascripts/socket.io.js" )7 s c r i p t8 var socke t = io . connect ( ’ http :// l o c a l ho s t ’ ) ;9 socke t . on ( ’ k i r im ke browser ’ , f unc t i on ( data ) {
10 document . getElementById ( "container" ) . innerHTML=11 "<p>" + data . ka l imatDar iServer + "</p>" ;12 socke t . emit ( ’ da r i browser ’ , {13 kal imatDariBrowser : ’ Kalimat i n i d ik i r im dar i browser ’ } ) ;14 } ) ;15 #conta ine r16 p #{ t i t l e }
Listing 8.4: views/index.jade
1 /∗2 ∗ GET home page .3 ∗/45 export s . index = func t i on ( req , r e s ){6 r e s . render ( ’ index ’ , { t i t l e : ’ Contoh Socket . i o + Express ’ } ) ;7 } ;
Listing 8.5: routes/index.js
Menjalankan Server Socket.io
Server socket.io menggunakan port 80 sehingga harus dijalankan oleh root.1 i n f o − socke t . i o s t a r t ed2 GET / 200 141ms − 628b3 GET / s t y l e s h e e t s / s t y l e . c s s 304 3ms4 GET / j a v a s c r i p t s / socke t . i o . j s 200 9ms − 98 .85 kb5 debug − c l i e n t author i zed6 i n f o − handshake author i zed LOoIlHJJjOl1g34JtLnP7 debug − s e t t i n g r eque s t GET / socket . i o /1/ websocket /LOoIlHJJjOl1g34JtLnP8 debug − set heartbeat i n t e r v a l for c l i e n t LOoIlHJJjOl1g34JtLnP9 debug − c l i e n t author i zed for
8.3. Socket.io 74
10 debug − websocket wr i t i ng 1 : :11 debug − websocket wr i t i ng 5 : : : { "name" : "kirim ke browser" , "args" :12 [ { "kalimatDariServer" : "Kalimat ini dikirim dari server" } ]}13 Kalimat i n i d ik i r im dar i browser14 GET / 200 4ms − 628b15 i n f o − t r anspo r t end ( socke t end )16 debug − set c l o s e timeout for c l i e n t LOoIlHJJjOl1g34JtLnP17 debug − c l e a r ed c l o s e timeout for c l i e n t LOoIlHJJjOl1g34JtLnP18 debug − c l e a r ed heartbeat i n t e r v a l for c l i e n t LOoIlHJJjOl1g34JtLnP19 debug − d i s c a rd i ng t ranspo r t20 GET / s t y l e s h e e t s / s t y l e . c s s 304 1ms21 GET / j a v a s c r i p t s / socke t . i o . j s 304 1ms22 debug − c l i e n t author i zed23 i n f o − handshake author i zed ijvgksAoa−BWm7uytLnQ24 debug − s e t t i n g r eque s t GET / socket . i o /1/ websocket / i jvgksAoa−BWm7uytLnQ25 debug − set heartbeat i n t e r v a l for c l i e n t i jvgksAoa−BWm7uytLnQ26 debug − c l i e n t author i zed for27 debug − websocket wr i t i ng 1 : :28 debug − websocket wr i t i ng 5 : : : { "name" : "kirim ke browser" , "args" :29 [ { "kalimatDariServer" : "Kalimat ini dikirim dari server" } ]}30 Kalimat i n i d ik i r im dar i browser31 debug − emit t ing heartbeat for c l i e n t i jvgksAoa−BWm7uytLnQ32 debug − websocket wr i t i ng 2 : :33 debug − set heartbeat timeout for c l i e n t i jvgksAoa−BWm7uytLnQ34 debug − got heartbeat packet35 debug − c l e a r ed heartbeat timeout for c l i e n t i jvgksAoa−BWm7uytLnQ36 debug − set heartbeat i n t e r v a l for c l i e n t i jvgksAoa−BWm7uytLnQ
Listing 8.6: Menjalankan server Socket.io
Keluaran pada sisi server tersebut merupakan keluaran yang sudah termasuk aksesdari browser. Setelah server dijalankan, buka browser kemudian akses URL http://localhost. Setelah diakses melalui browser, server akan mengirimkan kode sumberHTML sebagai berikut:
1 <!DOCTYPE html>2 <html>3 <head>4 <t i t l e>Contoh Socket . i o + Express</ t i t l e>5 <l ink rel="stylesheet" href="/stylesheets/style.css">6 </head>7 <body>8 <h1>Contoh Socket . i o + Express</h1>9 <p>Contoh Socket . i o + Express</p>
10 <script src="/javascripts/socket.io.js"></ script>11 <script>12 var socke t = io . connect ( ’ http :// l o c a l ho s t ’ ) ;13 socke t . on ( ’ k i r im ke browser ’ , f unc t i on ( data ) {14 document . getElementById ( "container" ) . innerHTML=15 "<p>" + data . ka l imatDar iServer + "</p>" ;16 socke t . emit ( ’ da r i browser ’ , {17 kal imatDariBrowser : ’ Kalimat i n i d ik i r im dar i browser ’ } ) ;18 } ) ;19 </ script>20 <div id="container">21 <p>Contoh Socket . i o + Express</p>22 </div>23 </body>24 </html>
Listing 8.7: Kode sumber di browser
8.3. Socket.io 75
Gambar 8.1.: Hasil di browser dari ExpressJS + Socket.io
Tampilan di browser bisa dilihat pada gambar 8.1Contoh pada materi ini merupakan contoh sederhana, tetapi diharapkan bisa dengan
mudah dipahami untuk membuat aplikasi Web real-time.
Daftar Pustaka
[1] Anonim, Mozilla Developer Network - JavaScript, https://developer.mozilla.org/en-US/docs/JavaScript.
[2] Cody Lindley, JavaScript Enlightenment, http://javascriptenlightenment.com,2012.
[3] David Flanagan, JavaScript: The Definitive Guide, 4th Edition, O’Reilly, 2001.
[4] Don Nguyen, Jump Start Node.js, SitePoint, 2012.
[5] Douglas Crockford, JavaScript: The Good Parts, O’Reilly, 2008.
[6] Marijn Haverbeke, Eloquent JavaScript: A Modern Introduction to Programming,No Starch Press, 2011.
[7] Shelley Powers, Learning Node, O’Reilly, 2012.
[8] Tom Hughes-Croucher, Mike Wilson, Node: Up and Running, O’Reilly, 2012.
76
Lampiran
77
LAMPIRAN A
Gaya Penulisan Kode / Coding Style
A.1. Tentang Gaya Penulisan Kode
Pada saat seseorang berada pada proses pembuatan kode sumber (coding), apapun gayapenulisan programnya, tidak akan bermasalah jika program itu hanya dia buat untuksi pemrogram itu sendiri. Meski demikian, hal tersebut jarang terjadi karena biasanyaselalu ada kerja kelompok atau setidaknya program tersebut akan digunakan oleh pi-hak lain yang suatu saat perlu memahami apa yang tertulis di kode sumber tersebut.Untuk keperluan itu, biasanya diperlukan suatu gaya penulisan kode. Saat ini banyaksekali gaya penulisan kode untuk JavaScript / Node.js, biasanya tergantung pada kesepa-katan anggota-anggota dalam kelompok pengembang dan berdasarkan pada pengalamanmereka tersebut. Pada lampiran ini, gaya penulisan kode dari NPM akan dituliskansecara utuh (dalam bahasa aslinya dengan harapan bisa bermanfaat untuk penyeraga-man dan kemudahan membaca atau menelusuri bugs/errors). Gaya penulisan kode inidiambil dari https://npmjs.org/doc/coding-style.html.
A.2. npm’s Coding Style
npm’s "funny" coding style
A.2.1. DESCRIPTION
npm’s coding style is a bit unconventional. It is not different for difference’s sake, butrather a carefully crafted style that is designed to reduce visual clutter and make bugsmore apparent.If you want to contribute to npm (which is very encouraged), you should make your
code conform to npm’s style.
78
A.2. npm’s Coding Style 79
A.2.2. Line Length
Keep lines shorter than 80 characters. It’s better for lines to be too short than to be toolong. Break up long lists, objects, and other statements onto multiple lines.
A.2.3. Indentation
Two-spaces. Tabs are better, but they look like hell in web browsers (and on github),and node uses 2 spaces, so that’s that.Configure your editor appropriately.
A.2.4. Curly braces
Curly braces belong on the same line as the thing that necessitates them. Bad:1 function ( )2 {
Listing A.1: Bad curly braces placement - 1
Good:1 function ( ) {
Listing A.2: Good curly braces placement - 1
If a block needs to wrap to the next line, use a curly brace. Don’t use it if it doesn’t.Bad:
1 i f ( foo ) { bar ( ) }2 while ( foo )3 bar ( )
Listing A.3: Bad curly braces placement - 2
Good:1 i f ( foo ) bar ( )2 while ( foo ) {3 bar ( )4 }
Listing A.4: Good curly braces placement - 2
A.2.5. Semicolons
Don’t use them except in four situations:
X for (;;) loops. They’re actually required.
X null loops like: while (something) ; (But you’d better have a good reason fordoing that.)
X case "foo": doSomething(); break
A.2. npm’s Coding Style 80
X In front of a leading ( or [ at the start of the line. This prevents the expressionfrom being interpreted as a function call or property access, respectively.
Some examples of good semicolon usage:1 ; ( x | | y ) . doSomething ( )2 ; [ a , b , c ] . forEach ( doSomething )3 f o r (var i = 0 ; i < 10 ; i ++) {4 switch ( s t a t e ) {5 case "begin" : s t a r t ( ) ; cont inue6 case "end" : f i n i s h ( ) ; break7 d e f au l t : throw new Error ( "unknown state" )8 }9 end ( )
10 }
Listing A.5: Good semicolon usage
Note that starting lines with - and + also should be prefixed with a semicolon, butthis is much less common.
A.2.6. Comma First
If there is a list of things separated by commas, and it wraps across multiple lines, putthe comma at the start of the next line, directly below the token that starts the list. Putthe final token in the list on a line by itself. For example:
1 var magicWords = [ "abracadabra"2 , "gesundheit"3 , "ventrilo"4 ]5 , s p e l l s = { "fireball" : function ( ) { setOnFire ( ) }6 , "water" : function ( ) { putOut ( ) }7 }8 , a = 19 , b = "abc"
10 , e t c11 , somethingElse
Listing A.6: Comma first
A.2.7. Whitespace
Put a single space in front of ( for anything other than a function call. Also use a singlespace wherever it makes things more readable.Don’t leave trailing whitespace at the end of lines. Don’t indent empty lines. Don’t
use more spaces than are helpful.
A.2.8. Functions
Use named functions. They make stack traces a lot easier to read.
A.2. npm’s Coding Style 81
A.2.9. Callbacks, Sync/async Style
Use the asynchronous/non-blocking versions of things as much as possible. It might makemore sense for npm to use the synchronous fs APIs, but this way, the fs and http andchild process stuff all uses the same callback-passing methodology.The callback should always be the last argument in the list. Its first argument is the
Error or null.Be very careful never to ever ever throw anything. It’s worse than useless. Just send
the error message back as the first argument to the callback.
A.2.10. Errors
Always create a new Error object with your message. Don’t just return a string messageto the callback. Stack traces are handy.
A.2.11. Logging
Logging is done using the npmlog utility.Please clean up logs when they are no longer helpful. In particular, logging the same
object over and over again is not helpful. Logs should report what’s happening so thatit’s easier to track down where a fault occurs.Use appropriate log levels. See config(1) and search for "loglevel".
A.2.12. Case, naming, etc.
X Use lowerCamelCase for multiword identifiers when they refer to objects, func-tions, methods, members, or anything not specified in this section.
X Use UpperCamelCase for class names (things that you’d pass to "new").
X Use all-lower-hyphen-css-case for multiword filenames and config keys.
X Use named functions. They make stack traces easier to follow.
X Use CAPS_SNAKE_CASE for constants, things that should never change andare rarely used.
X Use a single uppercase letter for function names where the function would normallybe anonymous, but needs to call itself recursively. It makes it clear that it’s a"throwaway" function.
A.2.13. null, undefined, false, 0
X Boolean variables and functions should always be either true or false. Don’t setit to 0 unless it’s supposed to be a number.
X When something is intentionally missing or removed, set it to null.
A.2. npm’s Coding Style 82
X Don’t set things to undefined. Reserve that value to mean "not yet set to any-thing."
X Boolean objects are verboten.
Selain gaya penulisan kode dari NPM ini, ada beberapa lagi lainnya yang bisa dilihat,antara lain:
X Spludo http://spludo.com/source/coding-standards/
X Google JavaScript Style Guide (http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml)
X Felix’s Node.js Style Guide (http://nodeguide.com/style.html)
LAMPIRAN B
Commit History dari Penulis Utama dan Kontributor
Buku ini merupakan hasil karya bersama dari beberapa penulis. Peran masing-masingpenulis bisa dilihat pada bagian ringkasan dari sejarah commit. Penulis utama adalahsaya (Bambang Purnomosidi D. P), sementara pada bab 5 ada kontribusi dari Aji KisworoMukti. Hasil log dari git menunjukkan peran masing-masing penulis (git shortlog):
1 Aj i Kisworo Mukti ( 3 ) :2 Bab 5 − Struktur I n s t a l l a s i Paket Node . j s3 Bab 5 − I n s t a l l a s i Paket4 Bab 5 − Menghapus Paket56 Bambang Purnomosidi D. P ( 7 7 ) :7 I n i t i a l commit8 F i r s t commit − i n i t i a l i z i n g empty repo9 Merge branch ’ master ’ o f https : // github . com/bpdp/buku−cloud−node j s
10 Menambahkan l i n k ke teks bahasa Indones ia untuk l i s e n s i CC−BY−SA11 Menambahkan l i n k ke teks bahasa Indones ia untuk l i s e n s i CC−BY−SA12 Menambahkan l i n k ke teks bahasa Indones ia untuk l i s e n s i CC−BY−SA13 Menambahkan t i p s untuk indeks14 Melengkapi bab 1 , terutama tentang t e o r i Cloud Computing15 kesa lahan k e c i l , t idak menutup t e x t i t dengan { tap i |16 Menambahkan indeks da r i Bab 117 Bab 1 s e l e s a i18 Bab 2 − bagian REPL s e l e s a i19 Edit bagian i n s t a l a s i F l a t i r on − h a s i l d i r e k t o r i20 Menambahkan tentang penu l i s buku21 Bab 1 − s e d i k i t keterangan t tg Node . j s , Bab 2 − awal dasar2 JavaScr ipt22 Penambahan i s i d i bab 2 dan 723 Update bab 5 −> mengubah NPM mjd npm dan menambahkan ’Apakah npm i tu ? ’24 Make f i l e => buat c lean−a l l dan clean−without−pdf , bab 2 s e l e s a i Readl ine25 t r i v i a l changes26 Penambahan di bab 2 , menetapkan shadowbox untuk ’ catatan ’27 Bab 2 : n i l a i , t i p e data , dan va r i ab e l . Menambahkan utk catatan ke t i p s28 Penambahan tentang L i t e r a l dan r e o r g a n i s a s i sub bab ( f ung s i )29 Bab 2 : Pembahasan ’ Fungsi ’ s e l e s a i .30 Bab 2 − L i t e r a l , s e l e s a i31 Bab 2 − Pernyataan kond i s i i f . . else i f . . else : s e l e s a i32 Bab 2 − JSON, switch , dan loop ing for −− s e l e s a i
83
B. Commit History dari Penulis Utama dan Kontributor 84
33 Memperbaiki s e d i k i t typo , kurang satu { d i f oo tno t e wik iped ia utk JSON34 Bab 2 s e l e s a i35 Bab 3 − penger t ian PBO dan d e f i n i s i obyek −> s e l e s a i36 Menambahkan Aj i Kisworo Mukti ke kont r ibuto r d i README.md37 Minor r e v i s i o n d i bab 5 , menambahkan gambar npmls ( soa lnya kode ASCII38 keluarannya kacau di LaTex dan saya blm tau workaround−nya39 Mengubah cover −> l eb i h umum, gant i dg logo NodeJS , menambahkan Aj i ke40 kontr ibutor , appendix B −> commit h i s t da r i kont r ibuto r41 Menambahkan mater i PBO => melengkapi d e f i n i s i obyek s e r t a i nh e r i t an c e .42 Contoh i nh e r i t an c e . j s ditambahkan43 Bab 3 − Pemrograman fung s i ona l d i JS => penge r t i a + beberapa po int yg44 akan dibahas45 Menambahkan i n f o tentang koma−s c r i p t d i README.md dan Make f i l e v e r s i46 t e r akh i r47 Menambahkan nested func t i on s d i bab 248 Menambahkan source code nested . j s ( bab 2)49 Bab 3 − beberapa penambahan di pemrograman fung s i ona l50 Bab 3 − Lambda Express ion + contoh51 Higher−order function − Bab 352 Menyelesaikan Closure dan Currying d i Bab 3 . Bab 3 sudah s e l e s a i .53 Mengganti s t ruk tu r − bab 4 −> 5 dan seba l i knya . Bab 4 s e l e s a i , Bab 354 minor rev55 Bab 5 −> (A) Synchronous programming56 Bab 5 −> reo r g an i s a s i , minor r e v i s i o n57 Bab 5 : Event−Driven Programming menggunakan events . EventEmitter .58 => Bab 5 s e l e s a i59 Bab 6 : S ed i k i t pen j e l a san tentang db NoSQL60 Bab 6 − menambahkan pen j e l a san t tg mongoDB: f i t u r , s e rver , c l i e n t web61 Bab 6 : node−gyp dan i n s t a l a s i d r i v e r mongodb62 Bab 6 : menambahkan i n s t a l a s i npm untuk mongodb63 Bab 6 : i n s t a l l mongojs , akses mongojs da r i Node . j s . Kurang a p l i k a s i web64 Bab 4 : menambahkan i n f o t tg i n s t a l l ke homedir ( j i k a berada dlm home)65 dan node_modules ( j i k a d i l ua r home)66 Bab 6 : memulai a p l i k a s i web dengan node j s+exp r e s s j s+mongodb67 Bab 6 : s r c code utk a p l i k a s i web node j s+expre s s+mongoDB s e l e s a i68 Bab 6 s e l e s a i69 Reorgan i sa s i bab 7 dan 8 , menghapus db mongoDB, menambahkan README.md70 utk l a t i han2 d i bab 671 Edit README.md bab 672 Menambah i s i bab 7 dan 873 Bab 8 : source code utk socke t . i o74 Bab 8 s e l e s a i , menambahkan contoh a p l i k a s i Socket . i o75 S e l e s a i . s e d i k i t pembenahan . ha r i i n i bab 7 dan 8 s e l e s a i76 Rev i s i minor bab 6 dan 877 Menambahkan da f t a r pustaka yang digunakan78 Rev i s i minor d i bbrp bab , terutama t e r k a i t margin kanan yg t e r l a l u79 bablas80 Menambahkan indeks81 Edit Appendiks B ( history commit ) dan README.md (menambah s ta tu s −82 buku sudah s e l e s a i )83 Menambahkan l i n k ke f i l e PDF di README.md84 Memperbaharui s e s u a i dengan v e r s i so f tware terbaru (7 Jan 2013)+kata85 pengantar86 update README.md untuk mere f l ek s i kan kond i s i t e rbaru87 Cover : menambah l i s e n s i dan lambang , Bab 1 diubah menyesauikan dgn88 Node 0 . 1 0 . 0 dan vmc 0 . 5 . 089 Menyesuaikan dengan semua v e r s i so f tware t g l 22 Maret 201390 Menambahkan s t a tu s d i README.md ( as o f March 22 , 2013) , memasukkan91 commit history92 Edit README.md − minor rev93 l i s t i n g dan tampilan2 teks l aya r skrg diambi l dengan \ l s t i n p u t l i s t i n g −94 bab 1 s e l e s a i
B. Commit History dari Penulis Utama dan Kontributor 85
95 Bab 2 s e l e s a i di−migras i l s t i n p u t l i s t i n g , rename d i r utk k on s i s t e n s i96 d i s r c /97 Mengedit s r c /README.md agar s e s u a i kond i s i saat i n i98 Memperbarui semua v e r s i so f tware as o f May 6 , 2013 . Clean up junk ie s ,99 typos . Semua source code dan tampilan . txt d ip i sahkan dar i f i l e 2
100 LaTeX utk modular i tas101 Lihat Changelogs . txt − tangga l 6 Mei 2013102103 Bambang Purnomosidi D. P. ( 1 ) :104 Merge pu l l r eque s t #1 from adzymaniac/master
Listing B.1: Commit history
Indeks
AJAX, 68Aliran kendali, 31Array, 28Asynchronous, 50
Bayeux Protocol, 69Boolean, 29BOSH, 69
Callback, 50Closure, 39Cloud Computing, 1
Definisi, 1Karakteristik, 1Model layanan, 3Private, 3Public, 3
CloudFoundry, 4vmc, 4
Comet, 69CommonJS, 23Currying, 39
Dynamically typed, 24
ECMAScript, 23Ekspresi Lambda, 37Event-Driven, 49events.EventEmitter, 49
Floating-point, 29
Fungsi, 26Fungsi Anonim, 27Fungsi rekursif, 27
Higher-order Function, 38
Identifier, 25if, 31Integer, 29
JSON, 30Validator, 48
Konstanta, 25
Literal, 28Looping, 33
mongoDB, 52Driver, 57
Multitenancy, 3MVC, 62
dan ExpressJS, 64
Nested functions, 27Node-gyp, 57Node.js, 4
Hosting, 4Non-blocking IO, 50NOSQL, 52npm, 43
Cari paket, 45
86
Indeks 87
Hapus paket, 45Info paket, 46install paket, 44Struktur paket, 44Update paket, 47
Obyek, 29, 40
PBO, 40Penanganan error, 35Pewarisan, 41Pola arsitektur, 62
Readline, 23Real-time Web, 68REPL, 21
Server-Sent Events, 69Socket.io, 70String, 29switch, 32
Tipe data, 24
Variabel, 25
WebSocket, 70