Pengembangan Aplikasi Cloud Computing Menggunakan Node.js
Upcoming SlideShare
Loading in...5
×
 

Pengembangan Aplikasi Cloud Computing Menggunakan Node.js

on

  • 7,524 views

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

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

Statistics

Views

Total Views
7,524
Views on SlideShare
7,518
Embed Views
6

Actions

Likes
17
Downloads
1,115
Comments
6

2 Embeds 6

https://www.rebelmouse.com 3
https://twitter.com 3

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

16 of 6 Post a comment

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Pengembangan Aplikasi Cloud Computing Menggunakan Node.js Pengembangan Aplikasi Cloud Computing Menggunakan Node.js Document Transcript

    • Pengembangan Aplikasi Cloud ComputingMenggunakan Node.jsOleh: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 dihttp://wiki.creativecommons.org/Licenses/by-sa/3.0LegalText_(Indonesian)May 6, 2013
    • Kata PengantarBuku 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 menyiapkanperanti komputer dengan beberapa software berikut terpasang: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!Git (untuk version control system) - bisa diperoleh di http://git-scm.com. Sayamenggunakan versi 1.8.2.2.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).mongoDB (basis data NOSQL) - bisa diperoleh di http://www.mongodb.org, sayamenggunakan versi 2.4.4-pre-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 Lechmanni
    • Daftar IsiKata Pengantar iDaftar Gambar iiiListing Program ivDaftar Tabel v1. 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 . . . . . . . . . . . . . . . . . . 41.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 . . . . . . . . 121.8. Pengelolaan Aplikasi di Cloud . . . . . . . . . . . . . . . . . . . . . . . . . 131.8.1. Push, Delete, Update Aplikasi . . . . . . . . . . . . . . . . . . . . . 141.8.2. Menggunakan Framework ExpressJS . . . . . . . . . . . . . . . . . 141.8.3. Tanpa Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 192. REPL dan Dasar-dasar JavaScript di Node.js 212.1. REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.1.1. Mengaktifkan REPL . . . . . . . . . . . . . . . . . . . . . . . . . . 21ii
    • Daftar Isi iii2.1.2. Perintah-perintah REPL . . . . . . . . . . . . . . . . . . . . . . . . 222.2. Dasar-dasar JavaScript di Node.js . . . . . . . . . . . . . . . . . . . . . . . 232.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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Pengertian Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Definisi Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Fungsi Anonim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Fungsi Rekursif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Fungsi di dalam Fungsi / Nested Functions . . . . . . . . . . . . . 272.2.6. Literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Literal Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Literal Boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal Floating-point . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Literal String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.2.7. Struktur Data dan Representasi JSON . . . . . . . . . . . . . . . . 302.2.8. Aliran Kendali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Pernyataan Kondisi if .. else if .. else . . . . . . . . . . . . . . . . 31Pernyataan switch . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Looping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.2.9. Penanganan Error . . . . . . . . . . . . . . . . . . . . . . . . . . . 353. Paradigma Pemrograman di JavaScript 373.1. Pemrograman Fungsional . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.1.1. Ekspresi Lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.1.2. Higher-order Function . . . . . . . . . . . . . . . . . . . . . . . . . 383.1.3. Closure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.1.4. Currying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.2. Pemrograman Berorientasi Obyek . . . . . . . . . . . . . . . . . . . . . . . 403.2.1. Pengertian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.2.2. Definisi Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.2.3. Inheritance / Pewarisan . . . . . . . . . . . . . . . . . . . . . . . . 414. Mengelola Paket Menggunakan npm 434.1. Apakah npm Itu? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.2. Menggunakan npm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.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 iv4.2.5. Menampilkan Informasi Paket . . . . . . . . . . . . . . . . . . . . . 464.2.6. Memperbaharui Paket . . . . . . . . . . . . . . . . . . . . . . . . . 475. 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 . . . . . . . . . . . . . . . 506. Mengakses Basis Data NoSQL: mongoDB 526.1. Apa itu Basis Data NoSQL? . . . . . . . . . . . . . . . . . . . . . . . . . . 526.2. Mengenal mongoDB dan Fitur-fiturnya . . . . . . . . . . . . . . . . . . . . 526.2.1. Memulai Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.2.2. Klien dan Shell mongoDB . . . . . . . . . . . . . . . . . . . . . . . 546.2.3. Documents dan Collections . . . . . . . . . . . . . . . . . . . . . . 566.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 . . . . . . . . . . . . . . . . . . 586.4. Aplikasi Web Menggunakan Node.js dan mongoDB . . . . . . . . . . . . . 597. 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 . . . . . . . 647.3.1. Struktur Aplikasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.3.2. File-file yang Diperlukan . . . . . . . . . . . . . . . . . . . . . . . . 657.3.3. Hasil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya . . . . . . . . . . 668. Real-time Web Menggunakan Socket.io 688.1. Apa itu Real-time Web? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688.2. Teknologi Pendukung Real-time Web . . . . . . . . . . . . . . . . . . . . . 688.2.1. Ajax Technology . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688.2.2. Comet dan Push Technology . . . . . . . . . . . . . . . . . . . . . . 69SSE (Server-Sent Events) . . . . . . . . . . . . . . . . . . . . . . . 69Bayeux Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69BOSH Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698.2.3. WebSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.3. Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.3.1. Apa itu Socket.io? . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.3.2. Menggunakan Socket.io untuk Real-time Web . . . . . . . . . . . . 71Tentang Aplikasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71Membuat Kerangka Aplikasi dengan ExpressJS . . . . . . . . . . . 71Instalasi Paket yang Diperlukan . . . . . . . . . . . . . . . . . . . . 71
    • Daftar Isi vKonfigurasi JavaScript untuk Browser . . . . . . . . . . . . . . . . 72Hapus File yang Tidak Diperlukan . . . . . . . . . . . . . . . . . . 72Ubah File-file Tertentu . . . . . . . . . . . . . . . . . . . . . . . . . 72Menjalankan Server Socket.io . . . . . . . . . . . . . . . . . . . . . 73Daftar Pustaka 76Lampiran 78A. Gaya Penulisan Kode / Coding Style 78A.1. Tentang Gaya Penulisan Kode . . . . . . . . . . . . . . . . . . . . . . . . . 78A.2. npm’s Coding Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78A.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 . . . . . . . . . . . . . . . . . . . . . . . . . 81B. Commit History dari Penulis Utama dan Kontributor 83Indeks 85
    • Daftar Gambar1.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 . . . . . . . . . . . . . . . . . . 204.1. Tampilan “npm ls” pada direktori proyek dengan paket terinstall lengkap . 466.1. Admin web console untuk mongoDB . . . . . . . . . . . . . . . . . . . . . 557.1. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637.2. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678.1. Hasil di browser dari ExpressJS + Socket.io . . . . . . . . . . . . . . . . . 75vi
    • Listing Program1.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 . . . . . . . . . . . . . . . . . . . . . 192.1. Node.js REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2. Contoh penggunaan .load dalam REPL . . . . . . . . . . . . . . . . . . . . 22vii
    • Listing Program viii2.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 . . . . . . . . . . . . . . . . . . . . . . . . . . 363.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 . . . . . . . . . . . . . . . . . . . . . . . . . 414.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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.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 ix6.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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617.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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668.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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74A.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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80B.1. Commit history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
    • Daftar Tabelx
    • BAB 1Pengenalan Cloud Computing dan Infrastruktur Pengembangan AplikasiBerbasis Node.js1.1. Apa itu Cloud Computing?Cloud Computing, atau sering diterjemahkan sebagai “Komputasi Awan” dalam bahasaIndonesia mempunyai berbagai definisi:Wikipedia: penggunaan sumber daya komputasi (peranti keras dan peranti lunak)yang berfungsi untuk memberikan layanan melalui suatu jaringan (pada umumnyaInternet)1.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.141.2. Karakteristik Cloud ComputingMenurut 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=11
    • 1.2. Karakteristik Cloud Computing 2Gambar 1.1.: Model Cloud ComputingOn-demand self-service: layanan bisa diperoleh pada saat diminta, tanpa inter-vensi atau interaksi manusia di sisi penyedia jasa.Broad network access: tersedia melalui jaringan dengan berbagai peranti yangumum (komputer, tablet, HP, dan lain-lain)Resource pooling: sumber daya komputasi dari penyedia jasa terkumpul untukmelayani.Rapid elasticity: skalabilitas.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 3bekerja dengan instan aplikasi virtual tersebut5.1.3. Public dan Private Cloud ComputingCloud 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 ComputingModel layanan pada Cloud Computing akan berkembang sesuai kebutuhan konsumenserta inovasi dari berbagai penyedia layanan. Saat ini, pada umumnya, ada tiga modellayanan:SaaS (Software as a Service): layanan berupa aplikasi yang ditempatkan padainfrastruktur penyedia layanan, siap digunakan oleh konsumen.PaaS (Platform as a Service): menyediakan layanan ke konsumen berupa platformuntuk men-deploy aplikasi.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 ComputingPada 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 pengembangyang 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 4CodingTest di komputer lokalUpload ke server (dalam Cloud Computing, proses ini diistilahkan dengan “push”Edit - pushJika 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 ComputingNode.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: CloudFoundrySaat 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. PendaftaranUntuk 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 selesaiseperti 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 UtilitiesCommand 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 5Gambar 1.2.: Pendaftaran di CF1 $ 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 executables w i l l not run .7 S u 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 S u c c e s s f u l l y i n s t a l l e d multi_json −1.7.210 Fetching : interact −0.5.2.gem (100%)11 S u c c e s s f u l l y i n s t a l l e d interact −0.5.212 Fetching : multipart−post −1.2.0.gem (100%)13 S u c c e s s f u l l y i n s t a l l e d multipart−post −1.2.014 Fetching : rubyzip −0.9.9.gem (100%)15 S u c c e s s f u l l y i n s t a l l e d rubyzip −0.9.916 Fetching : cf−uaa−lib −1.3.10.gem (100%)17 S u c c e s s f u l l y i n s t a l l e d cf−uaa−lib −1.3.1018 Fetching : cfoundry −0.5.2.gem (100%)19 S u c c e s s f u l l y i n s t a l l e d cfoundry −0.5.220 Fetching : clouseau −0.0.2.gem (100%)21 S u c c e s s f u l l y i n s t a l l e d clouseau −0.0.222 Fetching : mothership −0.5.1.gem (100%)23 S u c c e s s f u l l y i n s t a l l e d mothership −0.5.124 Fetching : manifests −vmc−plugin −0.6.2.gem (100%)25 S u c c e s s f u l l y i n s t a l l e d manifests −vmc−plugin −0.6.226 Fetching : addressable −2.3.4.gem (100%)27 S u c c e s s f u l l y i n s t a l l e d addressable −2.3.4
    • 1.7. Layanan Hosting Aplikasi: CloudFoundry 6Gambar 1.3.: Hasil proses pendaftaran di CF28 Fetching : caldecott −c l i e n t −0.0.2.gem (100%)29 S u c c e s s f u l l y i n s t a l l e d caldecott −c l i e n t −0.0.230 Fetching : mime−types −1.23.gem (100%)31 S u c c e s s f u l l y i n s t a l l e d mime−types −1.2332 Fetching : rest −c l i e n t −1.6.7.gem (100%)33 S u c c e s s f u l l y i n s t a l l e d rest −c l i e n t −1.6.734 Fetching : uuidtools −2.1.4.gem (100%)35 S u c c e s s f u l l y i n s t a l l e d uuidtools −2.1.436 Fetching : tunnel−vmc−plugin −0.2.2.gem (100%)37 S u 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 S u c c e s s f u l l y i n s t a l l e d vmc−0.5.040 Parsing 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 Parsing 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 Parsing documentation for interact −0.5.245 I n s t a l l i n g r i documentation for interact −0.5.246 Parsing documentation for multipart−post −1.2.047 I n s t a l l i n g r i documentation for multipart−post −1.2.048 Parsing documentation for rubyzip −0.9.949 I n s t a l l i n g r i documentation for rubyzip −0.9.950 Parsing documentation for cf−uaa−lib −1.3.1051 I n s t a l l i n g r i documentation for cf−uaa−lib −1.3.1052 Parsing documentation for cfoundry −0.5.253 I n s t a l l i n g r i documentation for cfoundry −0.5.254 Parsing documentation for clouseau −0.0.255 I n s t a l l i n g r i documentation for clouseau −0.0.256 Parsing documentation for mothership −0.5.157 I n s t a l l i n g r i documentation for mothership −0.5.158 Parsing documentation for manifests −vmc−plugin −0.6.2
    • 1.7. Layanan Hosting Aplikasi: CloudFoundry 7Gambar 1.4.: E-mail persetujuan dan pemberitahuan credentials59 I n s t a l l i n g r i documentation for manifests −vmc−plugin −0.6.260 Parsing documentation for addressable −2.3.461 I n s t a l l i n g r i documentation for addressable −2.3.462 Parsing documentation for caldecott −c l i e n t −0.0.263 I n s t a l l i n g r i documentation for caldecott −c l i e n t −0.0.264 Parsing documentation for mime−types −1.2365 I n s t a l l i n g r i documentation for mime−types −1.2366 Parsing documentation for rest −c l i e n t −1.6.767 I n s t a l l i n g r i documentation for rest −c l i e n t −1.6.768 Parsing documentation for uuidtools −2.1.469 I n s t a l l i n g r i documentation for uuidtools −2.1.470 Parsing 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 Parsing 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 interact , multipart−post , rubyzip , cf−uaa−lib , cfoundry ,76 clouseau , mothership , manifests −vmc−plugin , addressable ,77 caldecott −c l i e n t , mime−types , rest −c l i e n t , uuidtools ,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 8Listing 1.1: Instalasi vmcPesan peringatan berikut ini:1 WARNING: You don ’ t have /home/bpdp /. gem/ruby / 2 . 0 . 0 / bin in your PATH,2 gem executables w i l l not run .Listing 1.2: Peringatan setting PATH untuk vmcterjadi 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 / binListing 1.3: Peringatan setting PATH untuk vmcSetelah itu, ketikkan di shell prompt Bash: source ˜/.bashrc7.Hasil dari instalasi vmc adalah sebagai berikut:1 $ gem l i s t23 ∗∗∗ LOCAL GEMS ∗∗∗45 addressable ( 2 . 3 . 4 )6 bigdecimal ( 1 . 2 . 0 )7 caldecott −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 clouseau ( 0 . 0 . 2 )11 i n t e r a c t ( 0 . 5 . 2 )12 io−console ( 0 . 4 . 2 )13 json ( 1 . 7 . 7 )14 json_pure ( 1 . 7 . 7 )15 manifests −vmc−plugin ( 0 . 6 . 2 )16 mime−types ( 1 . 2 3 )17 minitest ( 4 . 3 . 2 )18 mothership ( 0 . 5 . 1 )19 multi_json ( 1 . 7 . 2 )20 multipart−post ( 1 . 2 . 0 )21 psych ( 2 . 0 . 0 )22 rake ( 0 . 9 . 6 )23 rdoc ( 4 . 0 . 0 )24 rest −c l i e n t ( 1 . 6 . 7 )25 rubyzip ( 0 . 9 . 9 )26 test−unit ( 2 . 0 . 0 . 0 )27 tunnel−vmc−plugin ( 0 . 2 . 2 )28 uuidtools ( 2 . 1 . 4 )29 vmc ( 0 . 5 . 0 )30 $Listing 1.4: Hasil gem yang terinstallPeriksa 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 91 $ vmc help2 Showing basic command set . Run with ’ help −−a l l ’ to l i s t a l l commands .34 Getting Started5 target [URL] Set or display the target cloud , organization , and space6 logout Log out from the target7 l o g i n [EMAIL] Authenticate with the target8 i n f o Display information on the current target , user , etc .910 Applications11 app [APP] Show app information12 apps L i s t your a p p l i c a t i o n s1314 Management15 s t a r t APPS . . . Start an a p p l i c a t i o n16 d e l e t e APPS . . . Delete an a p p l i c a t i o n17 push [NAME] Push an application , syncing 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 a p p l i c a t i o n19 stop APPS . . . Stop an a p p 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 information23 s e r v i c e s L i s t your s e r v i c e2425 Management26 delete −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 a p p 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 a p p l i c a t i o n30 tunnel [INSTANCE] [CLIENT] Create a local tunnel to a s e r v i c e .3132 Organizations33 org [ORGANIZATION] Show organization information34 delete −org [ORGANIZATION] Delete an organization35 orgs L i s t a v a i l a b l e o r g a n i z a t i o n s36 create −org [NAME] Create an organization3738 Spaces39 delete −space SPACES . . . Delete a space and i t s contents40 spaces [ORGANIZATION] L i s t spaces in an organization41 create −space [NAME] [ORGANIZATION] Create a space in an organization42 space [SPACE] Show space information4344 Routes45 routes L i s t routes in a space4647 Domains48 domains [SPACE] L i s t domains in a space49 map−domain NAME Map a domain to an organization or space50 unmap−domain DOMAIN Unmap a domain from an organization 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 −−quiet and −−f o r c e55 −−debug Print f u l l stack trace ( instead of crash log )56 −V, −−verbose Print extra information57 −f , −−[no−] f o r c e Skip i n t e r a c t i o n when p o s s i b l e58 −h , −−help Show command usage59 −m, −−manifest FILE Path to manifest f i l e to use60 −q , −−[no−] quiet Simplify output format61 −t , −−trace Show API t r a f f i c
    • 1.7. Layanan Hosting Aplikasi: CloudFoundry 1062 −u , −−proxy EMAIL Run t h i s command as another user ( admin )63 −v , −−version Print version number64 $Listing 1.5: Hasil opsi help dari vmc1.7.3. Konfigurasi di Server CloudPada dasarnya, yang diperlukan hanyalah mengubah target ke server cloud dari CF dankemudian mengubah password.1 $ vmc target2 NoMethodError : undefined method ‘ target ’ for n i l : NilClass3 For more information , see ~/.vmc/ crash4 $Listing 1.6: Mengubah target server - belum ada konfigurasiError 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 target2 target : https :// api . cloudfoundry . com3 $Listing 1.7: Mengubah target server - setelah konfigurasiSetelah 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 target : https :// api . cloudfoundry . com34 Email> bambangpdp@yahoo . com56 Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗78 Authenticating . . . OK9 $ vmc i n f o −−a l l10 Getting runtimes . . . OK11 Getting frameworks . . . OK12 Getting s e r v i c e s . . . OK1314 VMware’ s Cloud Application Platform1516 target : https :// api . cloudfoundry . com17 version : 0.99918 support : http :// support . cloudfoundry . 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 1125 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 spring41 standalone4243 s e r v i c e version provider d e s c r i p t i o n44 mongodb 2.0 core MongoDB NoSQL database45 mysql 5.1 core MySQL database46 p o 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 target : https :// api . cloudfoundry . com5657 Email> bambangpdp@yahoo . com5859 Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗6061 Authenticating . . . OK6263 $ vmc i n f o −−a l l64 Getting runtimes . . . OK65 Getting frameworks . . . OK66 Getting s e r v i c e s . . . OK6768 VMware’ s Cloud Application Platform6970 target : https :// api . cloudfoundry . com71 version : 0.99972 support : http :// support . cloudfoundry . 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 1287 java_web88 l i f t89 node90 play91 rack92 r a i l s 393 s i n a t r a94 spring95 standalone9697 s e r v i c e version provider d e s c r i p t i o n98 mongodb 2.0 core MongoDB NoSQL database99 mysql 5.1 core MySQL database100 p o 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 serverUntuk mengubah password:1 $ vmc passwd2 New Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗34 Verify Password> ∗∗∗∗∗∗∗∗∗∗∗∗∗∗56 Your password strength i s : good7 Changing password . . . OK8 $Listing 1.9: Mengubah password server1.7.4. Instalasi dan Konfigurasi Node.js di Komputer LokalNode.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 paketdari distro Linux.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 / nodejs$ 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 − linux−x86 . tar . gz
    • 1.8. Pengelolaan Aplikasi di Cloud 136 20:30:31 −bpdp@bpdp−arch :~/ master / nodejs$Listing 1.10: Hasil dari download Node.jsEkstrak ke direktori yang diinginkan. Node.js akan diinstall di direktori $HOME-/software:1 $ cd2 $ cd software3 $ tar −xzvf ~/master / nodejs /node−v0 .10.5 − linux−x86 . tar . gz4 $ ln −s node−v0 .10.5 − linux−x86 nodejs5 $ l s −la6 . . . .7 . . . .8 lrwxrwxrwx 1 bpdp bpdp 22 May 1 07:58 nodejs −> node−v0 .10.5 − linux−x869 drwxr−xr−x 5 bpdp bpdp 4096 Apr 24 03:31 node−v0 .10.5 − linux−x8610 . . . .11 . . . .12 $Listing 1.11: Ekstraksi Node.jsKonfigurasi variabel lingkungan. Sebaiknya disimpan pada suatu file (pada bukuini, konfigurasi akan disimpan di $HOME/environment/nodejs):1 NODEJS_HOME=/home/bpdp/ software / nodejs23 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/ include7 CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$NODEJS_HOME/ include89 export PATH10 export MANPATH11 export LD_LIBRARY_PATH12 export C_INCLUDE_PATH13 export CPLUS_INCLUDE_PATHListing 1.12: Konfigurasi variabel lingkungan Node.jsSetiap akan menggunakan Node.js, yang diperlukan adalah men-source file konfig-urasi tersebut: source ˜/environment/nodejs.1.8. Pengelolaan Aplikasi di CloudAplikasi 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 141.8.1. Push, Delete, Update AplikasiPada 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 ExpressJS1 $ npm i n s t a l l −g expressListing 1.13: Instalasi ExpressJS menggunakan npmJika berhasil, maka kita bisa menggunakan perintah express untuk membuat rerangkaaplikasi. Sintaksis penggunaan ExpressJS adalah sebagai berikut:1 $ express −−help23 Usage : express [ options ]45 Options :67 −h , −−help output usage information8 −V, −−version output the version number9 −s , −−s e s s i o n s add s e s s i o n support10 −e , −−e j s add e j s engine support ( d e f a u l t s to jade )11 −J , −−jshtml add jshtml engine support ( d e f a u l t s to jade )12 −H, −−hogan add hogan . j s engine support13 −c , −−c ss <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 plain c ss )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 expressSetelah itu, kita bisa membuat rerangka aplikasi ExpressJS dengan cara berikut:1 $ mkdir h e l l o2 $ cd h e l l o3 $ express45 create : .6 create : ./ package . json7 create : ./ app . j s8 create : ./ public9 create : ./ public / j a v a s c r i p t s10 create : ./ routes11 create : ./ routes / index . j s12 create : ./ routes / user . j s13 create : ./ public / s t y l e s h e e t s14 create : ./ public / s t y l e s h e e t s / s t y l e . c ss15 create : ./ views16 create : ./ views / layout . jade17 create : ./ views / index . jade18 create : ./ public / images1920 i n s t a l l dependencies :21 $ cd . && npm i n s t a l l2223 run the app :
    • 1.8. Pengelolaan Aplikasi di Cloud 1524 $ node app2526 $Listing 1.15: Menggunakan express untuk membuat rerangka aplikasiPada 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 ExpressJSa12 /**3 * Module dependencies .4 */56 var express = r e q u i r e ( ’express ’)7 , routes = r e q u i r e ( ’./ routes ’)8 , user = r e q u i r e ( ’./ routes/user ’)9 , http = r e q u i r e ( ’http ’)10 , path = r e q u i r e ( ’path ’ ) ;1112 var app = express ( ) ;1314 // all environments15 app . s e t ( ’port ’ , process . env .PORT | | 3000);16 app . s e t ( ’views ’ , __dirname + ’/views ’ ) ;17 app . s e t ( ’view engine ’ , ’jade ’ ) ;18 app . use ( express . favicon ( ) ) ;19 app . use ( express . logger ( ’dev ’ ) ) ;20 app . use ( express . bodyParser ( ) ) ;21 app . use ( express . methodOverride ( ) ) ;22 app . use ( app . router ) ;23 app . use ( express . 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 ( express . errorHandler ( ) ) ;28 }2930 app . get ( ’/’ , routes . index ) ;31 app . get ( ’/users ’ , user . l i s t ) ;3233 http . crea teServer ( app ) . l i s t e n ( app . get ( ’port ’ ) , function (){34 console . log ( ’Express server listening on port ’ + app . get ( ’port ’ ) ) ;
    • 1.8. Pengelolaan Aplikasi di Cloud 1635 } ) ;Listing 1.17: app.js untuk ExpressJSEdit file routes/index.js sebagai berikut:12 /*3 * GET home page.4 */56 exports . 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.jsSetelah 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−hello −express34 Instances > 156 1: node7 2: other8 Framework> node910 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 Creating bpdp−hello −express . . . OK2526 1: bpdp−hello −express . cloudfoundry . com27 2: none28 Domain> bpdp−hello −express . cloudfoundry . com2930 Updating bpdp−hello −express . . . OK3132 Create s e r v i c e s for a p p l i c a t i o n?> n3334 Save c o n f i g u r a t i o n?> n35
    • 1.8. Pengelolaan Aplikasi di Cloud 17Gambar 1.5.: Hasil push ke server36 Uploading bpdp−hello −express . . . OK37 Starting bpdp−hello −express . . . OK38 Checking bpdp−hello −express . . .39 1/1 i n s t a n c e s : 1 running40 OK41 $Listing 1.19: Deployment aplikasi ExpressJS ke CFHasilnya terlihat pada tampilan browser di Gambar 1.5Aplikasi yang sudah dibuat seringkali diubah, oleh karena itu vmc juga menyediakanfasilitas untuk Mengupdate aplikasi.12 /*3 * GET home page.4 */56 exports . index = function ( req , r e s ){7 var nv = process . version ;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.js1 $ vmc apps2 Getting a p p l i c a t i o n s . . . OK34 name status usage runtime u r l5 hello −express running 1 x 64M node08 bpdp−hello −express . cloudfoundry . com6 $ vmc push hello −express7 Uploading hello −express . . . OK8 Stopping hello −express . . . OK910 Starting hello −express . . . OK11 Checking hello −express . . . OK12 $Listing 1.21: Mengupdate aplikasi di serverHasilnya bisa dilihat di Gambar 1.6Untuk menghapus aplikasi:1 $ vmc d e l e t e bpdp−m1−hellonoframework2 Really d e l e t e bpdp−m1−hellonoframework?> y3
    • 1.8. Pengelolaan Aplikasi di Cloud 18Gambar 1.6.: Hasil update dengan menyertakan versi Node.js4 Deleting bpdp−m1−hellonoframework . . . OK56 $Listing 1.22: Menghapus aplikasi yang di-deploy di CFPada saat deployment, kita juga bisa memilih versi Node.js (runtime) sebagai berikut:1 $ vmc push −−runtime=node082 Name> bpdp−hello −express0634 Instances > 156 1: node7 2: other8 Framework> node910 1: 64M11 2: 128M12 3: 256M13 4: 512M14 5: 1G15 Memory Limit> 64M1617 Creating bpdp−hello −express06 . . . OK1819 1: bpdp−hello −express06 . cloudfoundry . com20 2: none21 URL> bpdp−hello −express06 . cloudfoundry . com2223 Updating bpdp−hello −express06 . . . OK2425 Create s e r v i c e s for a p p l i c a t i o n?> n2627 Save c o n f i g u r a t i o n?> n2829 Uploading bpdp−hello −express06 . . . OK30 Starting bpdp−hello −express06 . . . OK31 Checking bpdp−hello −express06 . . . OK32 $Listing 1.23: Deployment ke CF dengan memilih runtime Node.jsHasilnya bisa dilihat di Gambar 1.7
    • 1.8. Pengelolaan Aplikasi di Cloud 19Gambar 1.7.: Deployment menggunakan versi runtime tertentu1.8.3. Tanpa FrameworkTanpa framework, yang kita perlukan hanyalah langsung mem-push file yang kita buat(dalam contoh ini adalah app.js):1 var http = r e q u i r e ( ’http ’ ) ;2 var u r l = r e q u i r e ( "url" ) ;34 http . crea teServer ( function ( req , r e s ) {56 var pathname = u r l . parse ( req . u r l ) . pathname ;78 r e s . writeHead (200 , {’Content -Type ’ : ’text/html ’ } ) ;9 r e s . write ( "Hello NodeJS <u>" + process . version + " </u>" ) ;10 r e s . write ( "<br />Request for <b>" + pathname + " </b> received." ) ;11 r e s . end ( ) ;1213 } ) . l i s t e n ( 1 3 3 7 ) ;Listing 1.24: app.js tanpa frameworkProses deployement adalah sebagai berikut:1 $ vmc push2 Name> hello −noframework34 Instances > 156 1: node7 2: other8 Framework> node910 1: node11 2: node0612 3: node0813 4: other14 Runtime> 31516 1: 64M17 2: 128M18 3: 256M19 4: 512M20 5: 1G21 Memory Limit> 64M2223 Creating hello −noframework . . . OK2425 1: hello −noframework . cloudfoundry . com
    • 1.8. Pengelolaan Aplikasi di Cloud 20Gambar 1.8.: Hasil deployement app.js tanpa framework26 2: none27 URL> hello −noframework . cloudfoundry . com2829 Updating hello −noframework . . . OK3031 Create s e r v i c e s for a p p l i c a t i o n?> n3233 Save c o n f i g u r a t i o n?> n3435 Uploading hello −noframework . . . OK36 Starting hello −noframework . . . OK37 Checking hello −noframework . . . OK38 $Listing 1.25: Deployment app.js tanpa frameworkHasilnya bisa dilihat pada Gambar 1.8
    • BAB 2REPL dan Dasar-dasar JavaScript di Node.js2.1. REPLREPL 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 REPLUntuk 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 gets you out4 . c l e a r Alias for . break5 . exit Exit the r e p l6 . help Show r e p l options7 . load Load JS from a f i l e into the REPL s e s s i o n8 . save Save a l l evaluated 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 REPL21
    • 2.1. REPL 22Tanda “>” adalah tanda bahwa REPL Node.js siap untuk menerima perintah. Untukmelihat perintah-perintah REPL, bisa digunakan .help.2.1.2. Perintah-perintah REPLPada sesi REPL, kita bisa memberikan perintah internal REPL maupun perintah-perintahlain yang sesuai dan dikenali sebagai perintah JavaScript. Perintah internal REPLNode.js terdiri atas:.break: keluar dan melepaskan diri dari "keruwetan" baris perintah di REPL..clear: alias untuk .break.exit: keluar dari sesi REPL (bisa juga dengan menggunakan Ctrl-D).help: menampilkan pertolong perintah internal REPL.load: membaca dan mengeksekusi perintah-perintah JavaScript yang terdapatpada suatu file..save: menyimpan sesi REPL ke dalam suatu file.Contoh untuk .load:1 $ node2 > . load /home/bpdp/ kerjaan / s r c / j a v a s c r i p t / nodejs / h e l l o . j s3 > var http = r e q u i r e ( ’http ’ ) ;4 undefined5 > http . createServer ( function ( req , r e s ) {6 . . . r e s . writeHead (200 , {’Content -Type ’ : ’text/plain ’ } ) ;7 . . . r e s . end ( ’Hello Worldn’ ) ;8 . . . } ) . l i s t e n (1337 , ’127.0.0.1 ’ ) ;9 { domain : null ,10 _events :11 { request : [ Function ] ,12 connection : [ Function : connectionListener ] ,13 c l i e n t E r r o r : [ Function ] } ,14 _maxListeners : 10 ,15 _connections : 0 ,16 connections : [ Getter / Setter ] ,17 _handle : null ,18 _usingSlaves : false ,19 _slaves : [ ] ,20 allowHalfOpen : true ,21 httpAllowHalfOpen : false ,22 timeout : 120000 }23 > console . log ( ’Server running at http ://127.0.0.1:1337/ ’ ) ;24 Server running at http : // 127.0.0.1:1337/25 undefined26 >Listing 2.2: Contoh penggunaan .load dalam REPLSetelah 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 231 $ node2 > console . log ( "Selamat datang di Node.js" )3 Selamat datang di Node . j s4 undefined5 > . save /home/bpdp/ kerjaan / s r c / j a v a s c r i p t / nodejs /welcome . j s6 Session saved to :/ home/bpdp/ kerjaan / s r c / j a v a s c r i p t / nodejs /welcome . j s7 > $ cat /home/bpdp/ kerjaan / s r c / j a v a s c r i p t / nodejs /welcome . j s8 console . log ( "Selamat datang di Node.js" )9 $Listing 2.3: Contoh penggunaan perintah .save di sesi REPL2.2. Dasar-dasar JavaScript di Node.jsNode.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:me-require pustaka Readlinemembuat interface untuk masukan dan keluaran.. gunakan interface .... gunakan interface .... gunakan interface .... gunakan interface ......tutup interface1Lengkapnya bisa diakses di http://nodejs.org/api/readline.html
    • 2.2. Dasar-dasar JavaScript di Node.js 24Implementasi dari pola diatas bisa dilihat pada kode sumber berikut ini (diambil darimanual Node.js):1 var r e a d l i n e = r e q u i r e ( ’readline ’ ) ;23 var r l = r e a d l i n e . c r e a t e I n t e r f a c e ({4 input : process . stdin ,5 output : process . stdout6 } ) ;78 r l . question ( "What do you think of node.js? " , function ( answer ) {9 console . log ( "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 masukanCatatan: 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 DataProgram dalam JavaScript akan berhubungan dengan data atau nilai. Setiap nilai mem-punyai tipe tertentu. JavaScript mengenali berbagai tipe berikut ini:Angka: bulat (misalnya 4) atau pecahan (misalnya 3.75)Boolean: nilai benar (true) dan salah (false)String: diapit oleh tanda petik ganda ("contoh string") atau tunggal (’contohstring’)nullundefinedJavaScript 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 251 var jumlahMahasiswa = 302 console . log ( ’Jumlah mahasiswa dalam satu kelas = ’ + jumlahMahasiswa ) ;3 // Jumlah mahasiswa dalam satu kelas = 30Listing 2.5: Fitur dynamically typed languagePada contoh di atas, kita bisa melihat bahwa data akan dikonversi secara otomatispada saat program dieksekusi.Catatan:Khusus untuk operator "+", JavaScript akan melakukan penggabungan string(string concatenation), tetapi untuk operator lain, akan dilakukan operasi matem-atis sesuai operator tersebut (-,/,*).Konversi string ke tipe numerik bisa dilakukan dengan parseInt(string) (jika bilan-gan bulat) dan parseFloat(string) (jika bilangan pecahan).2.2.3. VariabelVariabel 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:Dimulai dengan huruf, underscore (_), atau tanda dollar ($).Karakter berikutnya bisa berupa angka, selain ketentuan pertama di atas.Membedakan huruf besar - kecil.Konvensi yang digunakan oleh pemrogram JavaScript terkait dengan penamaan ini adalahvariasi dari metode camel case, yaitu camelBack. Contoh: jumlahMahasiswa, linkMenu,status.2.2.4. KonstantaKonstanta 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 console . log ( "Posisi menu = " + MENU) ;45 // mencoba mengisi MENU. berhasil?67 MENU = "About" ;8
    • 2.2. Dasar-dasar JavaScript di Node.js 269 console . log ( "Posisi menu = " + MENU) ;1011 // Posisi menu = Home12 // Posisi menu = HomeListing 2.6: Contoh konstanta dalam JavaScriptKonvensi 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. FungsiPengertian FungsiFungsi 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 FungsiDefinisi fungsi dari JavaScript di Node.js bisa dilakukan dengan sintaksis berikut ini:1 function namaFungsi ( argumen1 , argumen2 , . . . , argumentN ) {2 . .3 JavaScript code . .4 JavaScript code . .5 JavaScript code . .6 JavaScript code . .7 . .8 }Listing 2.7: Sintaksis Fungsi dalam JavaScriptSetelah dideklarasikan, fungsi tersebut bisa dipanggil dengan cara sebagai berikut:1 . .2 . .3 namaFungsi ( argumen1 , argumen2 , . . . , argumenN ) ;4 . .5 . .Listing 2.8: Pemanggilan Fungsi dalam JavaScriptContoh dalam program serta pemanggilannya adalah sebagai berikut:1 $ node2 > function addX( angka ) {3 . . . console . log ( angka + 1 0 ) ;4 . . . }5 undefined6 > addX ( 2 0 ) ;7 30
    • 2.2. Dasar-dasar JavaScript di Node.js 278 undefined9 >10 > function add2Numbers ( angka1 , angka2 ) {11 . . . return angka1 + angka2 ;12 . . . }13 undefined14 > console . log ( "232 + 432 = " + add2Numbers (232 , 4 3 2 ) ) ;15 232 + 432 = 66416 undefined17 >Listing 2.9: Contoh deklarasi fungsi dan pemanggilannyaFungsi AnonimFungsi 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 console . log ( pangkat ( 1 0 ) ) ;3 // output: 100Listing 2.10: Fungsi anonimFungsi RekursifFungsi 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 }910 console . log ( "factorial (6) = " + f a c t o r i a l ( 6 ) ) ;1112 // hasil:13 // factorial (6) = 720Listing 2.11: Fungsi rekursif untuk menghitung faktorialFungsi di dalam Fungsi / Nested FunctionsSaat 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 281 function induk () {23 var awal = 0;4 function tambahkan () {5 awal++;6 }78 tambahkan ( ) ;9 tambahkan ( ) ;1011 console . log ( ’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:3Listing 2.12: Fungsi di dalam Fungsi2.2.6. LiteralLiteral digunakan untuk merepresentasikan nilai dalam JavaScript. Ada beberapa tipeliteral.Literal ArrayArray 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 console . log ( arrMembers [ 0 ] ) ;4 // hasil: one5 console . log ( arrMembers [ 2 ] ) ;6 // hasil: undefined7 console . log ( arrMembers [ 3 ] ) ;8 // hasil: three
    • 2.2. Dasar-dasar JavaScript di Node.js 299 console . log ( arrMembers [ 4 ] ) ;10 // hasil: undefined - karena tidak ada11 console . log ( arrMembers . length ) ;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 console . log ( multiArray [ 0 ] [ 2 ] ) ;18 // hasil: 0-219 console . log ( multiArray [ 1 ] [ 2 ] ) ;20 // hasil: 1-2Listing 2.13: Array di JavaScriptLiteral BooleanLiteral boolean menunjukkan nilai benar (true) atau salah (false).Literal IntegerLiteral integer digunakan untuk mengekspresikan nilai bilangan bulat. Nilai bulanganbulat dalam JavaScript bisa dalam bentuk:decimal (basis 10): digit tanpa awalan nol.octal (basis 8): digit diawali dengan 1 angka nol.2hexadecimal (basis 16): digit diawali dengan 0x.Literal Floating-pointLiteral ini digunakan untuk mengekspresikan nilai bilangan pecahan, misalnya 0.4343atau bisa juga menggunakan E/e (nilai eksponensial), misalnya -3.1E12.Literal ObyekLiteral ini akan dibahas di bab yang menjelaskan tentang paradigma pemrograman beror-ientasi obyek di JavaScript.Literal StringLiteral string mengekspresikan suatu nilai dalam bentuk sederetan karakter dan beradadalam tanda petik (ganda/“” maupun tunggal/”). Contoh:“Kembali ke halaman utama”’Lisensi’“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“1234.543”“baris pertama n baris kedua”Contoh terakhir di atas menggunakan karakter khusus (n). Beberapa karakter khususlainnya adalah:b: Backspacef: Form feedn: New liner: Carriage returnt: Tabv: Vertical tab’: Apostrophe atau single quote": Double quote: Backslash ().XXX: Karakter dengan pengkodean Latin-1 dengan tiga digit octal antara 0 and377. (misal, 251 adalah simbol hak cipta).xXX: seperti di atas, tetapi hexadecimal (2 digit).uXXXX: Karakter Unicode dengan 3 digit karakter hexadecimal.Backslash sendiri sering digunakan sebagai escape character, misalnya “NaN seringdisebut juga sebagai ”Not a Number“”.2.2.7. Struktur Data dan Representasi JSONJSON (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 3111 "phoneNumber " :12 {13 "home" : "212 555 -1234" ,14 "fax" : "646 555 -4567"15 }16 }1718 console . log ( data . firstName + " " + data . lastName +19 " has this phone number = "20 + data . phoneNumber . home ) ;2122 // hasil:23 // John Smith has this phone number = 212 555 -1234Listing 2.14: Representasi JSONDari representasi di atas, kita bisa membaca:Nilai data “firstname” adalah “John”Data “address” terdiri atas sub data “streetAddress”, “city”, “state”, dan “postal-Code” yang masing-masing mempunyai nilai data sendiri-sendiri.dan seterusnya2.2.8. Aliran KendaliAlur program dikendalikan melalui pernyataan-pernyataan untuk aliran kendali. Adabeberapa pernyataan aliran kendali yang akan dibahas.Pernyataan Kondisi if .. else if .. elsePernyataan ini digunakan untuk mengerjakan atau tidak mengerjakan suatu bagian ataublok program berdasarkan hasil evaluasi kondisi tertentu.1 var kondisi = false ;2 i f ( kondisi ) {3 console . log ( ’hanya dikerjakan jika kondisi bernilai benar/true ’ ) ;4 };5 // hasil: n/a, tidak ada hasilnya6 var kondisi = true ;7 i f ( kondisi ) {8 console . log ( ’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 a d l i n e = r e q u i r e ( ’readline ’ ) ;1415 var r l = r e a d l i n e . c r e a t e I n t e r f a c e ({16 input : process . stdin ,17 output : process . stdout18 } ) ;1920 r l . question ( "Masukkan angka nilai: " , function ( answer ) {21 i f ( answer > 80) {22 console . log ( "Nilai: A" ) ;
    • 2.2. Dasar-dasar JavaScript di Node.js 3223 } else i f ( answer > 70) {24 console . log ( "Nilai: B" ) ;25 } else i f ( answer > 40) {26 console . log ( "Nilai: C" ) ;27 } else i f ( answer > 30) {28 console . log ( "Nilai: D" ) ;29 } else {30 console . log ( "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: CListing 2.15: Pernyataan if .. else if .. elsePernyataan switchPernyataan 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 a d l i n e = r e q u i r e ( ’readline ’ ) ;23 var r l = r e a d l i n e . c r e a t e I n t e r f a c e ({4 input : process . stdin ,5 output : process . stdout6 } ) ;78 console . log ( "Menu" ) ;9 console . log ( "====" ) ;10 console . log ( "1. Mengisi data" ) ;11 console . log ( "2. Mengedit data" ) ;12 console . log ( "3. Menghapus data" ) ;13 console . log ( "4. Mencari data" ) ;14 r l . question ( "Masukkan angka pilihan anda: " , function ( answer ) {15 console . log ( "Pilihan anda: " + answer ) ;16 switch ( answer ) {17 case "1" :18 console . log ( "Anda memilih menu pengisian data" ) ;19 break ;20 case "2" :21 console . log ( "Anda memilih menu pengeditan data" ) ;22 break ;23 case "3" :24 console . log ( "Anda memilih menu penghapusan data" ) ;25 break ;26 case "4" :27 console . log ( "Anda memilih menu pencarian data" ) ;28 break ;29 d e f a u l t :30 console . log ( "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 3336 // 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 dataListing 2.16: Pernyataan Contoh penggunaan “switch”LoopingLooping atau sering juga disebut “kalang” adalah konstruksi program yang digunakanuntuk melakukan suatu blok perintah secara berulang-ulang.for1 f o r ( var i = 0; i < 9; i++) {2 console . log ( i ) ;3 }45 // hasil:6 // 07 // 18 // 29 // 310 // 411 // 512 // 613 // 714 // 8Listing 2.17: Pernyataan forPernyataan “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 console . log ( "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 3410 // Nilai dari iterasi c adalah: 3Listing 2.18: Pernyataan for .. indo .. whilePernyataan ini digunakan untuk mengerjakan suatu blok program selama suatu kondisibernilai benar dengan jumlah minimal pengerjaan sebanyak 1 kali.1 var i = 0;2 do {3 i += 2;4 console . log ( i ) ;5 } while ( i < 2 0 ) ;67 // hasil:8 // 29 // 410 // 611 // 812 // 1013 // 1214 // 1415 // 1616 // 1817 // 20Listing 2.19: Pernyataan do .. whilewhileSeperti do .. while, pernyataan ini digunakan untuk mengerjakan suatu blok programsecara 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 console . log ( "Nilai n = " + n ) ;8 console . log ( "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 = 15Listing 2.20: Pernyataan whilelabel, break, dan continueBagian ini digunakan dalam looping dan switch.
    • 2.2. Dasar-dasar JavaScript di Node.js 35label digunakan untuk memberi pengenal pada suatu lokasi program sehingga bisadireferensi oleh break maupun continue (jika dikehendaki).break digunakan untuk menghentikan eksekusi dan meneruskan alur program kepernyataan setelah looping atau switchcontinue 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 continue ;10 };1112 i f (x>10) {13 break ;14 };1516 console . log ( "Nilai n = " + n ) ;17 console . log ( "Nilai x = " + x ) ;1819 };20 // hasil:21 // Nilai n = 122 // Nilai x = 123 // Nilai n = 224 // Nilai x = 3Listing 2.21: Pernyataan break dan continue1 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 console . log ( "Nilai k = " + k ) ;6 console . log ( "Nilai m = " + m) ;7 break topLabel ;8 }9 }10 }11 // hasil:12 // Nilai k = 013 // Nilai m = 5Listing 2.22: Pernyataan break dengan label2.2.9. Penanganan ErrorJavaScript 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 36JavaScript yang asynchronous. Untuk kasus asynchrous, pemrogram lebih disarankanmenggunakan function callback.1 try {2 gakAdaFungsiIni ( ) ;3 } catch ( e ) {4 console . log ( "Error: " + e . message ) ;5 } f i n a l l y {6 console . log ( "Bagian ’pembersihan ’, akan dikerjakan , apapun yang terjadi" ) ;7 };89 // hasil:10 // Error: gakAdaFungsiIni is not defined11 // Bagian ’pembersihan ’, akan dikerjakan , apapun yang terjadiListing 2.23: Pernyataan try catch finallyJika 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 console . log ( "Error: " + e ) ;6 };78 // hasil:9 // Error: Pembagian oleh angka 0Listing 2.24: Pernyataan try catch throw
    • BAB 3Paradigma Pemrograman di JavaScript3.1. Pemrograman FungsionalPemrograman 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 adabanyak 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 LambdaEkspresi 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 tanpa37
    • 3.1. Pemrograman Fungsional 38ditautkan (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 , operation ) {6 return operation (a , b ) ;7 }89 function add (a , b) {10 return a+b ;11 }1213 function subtract (a , b) {14 return a−b ;15 }1617 console . log ( ’1,2, add: ’ + applyOperation (1 ,2 , add ) ) ;18 console . log ( ’43,21, subtract: ’ + applyOperation (43 ,21 , subtract ) ) ;1920 console . log ( ’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: 64Listing 3.1: Ekspresi Lambda di JavaScript3.1.2. Higher-order FunctionHigher-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 , action ) {2 f o r ( var i = 0; i < array . length ; i++ )3 action ( array [ i ] ) ;4 }56 function print ( word ) {7 console . log ( word ) ;8 }910 function makeUpperCase ( word ) {11 console . log ( word . toUpperCase ( ) ) ;12 }1314 forEach ( [ "satu" , "dua" , "tiga" ] , print ) ;15 forEach ( [ "satu" , "dua" , "tiga" ] , makeUpperCase ) ;1617 // hasil:18 // satu19 //dua20 // tiga21 // SATU22 //DUA
    • 3.1. Pemrograman Fungsional 3923 // TIGAListing 3.2: Higher-order Function di JavaScript3.1.3. ClosureSuatu 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 console . log ( add5 ( 2 ) ) ; // 713 console . log ( add10 ( 2 ) ) ; // 12Listing 3.3: Closure di JavaScript3.1.4. CurryingCurrying 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 }910 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 , args . 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 4026 var addTen = add . curry ( 1 0 ) ;27 console . log ( addTen ( 2 0 ) ) ; //30Listing 3.4: Currying di JavaScript3.2. Pemrograman Berorientasi Obyek3.2.1. PengertianPemrograman 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 ObyekDefinisi 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 e q u i r e ( ’url’ ) ;23 // Definisi obyek4 function Halaman( alamatUrl ) {5 this . u r l = alamatUrl ;6 console . log ( "Mengakses alamat " + alamatUrl ) ;7 }89 Halaman . prototype . getDomainName = function () {10 return u r l . parse ( this . url , 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 4117 var halDua = new Halaman( "http :// bpdp.name/login?fromHome" ) ;1819 console . log ( "Alamat URL yang diakses oleh halSatu = " + halSatu . u r l ) ;20 console . log ( "Alamat URL yang diakses oleh halDua = " + halDua . u r l ) ;2122 console . log ( "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.nameListing 3.5: Definisi obyek di JavaScript3.2.3. Inheritance / PewarisanPewarisan di JavaScript bisa dicapai menggunakan prototype. Listing program berikutmemperlihatkan bagaimana pewarisan diimplementasikan di JavaScript.1 // Definisi obyek2 function Kelas ( param ) {3 this . property1 = new String ( param ) ;4 }56 Kelas . prototype . methodSatu = function () {7 return this . property1 ;8 }910 var kelasSatu = new Kelas ( "ini parameter 1 dari kelas 1" ) ;1112 console . log ( "Property 1 dari kelasSatu = " + kelasSatu . property1 ) ;13 console . log ( "Property 1 dari kelasSatu , diambil dari method = " + kelasSatu . methodSatu ( ) ) ;1415 // Definisi inheritance:16 // SubKelas merupakan anak dari Kelas yang didefinisikan17 // di atas.1819 SubKelas . prototype = new Kelas ( ) ;20 SubKelas . prototype . constructor = SubKelas ;2122 function SubKelas ( param ) {23 this . property1 = new String ( param ) ;24 }2526 // method overriding27 SubKelas . prototype . methodSatu = function ( keHurufBesar ) {28 console . log ( "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 console . log ( "Berada di method dua dari SubKelas" ) ;38 }39
    • 3.2. Pemrograman Berorientasi Obyek 4240 // mari diuji41 var subKelasSatu = new SubKelas ( "Parameter 1 Dari Sub Kelas 1" ) ;4243 console . log ( "Property 1 dari sub kelas 1 = " + subKelasSatu . property1 ) ;44 console . log ( "Property 1 dari sub kelas 1, dr method+param = " + subKelasSatu . methodSatu ( true ) ) ;45 console . log ( "Property 1 dari sub kelas 1, dr method+param = " + subKelasSatu . methodSatu ( false ) ) ;4647 console . log ( 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 SubKelasListing 3.6: Pewarisan di PBO JavaScript
    • BAB 4Mengelola Paket Menggunakan npm4.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 npmSaat 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 of :6 add−user , adduser , apihelp , author , bin , bugs , c , cache ,7 completion , config , ddp , dedupe , deprecate , docs , edit ,8 explore , faq , find , find −dupes , get , help , help−search ,9 home , i , info , 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 , link ,10 l i s t , l l , ln , login , ls , outdated , owner , pack , prefix ,11 prune , publish , r , rb , rebuild , remove , r e s t a r t , rm , root ,12 run−s c r i p t , s , se , search , set , show , shrinkwrap , star ,1beberapa bagian tertulis spesifik lokasi direktori di komputer yang digunakan penulis43
    • 4.2. Menggunakan npm 4413 stars , start , stop , submodule , tag , test , tst , un ,14 u n i n s t a l l , unlink , unpublish , unstar , up , update , version ,15 view , whoami1617 npm <cmd> −h quick help on <cmd>18 npm −l display f u l l usage i n f o19 npm faq commonly asked questions20 npm help <term> search for help on <term>21 npm help npm involved overview2223 Specify c o n f i g s in the ini −formatted f i l e :24 /home/bpdp /. npmrc25 or on the command l i n e via : npm <command> −−key value26 Config i n f o can be viewed via : npm help c o n f i g2728 npm@1. 2 . 1 8 /home/bpdp/ software /node−v0 .10.5 − linux−x86/ l i b /node_modules/npmListing 4.1: Sintaksis lengkap perintah npmPada bagian berikut, kita akan membahas lebih lanjut penggunaan perintah npm terse-but.4.2.1. Instalasi Paketnpm 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 namapaketListing 4.2: Cara install paket menggunakan npmPerintah 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.jsDalam 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 45Jika 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 melihat pada $CWD3 atau4 $ npm l s −g5 −−> untuk melihat pada d i r e k t o r i globa lListing 4.3: Argumen npm untuk melihat daftar paket terpasangSelain 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 . json hello@0 . 0 . 1 No README.md f i l e found !3 hello@0 . 0 . 1 /home/bpdp/ kerjaan / git −repos /buku−cloud−nodejs / s r c /bab−01/ h e l l o4 +−− UNMET DEPENDENCY express 3 . 2 . 25 +−− UNMET DEPENDENCY jade ∗67 npm ERR! missing : express@3 . 2 . 2 , required by hello@0 . 0 . 18 npm ERR! missing : jade@ ∗ , required by hello@0 . 0 . 19 npm ERR! not ok code 010 $Listing 4.4: npm ls pada aplikasi yang paket-paketnya belum terinstallJika 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 / UninstallMenghapus paket pustaka menggunakan npm pada dasarnya hampir sama dengan saatmemasang paket, namun dengan perintah uninstall. Berikut perintah lengkapnya.1 $ npm u n i n s t a l l namapaket2 −−> u n i n s t a l l namapaket di $CWD/node_modules3 atau4 $ npm u n i n s t a l l namapaket −g5 −−> u n i n s t a l l paket di d i r glo balListing 4.5: Perintah menghapus paket di npm4.2.4. Mencari PaketUntuk 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 46Gambar 4.1.: Tampilan “npm ls” pada direktori proyek dengan paket terinstall lengkap1 $ 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 jshashes 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 r y , making the . . .7 passhash Easily and s e c u r e l y hash passwords wi . . .8 pwhash Generate password hashes from the com . . .Listing 4.6: Perintah menghapus paket di npmSetelah menemukan paketnya, pemrogram bisa menginstall langsung ataupun melihatinformasi lebih lanjut tentang pustakan tersebut.4.2.5. Menampilkan Informasi PaketSetelah 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 ’ dist −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 4710 ’ 0 . 3 . 2 ’ ,11 ’ 0 . 4 . 0 ’ ,12 ’ 0 . 5 . 0 ’ ,13 ’ 0 . 5 . 1 ’ ,14 ’ 0 . 5 . 4 ’ ,15 ’ 0 . 5 . 6 ’ ] ,16 maintainers : ’ kaerus <anders@kaerus . com> ’ ,17 time :18 { ’ 0 . 3 . 1 ’ : ’2012−08−09T12 : 0 4 : 3 4 . 5 9 4 Z ’ ,19 ’ 0 . 3 . 2 ’ : ’2012−08−09T12 : 4 9 : 0 2 . 3 2 2 Z ’ ,20 ’ 0 . 4 . 0 ’ : ’2012−09−17T10 : 4 4 : 4 3 . 1 8 7 Z ’ ,21 ’ 0 . 5 . 0 ’ : ’2012−10−01T14 : 5 1 : 3 2 . 6 6 8 Z ’ ,22 ’ 0 . 5 . 1 ’ : ’2012−10−03T22 : 1 1 : 5 8 . 3 7 6 Z ’ ,23 ’ 0 . 5 . 4 ’ : ’2012−10−16T09 : 4 5 : 3 7 . 4 7 7 Z ’ ,24 ’ 0 . 5 . 6 ’ : ’2012−10−26T17 : 3 4 : 2 8 . 4 9 1 Z ’ } ,25 author : ’ Kaerus <contact@kaerus . com> ( http :// kaerus . com ) ’ ,26 r e p o s i t o r y :27 { type : ’ git ’ ,28 u r l : ’ g i t :// github . com/ kaerus /arango−c l i e n t . git ’ } ,29 version : ’ 0 . 5 . 6 ’ ,30 keywords :31 [ ’ arangodb ’ ,32 ’ nosql ’ ,33 ’ qunit ’ ,34 ’amd’ ] ,35 c o n t r i b u t o r s : ’ anders e l o <anders@kaerus . com> ’ ,36 dependencies : { amdefine : ’ >=0.0.2 ’ } ,37 devDependencies : { r e q u i r e j s : ’ >=2.0.6 ’ } ,38 bugs : { u r l : ’ https :// github . com/ kaerus /arango−c l i e n t / i s s u e s ’ } ,39 main : ’ index . js ’ ,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 JSON4.2.6. Memperbaharui PaketJika terdapat versi baru, kita bisa memperbaharui secara otomatis menggunakan argu-men update berikut ini:1 $ npm update2 −−> update paket di $CWD/node_modules3 $ npm update −g4 −−> update paket gl obalListing 4.8: Memperbaharui paket
    • BAB 5Node.js dan Web: Teknik Pengembangan Aplikasi5.1. PendahuluanPada 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.jsonJika ingin memeriksa validitas dari data berformat JSON, pemrogram bisa menggu-nakan validator di http://jsonlint.com.48
    • 5.2. Event-Driven Programming dan EventEmitter 495.2. Event-Driven Programming dan EventEmitterEvent-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:Menu dipilih.Tombol "Submit" di klik.Server menerima permintaan dari klien.Pada dasarnya ada beberapa bagian yang harus disiapkan dari paradigma dan teknikpemrograman ini:main loop atau suatu konstruksi utama program yang menunggu dan mengirimkansinyal event.definisi dari berbagai event yang mungkin munculdefinisi event-handler untuk menangani event yang muncul dan dikirimkan olehmain loopNode.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:server.js: mengaktifkan server http (diambil dari manual Node.js)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 e q u i r e ( ’http ’ ) ;23 http . crea teServer ( function ( req , r e s ) {45 r e s . writeHead (200 , {’Content -Type ’ : ’text/plain ’ } ) ;6 r e s . end ( ’Hello Worldn’ ) ;78 } ) . l i s t e n (1337 , ’127.0.0.1 ’ ) ;910 console . log ( ’Server running at http ://127.0.0.1:1337/ ’ ) ;Listing 5.2: server.js
    • 5.3. Asynchronous / Non-blocking IO dan Callback 501 var net = r e q u i r e ( ’net’ ) ;23 var s e r v e r = net . createS erver ( function ( sock ) {45 // Event dan event -handler6 // ’data ’ => jika ada data yang dikirimkan dari klien7 sock . on ( ’data ’ , function ( data ) {8 console . log ( ’data ’ + sock . remoteAddress + ’: ’ + data ) ;9 } ) ;1011 // ’close ’ => jika koneksi ditutup12 sock . on ( ’close ’ , function ( data ) {13 console . log ( ’koneksi ditutup ’ ) ;14 } ) ;1516 } ) ;1718 s e r v e r . l i s t e n (1337 , function () {19 console . log ( ’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 console . log ( ’Error: host dan port sudah digunakan.’ ) ;26 }2728 } ) ;Listing 5.3: server-on-error.js5.3. Asynchronous / Non-blocking IO dan CallbackAsynchronous 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 e q u i r e ( ’fs’ ) ;2 var sys = r e q u i r e ( ’sys’ ) ;34 sys . puts ( ’Mulai baca file ’ ) ;5 data = f s . readFileSync ( ’./ pegawai.json ’ , "utf -8" ) ;6 console . log ( 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 5116 // "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 fileListing 5.4: Membaca file secara synchronous1 var f s = r e q u i r e ( ’fs’ ) ;2 var sys = r e q u i r e ( ’sys’ ) ;34 sys . puts ( ’Mulai baca file ’ ) ;5 f s . readFile ( ’./ pegawai.json ’ , "utf -8" , function ( err , data ) {6 i f ( e r r ) throw e r r ;7 console . log ( 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 6Mengakses Basis Data NoSQL: mongoDB6.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-fiturnyamongoDB 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%20Page52
    • 6.2. Mengenal mongoDB dan Fitur-fiturnya 53menggunakan format JSON dalam penyimpanan datamendukung indeksmendukung replikasiauto-sharding untuk skalabilitas horizontalquery yang lengkappembaruan data yang cepatmendukung Map/Reducemendukung GridFS6.2.1. Memulai ServerSeperti 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 2 2 : 4 7 : 0 5 . 4 9 54 Sun May 5 2 2 : 4 7 : 0 5 . 4 9 5 warning : 32− b i t s e r v e r s don ’ t have j o u r n a l i n g5 enabled by d e f a u l t . Please use −−journal i f you want d u r a b i l i t y .6 Sun May 5 2 2 : 4 7 : 0 5 . 4 9 57 Sun May 5 2 2 : 4 7 : 0 5 . 5 8 1 [ 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 2 2 : 4 7 : 0 5 . 5 8 1 [ i n i t a n d l i s t e n ]10 Sun May 5 2 2 : 4 7 : 0 5 . 5 8 1 [ 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 2 2 : 4 7 : 0 5 . 5 8 1 [ i n i t a n d l i s t e n ] ∗∗ 32 b i t builds are13 l i m i t e d to l e s s than 2GB of data ( or l e s s with −−journal ) .14 Sun May 5 2 2 : 4 7 : 0 5 . 5 8 1 [ i n i t a n d l i s t e n ] ∗∗ Note that j o u r n a l i n g15 d e f a u l t s to o f f for 32 b i t and i s c u r r e n t l y o f f .16 Sun May 5 2 2 : 4 7 : 0 5 . 5 8 1 [ 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 2 2 : 4 7 : 0 5 . 5 8 1 [ i n i t a n d l i s t e n ]19 Sun May 5 2 2 : 4 7 : 0 5 . 5 8 1 [ i n i t a n d l i s t e n ] db version v2 .4.4 − pre−20 Sun May 5 2 2 : 4 7 : 0 5 . 5 8 1 [ i n i t a n d l i s t e n ] g i t version : n o g i t v e r s i o n21 Sun May 5 2 2 : 4 7 : 0 5 . 5 8 1 [ i n i t a n d l i s t e n ] build 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 2 2 : 4 7 : 0 5 . 5 8 1 [ 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 2 2 : 4 7 : 0 5 . 5 8 1 [ i n i t a n d l i s t e n ] options : { dbpath :26 "./ data" , r e s t : true }27 Sun May 5 2 2 : 4 7 : 0 5 . 7 8 9 [ F i l e A 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 zeroes . . .29 Sun May 5 2 2 : 4 7 : 0 5 . 7 9 0 [ F i l e A 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 2 2 : 4 7 : 0 5 . 9 9 7 [ F i l e A 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 5433 Sun May 5 2 2 : 4 7 : 0 5 . 9 9 8 [ F i l e A 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 zeroes . . .35 Sun May 5 2 2 : 4 7 : 0 6 . 0 8 6 [ F i l e A 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 2 2 : 4 7 : 0 6 . 0 9 1 [ i n i t a n d l i s t e n ] command local . $cmd command:38 { create : "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 2 2 : 4 7 : 0 6 . 0 9 3 [ i n i t a n d l i s t e n ] waiting for connections41 on port 2701742 Sun May 5 2 2 : 4 7 : 0 6 . 0 9 3 [ websvr ] admin web console waiting for43 connections on port 28017Listing 6.1: Menjalankan server MongoDB (mongod)Untuk mengakhiri server, tekan Ctrl-C, mongoDB akan mengakhiri server sebagaiberikut:1 ^CSun May 5 2 2 : 5 2 : 5 2 . 3 4 4 [ signalProcessingThread ] got2 s i g n a l 2 ( Interrupt ) , w i l l terminate a f t e r current cmd ends3 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] now e x i t i n g4 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 dbexit :5 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] shutdown :6 going to c l o s e l i s t e n i n g sockets . . .7 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] c l o s i n g8 l i s t e n i n g socket : 79 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] c l o s i n g10 l i s t e n i n g socket : 811 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] c l o s i n g12 l i s t e n i n g socket : 913 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] removing14 socket f i l e : /tmp/mongodb−27017. sock15 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] shutdown :16 going to f l u s h diaglog . . .17 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] shutdown :18 going to c l o s e sockets . . .19 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] shutdown :20 waiting for f s p r e a l l o c a t o r . . .21 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] shutdown :22 c l o s i n g a l l f i l e s . . .23 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 5 [ signalProcessingThread ] 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 2 2 : 5 2 : 5 2 . 3 4 6 [ signalProcessingThread ] shutdown :26 removing f s lock . . .27 Sun May 5 2 2 : 5 2 : 5 2 . 3 4 6 dbexit : r e a l l y e x i t i n g nowListing 6.2: Mengakhiri server MongoDB (mongod)6.2.2. Klien dan Shell mongoDBSetelah 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 version : 2.4.4 − pre−3 connecting to : test4 Server has startup warnings :
    • 6.2. Mengenal mongoDB dan Fitur-fiturnya 55Gambar 6.1.: Admin web console untuk mongoDB5 Sun May 5 2 2 : 5 6 : 0 0 . 0 1 5 [ i n i t a n d l i s t e n ]6 Sun May 5 2 2 : 5 6 : 0 0 . 0 1 5 [ 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 2 2 : 5 6 : 0 0 . 0 1 5 [ i n i t a n d l i s t e n ] ∗∗ 32 b i t9 builds are l i m i t e d to l e s s than 2GB of data ( or l e s s10 with −−journal ) .11 Sun May 5 2 2 : 5 6 : 0 0 . 0 1 5 [ i n i t a n d l i s t e n ] ∗∗ Note that12 j o u r n a l i n g d e f a u l t s to o f f for 32 b i t and i s c u r r e n t l y o f f .13 Sun May 5 2 2 : 5 6 : 0 0 . 0 1 5 [ 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 2 2 : 5 6 : 0 0 . 0 1 5 [ 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 566.2.3. Documents dan CollectionsKonsep 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 version : 2.4.4 − pre3 connecting to : test4 . . .5 . . . [ jgn pedulikan warning i n i ]6 . . .7 . . .8 > db9 test10 > 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 " , email : " zakyahmadaditya@gmail .com" }17 {18 "name" : "Ahmad" ,19 "address" : " Purwomartani " ,20 "email" : " zakyahmadaditya@gmail .com"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 . find ()36 { "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e " ) , "name" : "Zaky" , "address" :37 "Griya Purwa Asri" }38 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f " ) , "name" : "Ahmad" , "address" :39 " Purwomartani " , "email" : " zakyahmadaditya@gmail .com" }40 { "_id" : ObjectId ( "50 c74b79a7f83cba11e6b220 " ) , "name" : "Aditya" , "address" :41 "Kalasan" , "phone" : "08787878787 " }42 > db . employees . find ( {name : "Ahmad"} )43 { "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f " ) , "name" : "Ahmad" , "address" :44 " Purwomartani " , "email" : " zakyahmadaditya@gmail .com" }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 5751 > db . employees . find ( ) . l i m 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" : " zakyahmadaditya@gmail .com" }56 >Listing 6.4: Sesi dalam shell mongoDBBasis 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 MongoDB6.3.1. Node-gypNode-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−gypListing 6.5: Instalasi node-gypNode-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 mongoDBMengakses 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 / kerberos7 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 / kerberos/−/kerberos −0.0.2. tgz10 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/ kerjaan / git −repos /buku−cloud−nodejs /16 s r c /bab−06/node_modules/mongodb/node_modules/ kerberos17 > ( node−gyp r e b u i l d 2> b u i l d e r r o r . log ) | | ( exit 0)181920 > bson@0 . 1 . 8 i n s t a l l /home/bpdp/ kerjaan / git −repos /buku−cloud−nodejs / s r c /21 bab−06/node_modules/mongodb/node_modules/bson22 > ( node−gyp r e b u i l d 2> b u i l d e r r o r . log ) | | ( exit 0)23
    • 6.3. Node.js dan MongoDB 5824 mongodb@1 . 3 . 0 node_modules/mongodb25 +−− bson@0 . 1 . 826 +−− kerberos@0 . 0 . 227 $Listing 6.6: Instalasi driver mongoDBSolusi lain yang bisa digunakan antara lain adalah:Mongoose (http://mongoosejs.com/)Mongojs (https://github.com/gett/mongojs)Mongolia (https://github.com/masylum/mongolia)Mongoskin (https://github.com/kissjs/node-mongoskin)6.3.3. Mengakses mongoDB dari Node.jsDengan 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 /thunky10 mongojs@0 . 7 . 4 node_modules/mongojs11 +−− thunky@0 . 1 . 012 +−− readable−stream@1 . 0 . 213 $Listing 6.7: Instalasi wrapper mongojsSetelah 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 e q u i r e ( "mongojs" ) . connect ( databaseUrl , c o l l e c t i o n s ) ;45 // mencari pegawai bernama Aditya6 db . employees . find ({name : "Aditya" } , function ( err , employees ) {7 i f ( e r r | | ! employees ) console . log ( "Tidak ada pegawai dengan nama Aditya" ) ;8 else employees . forEach ( function (emps) {9 console . log (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 ) console . log ( "Pegawai ’Bambang ’ gagal disimpan" ) ;
    • 6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 5917 else console . log ( "Data pegawai ’Bambang ’ tersimpan" ) ;18 } ) ;1920 // mengupdate data pegawai : Ahmad21 db . employees . update ({name : "Ahmad" } , { $set : { address : "Finlandia" }} ,22 function ( err , updated ) {23 i f ( e r r | | ! updated ) console . log ( "Data ’Ahmad ’ gagal diperbaharui " ) ;24 else console . log ( "Data ’Ahmad ’ berhasil diperbaharui " ) ;25 } ) ;2627 // Hasil :28 //{ _id : 50 c74b79a7f83cba11e6b220 ,29 // name : ’ Aditya ’ ,30 // address : ’ Kalasan ’ ,31 // phone : ’08787878787 ’ }32 //Data pegawai ’Bambang ’ tersimpan33 //Data ’Ahmad’ b e r h a s i l diperbaharui34 //35 // Hasil di db :36 //> db . employees . find ()37 //{ "_id" : ObjectId ( "50 c74b63a7f83cba11e6b21e " ) , "name" :38 //"Zaky" , "address" : "Griya Purwa Asri" }39 //{ "_id" : ObjectId ( "50 c74b6da7f83cba11e6b21f " ) , "address" :40 //"Finlandia" , "email" : " zakyahmadaditya@gmail .com" , "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.js6.4. Aplikasi Web Menggunakan Node.js dan mongoDBContoh 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 yangdihasilkan dari perintah express tersebut.12 /**3 * Module dependencies .4 */56 var express = r e q u i r e ( ’express ’)7 , routes = r e q u i r e ( ’./ routes ’)8 , user = r e q u i r e ( ’./ routes/employee ’)9 , http = r e q u i r e ( ’http ’)10 , path = r e q u i r e ( ’path ’ ) ;
    • 6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 601112 var app = express ( ) ;1314 // all environments15 app . s e t ( ’port ’ , process . env .PORT | | 3000);16 app . s e t ( ’views ’ , __dirname + ’/views ’ ) ;17 app . s e t ( ’view engine ’ , ’jade ’ ) ;18 app . use ( express . favicon ( ) ) ;19 app . use ( express . logger ( ’dev ’ ) ) ;20 app . use ( express . bodyParser ( ) ) ;21 app . use ( express . methodOverride ( ) ) ;22 app . use ( app . router ) ;23 app . use ( express . 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 ( express . errorHandler ( ) ) ;28 }2930 app . get ( ’/’ , routes . index ) ;31 app . get ( ’/employees ’ , employee . l i s t ) ;3233 http . crea teServer ( app ) . l i s t e n ( app . get ( ’port ’ ) , function (){34 console . log ( ’Express server listening on port ’ + app . get ( ’port ’ ) ) ;35 } ) ;Listing 6.9: Express+MongoDB web: app.js1 {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.json12 /*3 * GET home page.4 */56 exports . 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.jsSelain 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 612 * 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 e q u i r e ( "mongojs" ) . connect ( databaseUrl , c o l l e c t i o n s ) ;89 exports . l i s t = function ( req , r e s ){1011 // mencari dan menampilkan semua pegawai12 db . employees . find ( function ( err , employees ) {13 r e s . render ( ’employee ’ , { listOfEmployee : employees , t i t l e : ’Daftar pegawai ’ } ) ;14 } ) ;1516 };Listing 6.12: Express+MongoDB web: routes/employee.js1 extends layout23 block content4 h1= t i t l e5 p #{ t i t l e }67 each employee in listOfEmployee8 p #{employee . name}Listing 6.13: Express+MongoDB web: views/employee.jade1 extends layout23 block content4 h1= t i t l e5 p6 | Selamat datang di #{ t i t l e }. Aplikasi i n i hanya sekedar contoh7 a p l i k a s i web dengan mongoDB sebagai 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 melihat9 a ( href="/employees" ) daftar pegawai .Listing 6.14: views/index.jade
    • BAB 7Pola Arsitektur Aplikasi Web: MVC dan ExpressJS7.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 MVCMVC (Model-View-Controller) merupakan pola arsitektur aplikasi Web yang memisahkanaplikasi Web menjadi 3 komponen:Model: basis dataView: tampilan antarmuka aplikasi Web, biasanya berisi semacam template danisi-isi dinamis dari tampilan antarmuka tersebut.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 63Gambar 7.1.: Pola arsitektur MVC
    • 7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 647.3. Implementasi Pola Arsitektur MVC MenggunakanExpressJSSebenarnya 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 AplikasiSetelah 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 . json5 |−− public6 | |−− 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 ss10 |−− routes11 | |−− index . j s12 | ‘−− user . j s13 ‘−− views14 |−− index . jade15 ‘−− layout . 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 ExpressJSStruktur 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 . json10 |−− public11 | +−− 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 ss15 +−− views16 +−− index . jade17 +−− layout . jade18
    • 7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 6519 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 MVCBeberapa perubahan terhadap struktur direktori:direktori routes diubah menjadi controllersmembuat direktori models untuk mendefinisikan skema basis data7.3.2. File-file yang DiperlukanBeberapa file diubah isinya dan ada juga file yang baru.12 /**3 * Module dependencies .4 */56 var express = r e q u i r e ( ’express ’)7 , routes = r e q u i r e ( ’./ controllers ’)8 , user = r e q u i r e ( ’./ controllers /user ’)9 , http = r e q u i r e ( ’http ’)10 , path = r e q u i r e ( ’path ’ ) ;1112 var mongoose = r e q u i r e ( ’mongoose ’ ) ;1314 var app = express ( ) ;1516 // all environments17 app . s e t ( ’port ’ , process . env .PORT | | 3000);18 app . s e t ( ’views ’ , __dirname + ’/views ’ ) ;19 app . s e t ( ’view engine ’ , ’jade ’ ) ;20 app . use ( express . favicon ( ) ) ;21 app . use ( express . logger ( ’dev ’ ) ) ;22 app . use ( express . bodyParser ( ) ) ;23 app . use ( express . methodOverride ( ) ) ;24 app . use ( app . router ) ;25 app . use ( express . 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 ( express . errorHandler ( ) ) ;30 }3132 app . get ( ’/’ , c o n t r o l l e r s . index ) ;33 app . get ( ’/users ’ , user . l i s t ) ;3435 http . crea teServer ( app ) . l i s t e n ( app . get ( ’port ’ ) , function (){36 console . log ( ’Express server listening on port ’ + app . get ( ’port ’ ) ) ;37 } ) ;Listing 7.3: app.js1 /*2 * GET employees listing.3 */45 var Employee = r e q u i r e ( ’../ models/db.js’ ) ;
    • 7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya 6667 exports . l i s t = function ( req , r e s ){8 Employee . find ( function ( err , employees ) {9 r e s . send ( employees ) ;10 } ) ;11 };Listing 7.4: controllers/user.js1 var mongoose = r e q u i r e ( ’mongoose ’)2 , Schema = mongoose . Schema ;34 var employeeSchema = new Schema ({5 name : String ,6 address : String ,7 phone : String ,8 email : String9 } ) ;1011 module . exports = mongoose . model ( ’Employee ’ , employeeSchema ) ;Listing 7.5: models/db.js1 {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.json7.3.3. HasilSetelah server dieksekusi (menggunakan perintah node app.js), maka hasilnya akan bisadiakses di http://localhost:3000/users. Hasil di browser bisa dilihat di gambar 7.27.4. Pola Arsitektur Aplikasi Web Lain dan ImplementasinyaMVC 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:MVP (Model-View-Presenter): Google GWT.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 67Gambar 7.2.: Pola arsitektur MVCRVP (Resource-View-Presenter): Flatiron (http://flatironjs.org)MVA (Model-View-Adapter).Hierarchical MVCPresentation-Abstract-Control.
    • BAB 8Real-time Web Menggunakan Socket.io8.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 WebReal-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 TechnologyTeknologi 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)HTML dan CSS untuk presentasi halaman Web68
    • 8.2. Teknologi Pendukung Real-time Web 69DOM (Document Object Model) untuk menampilkan data secara dinamisXML dan XSLT untuk pertukaran data (seringkali tidak menggunakan XML tetapiJSON).Obyek XMLHttpRequest untuk komunikasi asynchronousJavaScript8.2.2. Comet dan Push TechnologyComet 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 ProtocolProtokol 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:server ke klienklien ke serverklien ke klien (melalui server)Spesifikasi lengkap dari protokol ini bisa dilihat di http://svn.cometd.com/trunk/bayeux/bayeux.html.BOSH ProtocolBOSH (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 708.2.3. WebSocketWebSocket 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.io8.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:WebSocketAdobe Flash SocketAJAX long pollingAJAX multipart streamingForever IframeJSONP PollingPustaka ini terdiri atas pustaka untuk sisi klien (browser) dan server (menggunakanNode.js). Browser yang didukung adalah:Internet Explorer 5.5+ (desktop)Safari 3+ (desktop)Google Chrome 4+ (desktop)Firefox 3+ (desktop)Opera 10.61+ (desktop)iPhone Safari (mobile)
    • 8.3. Socket.io 71iPad Safari (mobile)Android WebKit (mobile)WebOs WebKit (mobile)8.3.2. Menggunakan Socket.io untuk Real-time WebSocket.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 AplikasiAplikasi 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 ExpressJSUntuk 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 DiperlukanFile 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 7214 }15 }Listing 8.1: package.jsonSetelah itu. install paket-paket tersebut dengan menggunakan perintah npm install didirektori tersebut.Konfigurasi JavaScript untuk BrowserBrowser juga memerlukan pustaka untuk Socket.io yang diperoleh dari paket socket.io-client. Pada paket tersebut, terdapat direktori dist:1 $ l s −la node_modules/ socket . io−c l i e n t / d i s t /2 t o t a l 4963 drwxr−xr−x 2 bpdp 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 . io . j s6 −rw−r−−r−− 1 bpdp bpdp 44789 Nov 2 2012 socket . io . 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-clientCopy-kan file-file tersebut ke direktori public/javascripts.Hapus File yang Tidak DiperlukanAda beberapa file yang tidak diperlukan dan harus dihapus:routes/user.jsUbah File-file TertentuBeberapa file akan diedit. Beberapa diantaranya akan diuraikan di bagian ini.12 /**3 * Module dependencies .4 */56 var express = r e q u i r e ( ’express ’)7 , app = express ()8 , routes = r e q u i r e ( ’./ routes ’)9 , http = r e q u i r e ( ’http ’)10 , path = r e q u i r e ( ’path ’)11 , s e r v e r = http . createServer ( app )12 , io = r e q u 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 ( express . favicon ( ) ) ;20 app . use ( express . logger ( ’dev ’ ) ) ;
    • 8.3. Socket.io 7321 app . use ( express . bodyParser ( ) ) ;22 app . use ( express . methodOverride ( ) ) ;23 app . use ( app . router ) ;24 app . use ( express . s t a t i c ( path . j o i n (__dirname , ’public ’ ) ) ) ;2526 app . get ( ’/’ , routes . index ) ;2728 io . sockets . on ( ’connection ’ , function ( socket ) {29 socket . emit ( ’kirim ke browser ’ , {30 kalimatDariServer : ’Kalimat ini dikirim dari server ’ } ) ;31 socket . on ( ’dari browser ’ , function ( data ) {32 console . log ( data . kalimatDariBrowser ) ;33 } ) ;34 } ) ;Listing 8.3: app.js1 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 socket = io . connect ( ’ http :// lo c a lh o s t ’ ) ;9 socket . on ( ’ kirim ke browser ’ , function ( data ) {10 document . getElementById ( "container" ) . innerHTML=11 "<p>" + data . kalimatDariServer + " </p>" ;12 socket . emit ( ’ dari browser ’ , {13 kalimatDariBrowser : ’ Kalimat i n i dikirim dari browser ’ } ) ;14 } ) ;15 #container16 p #{ t i t l e }Listing 8.4: views/index.jade1 /∗2 ∗ GET home page .3 ∗/45 exports . index = function ( req , r e s ){6 r e s . render ( ’ index ’ , { t i t l e : ’ Contoh Socket . io + Express ’ } ) ;7 };Listing 8.5: routes/index.jsMenjalankan Server Socket.ioServer socket.io menggunakan port 80 sehingga harus dijalankan oleh root.1 i n f o − socket . io s t a r t e d2 GET / 200 141ms − 628b3 GET / s t y l e s h e e t s / s t y l e . c ss 304 3ms4 GET / j a v a s c r i p t s / socket . io . j s 200 9ms − 98.85 kb5 debug − c l i e n t authorized6 i n f o − handshake authorized LOoIlHJJjOl1g34JtLnP7 debug − s e t t i n g request GET / socket . io /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 authorized for
    • 8.3. Socket.io 7410 debug − websocket writing 1 : :11 debug − websocket writing 5 : : : { "name" : "kirim ke browser" , "args" :12 [{ " kalimatDariServer " : "Kalimat ini dikirim dari server" }]}13 Kalimat i n i dikirim dari browser14 GET / 200 4ms − 628b15 i n f o − transport end ( socket end )16 debug − set c l o s e timeout for c l i e n t LOoIlHJJjOl1g34JtLnP17 debug − c l e a r e d c l o s e timeout for c l i e n t LOoIlHJJjOl1g34JtLnP18 debug − c l e a r e d heartbeat i n t e r v a l for c l i e n t LOoIlHJJjOl1g34JtLnP19 debug − discarding transport20 GET / s t y l e s h e e t s / s t y l e . c ss 304 1ms21 GET / j a v a s c r i p t s / socket . io . j s 304 1ms22 debug − c l i e n t authorized23 i n f o − handshake authorized ijvgksAoa−BWm7uytLnQ24 debug − s e t t i n g request GET / socket . io /1/ websocket / ijvgksAoa−BWm7uytLnQ25 debug − set heartbeat i n t e r v a l for c l i e n t ijvgksAoa−BWm7uytLnQ26 debug − c l i e n t authorized for27 debug − websocket writing 1 : :28 debug − websocket writing 5 : : : { "name" : "kirim ke browser" , "args" :29 [{ " kalimatDariServer " : "Kalimat ini dikirim dari server" }]}30 Kalimat i n i dikirim dari browser31 debug − emitting heartbeat for c l i e n t ijvgksAoa−BWm7uytLnQ32 debug − websocket writing 2 : :33 debug − set heartbeat timeout for c l i e n t ijvgksAoa−BWm7uytLnQ34 debug − got heartbeat packet35 debug − c l e a r e d heartbeat timeout for c l i e n t ijvgksAoa−BWm7uytLnQ36 debug − set heartbeat i n t e r v a l for c l i e n t ijvgksAoa−BWm7uytLnQListing 8.6: Menjalankan server Socket.ioKeluaran 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 . io + Express</ t i t l e>5 <link rel="stylesheet" href="/ stylesheets/style.css">6 </head>7 <body>8 <h1>Contoh Socket . io + Express</h1>9 <p>Contoh Socket . io + Express</p>10 <script src="/ javascripts/socket.io.js"></ script>11 <script>12 var socket = io . connect ( ’ http :// lo c a lh o s t ’ ) ;13 socket . on ( ’ kirim ke browser ’ , function ( data ) {14 document . getElementById ( "container" ) . innerHTML=15 "<p>" + data . kalimatDariServer + " </p>" ;16 socket . emit ( ’ dari browser ’ , {17 kalimatDariBrowser : ’ Kalimat i n i dikirim dari browser ’ } ) ;18 } ) ;19 </ script>20 <div id="container">21 <p>Contoh Socket . io + Express</p>22 </div>23 </body>24 </html>Listing 8.7: Kode sumber di browser
    • 8.3. Socket.io 75Gambar 8.1.: Hasil di browser dari ExpressJS + Socket.ioTampilan di browser bisa dilihat pada gambar 8.1Contoh pada materi ini merupakan contoh sederhana, tetapi diharapkan bisa denganmudah 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
    • Lampiran77
    • LAMPIRAN AGaya Penulisan Kode / Coding StyleA.1. Tentang Gaya Penulisan KodePada 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 Stylenpm’s "funny" coding styleA.2.1. DESCRIPTIONnpm’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 yourcode conform to npm’s style.78
    • A.2. npm’s Coding Style 79A.2.2. Line LengthKeep 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. IndentationTwo-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 bracesCurly braces belong on the same line as the thing that necessitates them. Bad:1 function ()2 {Listing A.1: Bad curly braces placement - 1Good:1 function () {Listing A.2: Good curly braces placement - 1If 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 - 2Good:1 i f ( foo ) bar ()2 while ( foo ) {3 bar ()4 }Listing A.4: Good curly braces placement - 2A.2.5. SemicolonsDon’t use them except in four situations:for (;;) loops. They’re actually required.null loops like: while (something) ; (But you’d better have a good reason fordoing that.)case "foo": doSomething(); break
    • A.2. npm’s Coding Style 80In 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 ( ) ; continue6 case "end" : f i n i s h ( ) ; break7 d e f a u l t : throw new Error ( "unknown state" )8 }9 end ()10 }Listing A.5: Good semicolon usageNote that starting lines with - and + also should be prefixed with a semicolon, butthis is much less common.A.2.6. Comma FirstIf 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 , etc11 , somethingElseListing A.6: Comma firstA.2.7. WhitespacePut 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’tuse more spaces than are helpful.A.2.8. FunctionsUse named functions. They make stack traces a lot easier to read.
    • A.2. npm’s Coding Style 81A.2.9. Callbacks, Sync/async StyleUse 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 theError or null.Be very careful never to ever ever throw anything. It’s worse than useless. Just sendthe error message back as the first argument to the callback.A.2.10. ErrorsAlways create a new Error object with your message. Don’t just return a string messageto the callback. Stack traces are handy.A.2.11. LoggingLogging is done using the npmlog utility.Please clean up logs when they are no longer helpful. In particular, logging the sameobject 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.Use lowerCamelCase for multiword identifiers when they refer to objects, func-tions, methods, members, or anything not specified in this section.Use UpperCamelCase for class names (things that you’d pass to "new").Use all-lower-hyphen-css-case for multiword filenames and config keys.Use named functions. They make stack traces easier to follow.Use CAPS_SNAKE_CASE for constants, things that should never change andare rarely used.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, 0Boolean variables and functions should always be either true or false. Don’t setit to 0 unless it’s supposed to be a number.When something is intentionally missing or removed, set it to null.
    • A.2. npm’s Coding Style 82Don’t set things to undefined. Reserve that value to mean "not yet set to any-thing."Boolean objects are verboten.Selain gaya penulisan kode dari NPM ini, ada beberapa lagi lainnya yang bisa dilihat,antara lain:Spludo http://spludo.com/source/coding-standards/Google JavaScript Style Guide (http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml)Felix’s Node.js Style Guide (http://nodeguide.com/style.html)
    • LAMPIRAN BCommit History dari Penulis Utama dan KontributorBuku 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 Aji 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 ’ of https :// github . com/bpdp/buku−cloud−nodejs10 Menambahkan l i n k ke teks bahasa Indonesia untuk l i s e n s i CC−BY−SA11 Menambahkan l i n k ke teks bahasa Indonesia untuk l i s e n s i CC−BY−SA12 Menambahkan l i n k ke teks bahasa Indonesia 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 kesalahan k e c i l , tidak menutup t e x t i t dengan { tapi |16 Menambahkan indeks dari 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 Flatiron − h a s i l d i r e k t o r i20 Menambahkan tentang p e n u l i s buku21 Bab 1 − s e d i k i t keterangan ttg Node . js , Bab 2 − awal dasar2 JavaScript22 Penambahan i s i di bab 2 dan 723 Update bab 5 −> mengubah NPM mjd npm dan menambahkan ’Apakah npm i t u ? ’24 Makefile => buat clean−a l l dan clean−without−pdf , bab 2 s e l e s a i Readline25 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 v a r i a b 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 u n g 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 kondisi i f . . else i f . . else : s e l e s a i32 Bab 2 − JSON, switch , dan looping for −− s e l e s a i83
    • B. Commit History dari Penulis Utama dan Kontributor 8433 Memperbaiki s e d i k i t typo , kurang satu { di footnote wikipedia utk JSON34 Bab 2 s e l e s a i35 Bab 3 − pengertian PBO dan d e f i n i s i obyek −> s e l e s a i36 Menambahkan Aji Kisworo Mukti ke kontributor di README.md37 Minor r e v i s i o n di bab 5 , menambahkan gambar npmls ( soalnya kode ASCII38 keluarannya kacau di LaTex dan saya blm tau workaround−nya39 Mengubah cover −> l e b i h umum, ganti dg logo NodeJS , menambahkan Aji ke40 kontributor , appendix B −> commit h i s t dari kontributor41 Menambahkan materi PBO => melengkapi d e f i n i s i obyek s e r t a i n h e r i t a n c e .42 Contoh i n h e r i t a n c e . j s ditambahkan43 Bab 3 − Pemrograman f u n g s i o n a l di JS => pengertia + beberapa point yg44 akan dibahas45 Menambahkan i n f o tentang koma−s c r i p t di README.md dan Makefile v e r s i46 t e r a k h i r47 Menambahkan nested f u n c t i o n s di bab 248 Menambahkan source code nested . j s ( bab 2)49 Bab 3 − beberapa penambahan di pemrograman f u n g s i o n a l50 Bab 3 − Lambda Expression + contoh51 Higher−order function − Bab 352 Menyelesaikan Closure dan Currying di Bab 3. Bab 3 sudah s e l e s a i .53 Mengganti struktur − bab 4 −> 5 dan sebaliknya . Bab 4 s e l e s a i , Bab 354 minor rev55 Bab 5 −> (A) Synchronous programming56 Bab 5 −> r e o r g a n 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 e d i k i t penjelasan tentang db NoSQL60 Bab 6 − menambahkan penjelasan ttg mongoDB: f i t u r , server , 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 dari Node . j s . Kurang a p l i k a s i web64 Bab 4: menambahkan i n f o ttg i n s t a l l ke homedir ( j i k a berada dlm home)65 dan node_modules ( j i k a di luar home)66 Bab 6: memulai a p l i k a s i web dengan nodejs+e x p r e s s j s+mongodb67 Bab 6: s r c code utk a p l i k a s i web nodejs+express+mongoDB s e l e s a i68 Bab 6 s e l e s a i69 Reorganisasi bab 7 dan 8 , menghapus db mongoDB, menambahkan README.md70 utk latihan2 di bab 671 Edit README.md bab 672 Menambah i s i bab 7 dan 873 Bab 8: source code utk socket . io74 Bab 8 s e l e s a i , menambahkan contoh a p l i k a s i Socket . io75 S e l e s a i . s e d i k i t pembenahan . hari i n i bab 7 dan 8 s e l e s a i76 Revisi minor bab 6 dan 877 Menambahkan daftar pustaka yang digunakan78 Revisi minor di 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 status −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 software terbaru (7 Jan 2013)+ kata85 pengantar86 update README.md untuk merefleksikan kondisi terbaru87 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 software t g l 22 Maret 201390 Menambahkan status di README.md ( as of March 22 , 2013) , memasukkan91 commit history92 Edit README.md − minor rev93 l i s t i n g dan tampilan2 teks layar skrg diambil 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 8595 Bab 2 s e l e s a i di−migrasi l s t i n p u t l i s t i n g , rename d i r utk k o n s i s t e n s i96 di s r c /97 Mengedit s r c /README.md agar s e s u a i kondisi saat i n i98 Memperbarui semua v e r s i software as of May 6 , 2013. Clean up junkies ,99 typos . Semua source code dan tampilan . txt dipisahkan dari f i l e 2100 LaTeX utk modularitas101 Lihat Changelogs . txt − tanggal 6 Mei 2013102103 Bambang Purnomosidi D. P. ( 1 ) :104 Merge p u l l request #1 from adzymaniac/masterListing B.1: Commit history
    • IndeksAJAX, 68Aliran kendali, 31Array, 28Asynchronous, 50Bayeux Protocol, 69Boolean, 29BOSH, 69Callback, 50Closure, 39Cloud Computing, 1Definisi, 1Karakteristik, 1Model layanan, 3Private, 3Public, 3CloudFoundry, 4vmc, 4Comet, 69CommonJS, 23Currying, 39Dynamically typed, 24ECMAScript, 23Ekspresi Lambda, 37Event-Driven, 49events.EventEmitter, 49Floating-point, 29Fungsi, 26Fungsi Anonim, 27Fungsi rekursif, 27Higher-order Function, 38Identifier, 25if, 31Integer, 29JSON, 30Validator, 48Konstanta, 25Literal, 28Looping, 33mongoDB, 52Driver, 57Multitenancy, 3MVC, 62dan ExpressJS, 64Nested functions, 27Node-gyp, 57Node.js, 4Hosting, 4Non-blocking IO, 50NOSQL, 52npm, 43Cari paket, 4586
    • Indeks 87Hapus paket, 45Info paket, 46install paket, 44Struktur paket, 44Update paket, 47Obyek, 29, 40PBO, 40Penanganan error, 35Pewarisan, 41Pola arsitektur, 62Readline, 23Real-time Web, 68REPL, 21Server-Sent Events, 69Socket.io, 70String, 29switch, 32Tipe data, 24Variabel, 25WebSocket, 70