Documentos de Académico
Documentos de Profesional
Documentos de Cultura
js
Oleh:
Kata Pengantar Selamat datang pada workshop Pengambangan Aplikasi Cloud Computing Menggunakan Node.js. Workshop ini merupakan workshop yang dirancang untuk keperluan memberikan pengetahuan mendasar pengembangan aplikasi berbasis Cloud Computing. Untuk mengikuti materi yang ada pada workshop ini, peserta diwajibkan membawa laptop yang telah terisi berbagai software infrastruktur yang diperlukan dan peserta diwajibkan mengetahui penggunaan software-software tersebut: Sistem operasi Linux (distribusi apa saja) Git (untuk SCM) Ruby dan Rubygem mongoDB (basis data NOSQL) Vim (untuk mengedit source code) Software utama untuk keperluan workshop ini yaitu Node.js serta command line tools dari provider Cloud Computing (materi ini menggunakan fasilitas dari CloudFoundry), akan dibahas pada workshop. Materi akan lebih banyak berorientasi ke command line / shell sehingga para peserta sebaiknya sudah memahami cara-cara menggunakan shell di Linux. Have fun!
Daftar Isi
i iii iv v
1. Pengenalan Cloud Computing dan Infrastruktur Pengembangan Aplikasi Berbasis Node.js 1 1.1. Apa itu Cloud Computing? . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2. Karakteristik Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3. Public dan Private Cloud Computing . . . . . . . . . . . . . . . . . . . . . 3 1.4. Model Layanan Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . 3 1.5. Pengembangan Aplikasi di Cloud Computing . . . . . . . . . . . . . . . . 3 1.6. Node.js dan Cloud Computing . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.7. Layanan Hosting Aplikasi: CloudFoundry . . . . . . . . . . . . . . . . . . 4 1.7.1. Pendaftaran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.7.2. Instalasi Command Line Utilities . . . . . . . . . . . . . . . . . . . 4 1.7.3. Kongurasi di Server Cloud . . . . . . . . . . . . . . . . . . . . . . 9 1.7.4. Instalasi dan Kongurasi Node.js di Komputer Lokal . . . . . . . . 10 1.8. Pengelolaan Aplikasi di Cloud . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.8.1. Push, Delete, Update Aplikasi . . . . . . . . . . . . . . . . . . . . . 11 1.8.2. Menggunakan Framework ExpressJS . . . . . . . . . . . . . . . . . 11 1.8.3. Tanpa Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2. REPL dan Dasar-dasar JavaScript di Node.js 17 2.1. REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.1.1. Mengaktifkan REPL . . . . . . . . . . . . . . . . . . . . . . . . . . 17
ii
Daftar Isi 2.1.2. Perintah-perintah REPL . . . . . . . . . . . . . . . . . . . . 2.2. Dasar-dasar JavaScript di Node.js . . . . . . . . . . . . . . . . . . . 2.2.1. Membaca Masukan dari Stream / Masukan Standar (stdin) 2.2.2. Nilai/Value dan Tipe Data . . . . . . . . . . . . . . . . . . 2.2.3. Variabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.4. Konstanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.5. Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pengertian Fungsi . . . . . . . . . . . . . . . . . . . . . . . Denisi Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . Fungsi Anonim . . . . . . . . . . . . . . . . . . . . . . . . . Fungsi Rekursif . . . . . . . . . . . . . . . . . . . . . . . . . Fungsi di dalam Fungsi / Nested Functions . . . . . . . . . 2.2.6. Literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literal Array . . . . . . . . . . . . . . . . . . . . . . . . . . Literal Boolean . . . . . . . . . . . . . . . . . . . . . . . . . Literal Integer . . . . . . . . . . . . . . . . . . . . . . . . . Literal Floating-point . . . . . . . . . . . . . . . . . . . . . Literal Obyek . . . . . . . . . . . . . . . . . . . . . . . . . . Literal String . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.7. Struktur Data dan Representasi JSON . . . . . . . . . . . . 2.2.8. Aliran Kendali . . . . . . . . . . . . . . . . . . . . . . . . . Pernyataan Kondisi if .. else if .. else . . . . . . . . . . . . Pernyataan switch . . . . . . . . . . . . . . . . . . . . . . . Looping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.9. Penanganan Error . . . . . . . . . . . . . . . . . . . . . . . 3. Paradigma Pemrograman di JavaScript 3.1. Pemrograman Fungsional . . . . . . 3.1.1. Ekspresi Lambda . . . . . . . 3.1.2. Higher-order Function . . . . 3.1.3. Closure . . . . . . . . . . . . 3.1.4. Currying . . . . . . . . . . . . 3.2. Pemrograman Berorientasi Obyek . . 3.2.1. Pengertian . . . . . . . . . . . 3.2.2. Denisi Obyek . . . . . . . . 3.2.3. Inheritance / Pewarisan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
iii 18 19 19 20 21 21 22 22 22 23 23 23 24 24 24 24 25 25 25 26 27 27 27 28 31 32 32 32 33 34 34 35 35 35 36 38 38 38 39 39 40 40
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
4. Mengelola Paket Menggunakan npm 4.1. Apakah npm Itu? . . . . . . . . . . . . . 4.2. Menggunakan npm . . . . . . . . . . . . 4.2.1. Instalasi Paket . . . . . . . . . . 4.2.2. Struktur Instalasi Paket Node.js 4.2.3. Menghapus Paket / Uninstall . . 4.2.4. Mencari Paket . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
Daftar Isi
iv
4.2.5. Menampilkan Informasi Paket . . . . . . . . . . . . . . . . . . . . . 41 4.2.6. Memperbaharui Paket . . . . . . . . . . . . . . . . . . . . . . . . . 42 5. Node.js dan Web: Teknik Pengembangan Aplikasi 5.1. Pendahuluan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Event-Driven Programming dan EventEmitter . . . . . . . . . . . . . . . . 5.3. Asynchronous / Non-blocking IO dan Callback . . . . . . . . . . . . . . . 6. Mengakses Basis Data NoSQL: mongoDB 6.1. Apa itu Basis Data NoSQL? . . . . . . . . . . . . . 6.2. Mengenal mongoDB dan Fitur-turnya . . . . . . . 6.2.1. Memulai Server . . . . . . . . . . . . . . . . 6.2.2. Klien dan Shell mongoDB . . . . . . . . . . 6.2.3. Documents dan Collections . . . . . . . . . 6.3. Node.js dan MongoDB . . . . . . . . . . . . . . . . 6.3.1. Node-gyp . . . . . . . . . . . . . . . . . . . 6.3.2. Driver Node.js untuk mongoDB . . . . . . . 6.3.3. Mengakses mongoDB dari Node.js . . . . . 6.4. Aplikasi Web Menggunakan Node.js dan mongoDB 43 43 44 45 47 47 47 48 49 49 51 51 52 53 54 58 58 58 60 60 61 62 62 64 64 64 64 65 65 65 65 66 66 66 67 67 67 68
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
7. Pola Arsitektur Aplikasi Web: MVC dan ExpressJS 7.1. Apa itu Pola Arsitektur? . . . . . . . . . . . . . . . . . . . . . 7.2. Pola Arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . 7.3. Implementasi Pola Arsitektur MVC Menggunakan ExpressJS 7.3.1. Struktur Aplikasi . . . . . . . . . . . . . . . . . . . . . 7.3.2. File-le yang Diperlukan . . . . . . . . . . . . . . . . . 7.3.3. Hasil . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4. Pola Arsitektur Aplikasi Web Lain dan Implementasinya . . . 8. Real-time Web Menggunakan Socket.io 8.1. Apa itu Real-time Web? . . . . . . . . . . . . . . . . . 8.2. Teknologi Pendukung Real-time Web . . . . . . . . . . 8.2.1. Ajax Technology . . . . . . . . . . . . . . . . . 8.2.2. Comet dan Push Technology . . . . . . . . . . . SSE (Server-Sent Events) . . . . . . . . . . . . Bayeux Protocol . . . . . . . . . . . . . . . . . BOSH Protocol . . . . . . . . . . . . . . . . . . 8.2.3. WebSocket . . . . . . . . . . . . . . . . . . . . 8.3. Socket.io . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1. Apa itu Socket.io? . . . . . . . . . . . . . . . . 8.3.2. Menggunakan Socket.io untuk Real-time Web . Tentang Aplikasi . . . . . . . . . . . . . . . . . Membuat Kerangka Aplikasi dengan ExpressJS Instalasi Paket yang Diperlukan . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
Daftar Isi Kongurasi JavaScript untuk Browser Hapus File yang Tidak Diperlukan . . Ubah File-le Tertentu . . . . . . . . . Menjalankan Server Socket.io . . . . . Daftar Pustaka Lampiran A. Gaya Penulisan Kode / Coding Style A.1. Tentang Gaya Penulisan Kode . . . A.2. npms Coding Style . . . . . . . . . A.2.1. DESCRIPTION . . . . . . A.2.2. Line Length . . . . . . . . . A.2.3. Indentation . . . . . . . . . A.2.4. Curly braces . . . . . . . . A.2.5. Semicolons . . . . . . . . . A.2.6. Comma First . . . . . . . . A.2.7. Whitespace . . . . . . . . . A.2.8. Functions . . . . . . . . . . A.2.9. Callbacks, Sync/async Style A.2.10. Errors . . . . . . . . . . . . A.2.11. Logging . . . . . . . . . . . A.2.12. Case, naming, etc. . . . . . A.2.13. null, undened, false, 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
v 68 68 69 70 72 74 74 74 74 74 75 75 75 75 76 76 76 77 77 77 77 77 79 80
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
Daftar Gambar
Model Cloud Computing . . . . . . . . . . . . . . . Pendaftaran di CF . . . . . . . . . . . . . . . . . . Hasil proses pendaftaran di CF . . . . . . . . . . . E-mail persetujuan dan pemberitahuan credentials Hasil push ke server . . . . . . . . . . . . . . . . . Hasil update dengan menyertakan versi Node.js . . Deployement menggunakan versi runtime tertentu . Hasil deployement app.js tanpa framework . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
2 5 6 7 14 15 15 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.1. Admin web console untuk mongoDB . . . . . . . . . . . . . . . . . . . . . 50 7.1. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 7.2. Pola arsitektur MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 8.1. Hasil di browser dari ExpressJS + Socket.io . . . . . . . . . . . . . . . . . 71
vi
Listing Program
1.1. Instalasi vmc . . . . . . . . . . . . . . . . . . . . . . 1.2. Hasil gem yang terinstall . . . . . . . . . . . . . . . . 1.3. Mengaktifkan direktori "bin" hasil instalasi gem . . . 1.4. Hasil opsi help dari vmc . . . . . . . . . . . . . . . . 1.5. Mengubah target server . . . . . . . . . . . . . . . . 1.6. Login ke server . . . . . . . . . . . . . . . . . . . . . 1.7. Mengubah password server . . . . . . . . . . . . . . . 1.8. Hasil dari download Node.js . . . . . . . . . . . . . . 1.9. Ekstraksi Node.js . . . . . . . . . . . . . . . . . . . . 1.10. Kongurasi variabel lingkungan Node.js . . . . . . . 1.11. Instalasi ExpressJS menggunakan npm . . . . . . . . 1.12. package.json untuk ExpressJS . . . . . . . . . . . . . 1.13. app.js untuk ExpressJS . . . . . . . . . . . . . . . . 1.14. Deployment aplikasi ExpressJS ke CF . . . . . . . . 1.15. Update: menambahkan versi Node.js ke app.js . . . . 1.16. Mengupdate aplikasi di server . . . . . . . . . . . . . 1.17. Menghapus aplikasi yang di-deploy di CF . . . . . . 1.18. Deployment ke CF dengan memilih runtime Node.js 1.19. app.js tanpa framework . . . . . . . . . . . . . . . . 1.20. Deployment app.js tanpa framework . . . . . . . . . 2.1. 2.2. 2.3. 2.4. 2.5. 2.6. 2.7.
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
5 5 6 7 9 9 10 10 11 11 12 13 13 13 14 14 15 15 16 16 17 18 18 20 20 21 21
Node.js REPL . . . . . . . . . . . . . . . . . . . . . . . . . Contoh penggunaan .load dalam REPL . . . . . . . . . . . Contoh penggunaan perintah .save di sesi REPL . . . . . readline.js: penggunaan pustaka Readline untuk masukan Hasil eksekusi readline.js . . . . . . . . . . . . . . . . . . . Fitur dynamically typed language . . . . . . . . . . . . . . Contoh konstanta dalam JavaScript . . . . . . . . . . . . .
vii
Listing Program 2.8. Sintaksis Fungsi dalam JavaScript . . . . . . . 2.9. Pemanggilan Fungsi dalam JavaScript . . . . 2.10. Contoh deklarasi fungsi dan pemanggilannya 2.11. Fungsi anonim . . . . . . . . . . . . . . . . . 2.12. Fungsi rekursif untuk menghitung faktorial . 2.13. Fungsi di dalam Fungsi . . . . . . . . . . . . . 2.14. Array di JavaScript . . . . . . . . . . . . . . . 2.15. Representasi JSON . . . . . . . . . . . . . . . 2.16. Pernyataan if .. else if .. else . . . . . . . . . 2.17. Pernyataan if .. else if .. else . . . . . . . . . 2.18. Pernyataan for . . . . . . . . . . . . . . . . . 2.19. Pernyataan for .. in . . . . . . . . . . . . . . 2.20. Pernyataan do .. while . . . . . . . . . . . . . 2.21. Pernyataan while . . . . . . . . . . . . . . . . 2.22. Pernyataan break dan continue . . . . . . . . 2.23. Pernyataan break dengan label . . . . . . . . 2.24. Pernyataan break dengan label . . . . . . . . 2.25. Pernyataan break dengan label . . . . . . . . 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 4.8. 5.1. 5.2. 5.3. 5.4. 5.5. 6.1. 6.2. 6.3. 6.4. Ekspresi Lambda di JavaScript . . . Higher-order Function di JavaScript Closure di JavaScript . . . . . . . . . Currying di JavaScript . . . . . . . . Denisi obyek di JavaScript . . . . . Pewarisan di PBO JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
viii 22 22 22 23 23 23 24 26 27 27 28 28 29 29 30 30 31 31 33 33 34 34 35 36 38 39 40 40 40 41 42 42 43 44 45 45 46 48 49 49 49
Sintaksis lengkap perintah npm . . . . . . . . . . . . . Cara install paket menggunakan npm . . . . . . . . . . Argumen npm untuk melihat daftar paket terpasang . Perintah menghapus paket di npm . . . . . . . . . . . Perintah menghapus paket di npm . . . . . . . . . . . Menampilkan rincian suatu paket dalam format JSON Memperbaharui paket lokal . . . . . . . . . . . . . . . Memperbaharui paket secara global . . . . . . . . . . . pegawai.json . . . . . . . . . . . . . server.js . . . . . . . . . . . . . . . server-on-error.js . . . . . . . . . . Membaca le secara synchronous . Membaca le secara asynchronous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Menjalankan server MongoDB (mongod) Mengakhiri server MongoDB (mongod) . Shell mongoDB (mongo) . . . . . . . . . Sesi dalam shell mongoDB . . . . . . . .
Listing Program 6.5. Instalasi node-gyp . . . . . . . . . 6.6. Instalasi driver mongoDB . . . . . 6.7. Instalasi driver mongoDB . . . . . 6.8. Mengakses mongoDB dari Node.js 6.9. Mengakses mongoDB dari Node.js 6.10. app.js . . . . . . . . . . . . . . . . 6.11. package.json . . . . . . . . . . . . . 6.12. routes/employee.js . . . . . . . . . 6.13. views/employee.jade . . . . . . . . 6.14. views/index.jade . . . . . . . . . . 7.1. 7.2. 7.3. 7.4. 7.5. 7.6. 8.1. 8.2. 8.3. 8.4. 8.5. 8.6. 8.7. 8.8. A.1. A.2. A.3. A.4. A.5. A.6. Struktur direktori Struktur direktori app.js . . . . . . controllers/user.js models/db.js . . package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ix 51 52 53 53 54 55 56 56 56 57 60 60 61 61 62 62 67 68 68 69 69 69 70 70 75 75 75 75 76 76
Membuat kerangka aplikasi dengan ExpressJS package.json . . . . . . . . . . . . . . . . . . . Isi direktori dist di socket.io-client . . . . . . app.js . . . . . . . . . . . . . . . . . . . . . . views/index.jade . . . . . . . . . . . . . . . . routes/index.js . . . . . . . . . . . . . . . . . Menjalankan server Socket.io . . . . . . . . . Kode sumber di browser . . . . . . . . . . . . Bad curly braces placement - 1 . Good curly braces placement - 1 Bad curly braces placement - 2 . Good curly braces placement - 2 Good semicolon usage . . . . . . Comma rst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Daftar Tabel
BAB
1 2
http://en.wikipedia.org/wiki/Cloud_computing The National Institute of Standards and Technology 3 http://csrc.nist.gov/publications/PubsSPs.html#800-145 4 Gambar dibuat oleh Sam Johnston, diambil dari http://en.wikipedia.org/w/index.php?title= File:Cloud_computing.svg&page=1
Gambar 1.1.: Model Cloud Computing On-demand self-service: layanan bisa diperoleh pada saat diminta, tanpa intervensi atau interaksi manusia di sisi penyedia jasa. Broad network access: tersedia melalui jaringan dengan berbagai peranti yang umum (komputer, tablet, HP, dan lain-lain) Resource pooling: sumber daya komputasi dari penyedia jasa terkumpul untuk melayani. Rapid elasticity: skalabilitas. Measured service: penggunaan sumber daya bisa diukur, di-monitor, dikendalikan, dan dilaporkan. Karakteristik lain yang tidak kalah penting adalah multitenancy. Multitenancy merupakan suatu prinsip dalam arsitektur software. Pada arsitektur tersebut, satu instan dari software berjalan pada server, melayani banyak organisasi klien. Aplikasi dirancang untuk mempartisi data dan kongurasinya secara virtual dan setiap organisasi klien tersebut
1.3. Public dan Private Cloud Computing bekerja dengan instan aplikasi virtual tersebut5 .
http://en.wikipedia.org/wiki/Multitenancy
Upload ke server (dalam Cloud Computing, proses ini diistilahkan dengan push Edit - push Jika pengembangan aplikasi dilakukan oleh tim, maka perlu adanya software untuk version control, misalnya Git, mercurial, dan lain-lain. Setelah itu, aktivitas yang dilakukan biasanya terpusat pada push (untuk mengupload instan dari aplikasi ke server) dan pull (untuk mengambil instan aplikasi dari server).
1.7.1. Pendaftaran
Untuk menggunakan fasilitas dari CF, kita akan mendaftar lebih dahulu di URL https: //mycloudfoundry.com/signup sepert yang terlihat pada Gambar 1.2. Setelah itu, CF akan mengirimkan pemberitahuan bahwa proses pendaftaran selesai seperti di Gambar 1.3. Credentials atau informasi tentang akun kita di CF akan dikirimkan ke e-mail kita seperti pada Gambar 1.4.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
$ gem s e a r c h vmc remote | g r e p " \bvmc\ s " vmc ( 0 . 3 . 2 1 ) $ gem i n s t a l l vmc F e t c h i n g : m u l t i _ j s o n 1 . 3 . 6 . gem (100%) F e t c h i n g : c f o u n d r y 0 . 3 . 3 4 . gem (100%) F e t c h i n g : vmc 0 . 3 . 2 1 . gem (100%) S u c c e s s f u l l y i n s t a l l e d multi_json 1.3.6 S u c c e s s f u l l y i n s t a l l e d cfoundry 0.3.34 S u c c e s s f u l l y i n s t a l l e d vmc 0 . 3 . 2 1 3 gems i n s t a l l e d I n s t a l l i n g r i documentation f o r m u l t i _ j s o n 1 . 3 . 6 . . . I n s t a l l i n g r i documentation f o r c f o u n d r y 0 . 3 . 3 4 . . . I n s t a l l i n g r i documentation f o r vmc 0 . 3 . 2 1 . . . I n s t a l l i n g RDoc documentation f o r m u l t i _ j s o n 1 . 3 . 6 . . . I n s t a l l i n g RDoc documentation f o r c f o u n d r y 0 . 3 . 3 4 . . . I n s t a l l i n g RDoc documentation f o r vmc 0 . 3 . 2 1 . . . $
Listing 1.1: Instalasi vmc Hasil dari instalasi tersebut adalah sebagai berikut:
1 2 3 4 5 $ gem l i s t LOCAL GEMS addressable (2.2.8)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
af ( 0 . 3 . 1 8 . 6 ) bigdecimal ( 1 . 1 . 0 ) cfoundry ( 0 . 3 . 3 4 ) interact (0.4.8) i o c o n s o l e ( 0 . 3 ) json ( 1 . 5 . 4 ) json_pure ( 1 . 6 . 7 ) mimet y p e s ( 1 . 1 9 ) minitest (2.5.1) multi_json ( 1 . 3 . 6 ) rake ( 0 . 9 . 2 . 2 ) rbr e a d l i n e ( 0 . 4 . 2 ) rdoc ( 3 . 9 . 4 ) r e s t c l i e n t ( 1 . 6 . 7 ) rubyzip ( 0 . 9 . 9 ) t e r m i n a l t a b l e ( 1 . 4 . 5 ) uuidtools (2.1.3) vmc ( 0 . 3 . 2 1 ) $
Listing 1.2: Hasil gem yang terinstall Setelah itu, tambahkan baris berikut di $HOME/.bashrc (catatan: "/home/bpdp/" adalah direktori $HOME saya, silahkan sesuaikan dengan tempat anda):
1 export PATH =$PATH: / home/bpdp / . gem/ ruby / 1 . 9 . 1 / b i n
Listing 1.3: Mengaktifkan direktori "bin" hasil instalasi gem Periksa dengan menjalankan opsi help dari vmc:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
$ vmc h e l p Usage : vmc [ o p t i o n s ] command [< a r g s >] [ command_options ] Try vmc h e l p [command] o r vmc h e l p o p t i o n s f o r more i n f o r m a t i o n . C u r r e n t l y a v a i l a b l e vmc commands a r e : Getting Started target [ url ] login [ e m a i l ] [e m a i l , passwd ] info Applications apps Application Creation push [ appname ] push [ appname ] path push [ appname ] u r l push [ appname ] i n s t a n c e s <N > push [ appname ] mem M push [ appname ] r u n t i m e RUNTIME push [ appname ] debug [MODE]
L i s t deployed a p p l i c a t i o n s
Create , push , map , and s t a r t a new a p p l i c a t i o n Push a p p l i c a t i o n from s p e c i f i e d path Set the u r l for the a p p l i c a t i o n S e t t h e e x p e c t e d number <N o f i n s t a n c e s > S e t t h e memory r e s e r v a t i o n f o r t h e a p p l i c a t i o n Set the runtime to use for the a p p l i c a t i o n Push a p p l i c a t i o n and s t a r t i n a debug mode
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
Do not autos t a r t t h e a p p l i c a t i o n
List recent application crashes Display l o g information for crashed a p p l i c a t i o n s Display l o g information for the a p p l i c a t i o n D i s p l a y d i r e c t o r y l i s t i n g o r f i l e download f o r [ path ] Display r e s o u r c e usage for the a p p l i c a t i o n List application instances
L i s t a p p l i c a t i o n e n vi r o nm e n t v a r i a b l e s Add an e nv i r o nm e n t v a r i a b l e t o an a p p l i c a t i o n D e l e t e an e n v ir o n me n t v a r i a b l e t o an a p p l i c a t i o n
L i s t s o f s e r v i c e s a v a i l a b l e and p r o v i s i o n e d Create a p r o v i s i o n e d s e r v i c e C r e a t e a p r o v i s i o n e d s e r v i c e and a s s i g n i t <name> C r e a t e a p r o v i s i o n e d s e r v i c e and a s s i g n i t <name>, and bind t o <app> Delete a provisioned s e r v i c e Bind a s e r v i c e t o an a p p l i c a t i o n Unbind s e r v i c e from t h e a p p l i c a t i o n Clone s e r v i c e b i n d i n g s from <s r c app> a p p l i c a t i o n t o <d e s t app> Create a local tunnel to a s e r v i c e C r e a t e a l o c a l t u n n e l t o a s e r v i c e and s t a r t a local c l i e n t
Display user account information Change t h e password f o r t h e c u r r e n t u s e r Logs c u r r e n t u s e r out o f t h e t a r g e t system R e g i s t e r a new u s e r ( r e q u i r e s admin p r i v i l e g e s ) D e l e t e a u s e r and a l l apps and s e r v i c e s ( r e q u i r e s admin p r i v i l e g e s )
D i s p l a y Micro Cloud Foundry VM s t a t u s C o n f i g u r e Micro Cloud Foundry VM f o r o f f l i n e mode C o n f i g u r e Micro Cloud Foundry VM f o r o n l i n e mode
[vmx f i l e ] [vmrun e x e c u t a b l e ] [password c l e a r t e x t ] [ s a v e ] Misc aliases a l i a s <a l i a s [ = ]command > unalias <a l i a s > targets
Path t o micro . vmx Path t o vmrun e x e c u t a b l e C l e a r t e x t password f o r g u e s t VM vcap u s e r Save c l e a r t e x t password i n ~ / . vmc_micro
Listing 1.5: Mengubah target server Setelah itu, setiap kali kita akan melakukan berbagai proses yang melibatkan server ini, kita harus melakukan proses login terlebih dahulu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ vmc l o g i n Attempting l o g i n t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] Email : bambangpdp@yahoo . com Password : S u c c e s s f u l l y l o g g e d i n t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] $ vmc i n f o VMware s Cloud A p p l i c a t i o n P l a t f o r m For s u p p o r t v i s i t h t t p : / / s u p p o r t . c l o u d f o u n d r y . com T arg et : Client : User : Usage : h t t p : / / a p i . c l o u d f o u n d r y . com ( v0 . 9 9 9 ) v0 . 3 . 2 1 bambangpdp@yahoo . com Memory ( 0B o f 2 . 0G t o t a l )
10
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
S e r v i c e s ( 0 o f 16 t o t a l ) Apps ( 0 o f 20 t o t a l ) $ vmc r u n t i m e s ++++ | Name | Description | Version | ++++ | java | Java 6 | 1.6 | | java7 | Java 7 | 1.7 | | node | Node . j s | 0.4.12 | | node06 | Node . j s | 0.6.8 | | node08 | Node . j s | 0.8.2 | | ruby18 | Ruby 1 . 8 | 1.8.7 | | ruby19 | Ruby 1 . 9 | 1 . 9 . 2 p180 | ++++ $
11
$ t a r x z v f ~/ master / n o d e j s / nodev0 . 8 . 1 1 l i n u x x86 . t a r . gz $ l n s nodev0 . 8 . 1 1 l i n u x x86 n o d e j s $ l s l a .... .... drwxrxrx 6 bpdp u s e r s 4096 Aug 16 0 6 : 1 8 nodev0 . 8 . 1 1 l i n u x x86 lrwxrwxrwx 1 bpdp u s e r s 21 Aug 17 0 6 : 3 7 n o d e j s > nodev0 . 8 . 1 1 l i n u x x86 .... .... $
Listing 1.9: Ekstraksi Node.js Kongurasi variabel lingkungan. Sebaiknya disimpan pada suatu le (pada buku ini, kongurasi akan disimpan di $HOME/environment/nodejs):
1 2 3 4 5 6 7 8 9 10 11 12 13 NODEJS_HOME=/home/bpdp/ s o f t w a r e / n o d e j s PATH =$PATH :$NODEJS_HOME/ b i n MANPATH $MANPATH:$NODEJS_HOME/ s h a r e /man = LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NODEJS_HOME/ l i b C_INCLUDE_PATH=$C_INCLUDE_PATH:$NODEJS_HOME/ i n c l u d e CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$NODEJS_HOME/ i n c l u d e export export export export export PATH MANPATH LD_LIBRARY_PATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH
Listing 1.10: Kongurasi variabel lingkungan Node.js Setiap akan menggunakan Node.js, yang diperlukan adalah men-source le kongurasi tersebut: source /environment/nodejs.
12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
[ bpdp@bpdpa r c h modul 1] $ mkdir h e l l o [ bpdp@bpdpa r c h modul 1] $ cd h e l l o / [ bpdp@bpdpa r c h h e l l o ] $ source ~/ en v i r on m e nt / n o d e j s [ bpdp@bpdpa r c h h e l l o ] $ npm i n s t a l l e x p r e s s npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / e x p r e s s npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / e x p r e s s npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / e x p r e s s // e x p r e s s 3 . 0 . 0 r c 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / e x p r e s s // e x p r e s s 3 . 0 . 0 r c 4 . t g z npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c o n n e c t / 2 . 4 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / send / 0 . 0 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g /commander / 0 . 6 . 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / rangep a r s e r / 0 . 0 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c r c / 0 . 2 . 0 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / mkdirp / 0 . 3 . 3 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / f r e s h / 0 . 1 . 0 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / methods / 0 . 0 . 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / debug npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c o o k i e / 0 . 0 . 4 npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c r c / 0 . 2 . 0 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c r c // c r c 0 . 2 . 0 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / rangep a r s e r / 0 . 0 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / rangep a r s e r //rangep a r s e r 0 . 0 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g /commander / 0 . 6 . 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g /commander//commander 0 . 6 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c o n n e c t / 2 . 4 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c o n n e c t // c o n n e c t 2 . 4 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / send / 0 . 0 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / send //send 0 . 0 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / mkdirp / 0 . 3 . 3 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / mkdirp//mkdirp 0 . 3 . 3 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / f r e s h / 0 . 1 . 0 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / f r e s h // f r e s h 0 . 1 . 0 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / methods / 0 . 0 . 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / methods//methods 0 . 0 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c o o k i e / 0 . 0 . 4 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / c o o k i e // c o o k i e 0 . 0 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c r c // c r c 0 . 2 . 0 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / rangep a r s e r //rangep a r s e r 0 . 0 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / debug npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g /commander//commander 0 . 6 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c o n n e c t // c o n n e c t 2 . 4 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / send //send 0 . 0 . 4 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / mkdirp//mkdirp 0 . 3 . 3 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / f r e s h // f r e s h 0 . 1 . 0 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / methods//methods 0 . 0 . 1 . t g z npm WARN package . j s o n methods@0 . 0 . 1 No README. md f i l e found ! npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / c o o k i e // c o o k i e 0 . 0 . 4 . t g z npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g /mime / 1 . 2 . 6 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / qs / 0 . 4 . 2 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / b y t e s / 0 . 1 . 0 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / f o r m i d a b l e / 1 . 0 . 1 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / pause / 0 . 0 . 1 npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / qs / 0 . 4 . 2 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / qs //qs 0 . 4 . 2 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g /mime / 1 . 2 . 6 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g /mime//mime 1 . 2 . 6 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / pause / 0 . 0 . 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / pause //pause 0 . 0 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / f o r m i d a b l e / 1 . 0 . 1 1 npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / f o r m i d a b l e // f o r m i d a b l e 1 . 0 . 1 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / b y t e s / 0 . 1 . 0
13
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
Listing 1.11: Instalasi ExpressJS menggunakan npm Aplikasi yang dibuat terdiri atas package.json untuk mendenisikan aplikasi serta dependensi-nya dan app.js yang merupakan le utama untuk dijalankan pada server.
1 2 3 4 5 6 7 { " name " : " hello - node " , " version " : " 0.0.1 " , " dependencies " : { " express " : " " } }
Listing 1.13: app.js untuk ExpressJS Proses deployment digambarkan sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 $ vmc t a r g e t a p i . c l o u d f o u n d r y . com S u c c e s s f u l l y t a r g e t e d t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] $ vmc l o g i n Attempting l o g i n t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] Email : bambangpdp@yahoo . com Password : S u c c e s s f u l l y l o g g e d i n t o [ h t t p : / / a p i . c l o u d f o u n d r y . com ] $ vmc push Would you l i k e t o d e p l o y from t h e c u r r e n t d i r e c t o r y ? [ Yn ] : Y A p p l i c a t i o n Name : modul1h e l l o D e t e c t e d a Node . j s A p p l i c a t i o n , i s t h i s c o r r e c t ? [ Yn ] : Y
14
Listing 1.14: Deployment aplikasi ExpressJS ke CF Hasilnya terlihat pada tampilan browser di Gambar 1.5 Aplikasi yang sudah dibuat seringkali diubah, oleh karena itu vmc juga menyediakan fasilitas untuk Mengupdate aplikasi.
1 2 3 4 5 6 7 8 var e x p r e s s = r e q u i r e ( " express " ) ; var app = e x p r e s s ( ) ; app . g e t ( / , function ( req , r e s ) { r e s . send ( Hello from Cloud Foundry with NodeJS + p r o c e s s . v e r s i o n ) ; }); app . l i s t e n ( 3 0 0 0 ) ; $
Listing 1.16: Mengupdate aplikasi di server Hasilnya bisa dilihat di Gambar 1.6
15
Gambar 1.7.: Deployement menggunakan versi runtime tertentu Untuk menghapus aplikasi:
1 2 3 4 $ vmc d e l e t e modul1h e l l o D e l e t i n g a p p l i c a t i o n [ modul1h e l l o ] : OK $
Listing 1.17: Menghapus aplikasi yang di-deploy di CF Pada saat deployment, kita juga bisa memilih versi Node.js (runtime) sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [ bpdp@bpdpa r c h h e l l o ] $ vmc push r u n t i m e=node08 Would you l i k e t o d e p l o y from t h e c u r r e n t d i r e c t o r y ? [ Yn ] : Y A p p l i c a t i o n Name : bpdpm1h e l l o D e t e c t e d a Node . j s A p p l i c a t i o n , i s t h i s c o r r e c t ? [ Yn ] : Y A p p l i c a t i o n Deployed URL [ bpdpm1h e l l o . c l o u d f o u n d r y . com ] : Memory r e s e r v a t i o n ( 1 2 8M, 256M, 512M, 1G, 2G) [ 6 4M] : How many i n s t a n c e s ? [ 1 ] : C r e a t e s e r v i c e s t o bind t o bpdpm1h e l l o ? [ yN ] : N Would you l i k e t o s a v e t h i s c o n f i g u r a t i o n ? [ yN ] : N C r e a t i n g A p p l i c a t i o n : OK Uploading A p p l i c a t i o n : Checking f o r a v a i l a b l e r e s o u r c e s : OK P r o c e s s i n g r e s o u r c e s : OK Packing a p p l i c a t i o n : OK Uploading ( 1 5K) : OK Push S t a t u s : OK S t a g i n g A p p l i c a t i o n bpdpm1h e l l o : OK S t a r t i n g A p p l i c a t i o n bpdpm1h e l l o : OK $
Listing 1.18: Deployment ke CF dengan memilih runtime Node.js Hasilnya bisa dilihat di Gambar 1.7
16
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var h t t p = r e q u i r e ( http ) ; var u r l = r e q u i r e ( " url " ) ; h t t p . c r e a t e S e r v e r ( function ( req , r e s ) { var pathname = u r l . p a r s e ( r e q . u r l ) . pathname ; res res res res . writeHead ( 2 0 0 , { Content - Type : text / html } ) ; . w r i t e ( " Hello NodeJS <u > " + p r o c e s s . v e r s i o n + " </u > " ) ; . w r i t e ( " < br / > Request for <b > " + pathname + " </b > received . " ) ; . end ( ) ;
Listing 1.19: app.js tanpa framework Proses deployement adalah sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ vmc push r u n t i m e=node08 Would you l i k e t o d e p l o y from t h e c u r r e n t d i r e c t o r y ? [ Yn ] : Y A p p l i c a t i o n Name : bpdpm1h e l l o n o f r a m e w o r k D e t e c t e d a Node . j s A p p l i c a t i o n , i s t h i s c o r r e c t ? [ Yn ] : Y A p p l i c a t i o n Deployed URL [ bpdpm1h e l l o n o f r a m e w o r k . c l o u d f o u n d r y . com ] : Memory r e s e r v a t i o n ( 1 2 8M, 256M, 512M, 1G, 2G) [ 6 4M] : How many i n s t a n c e s ? [ 1 ] : C r e a t e s e r v i c e s t o bind t o bpdpm1h e l l o n o f r a m e w o r k ? [ yN ] : N Would you l i k e t o s a v e t h i s c o n f i g u r a t i o n ? [ yN ] : N C r e a t i n g A p p l i c a t i o n : OK Uploading A p p l i c a t i o n : Checking f o r a v a i l a b l e r e s o u r c e s : OK Packing a p p l i c a t i o n : OK Uploading ( 0K) : OK Push S t a t u s : OK S t a g i n g A p p l i c a t i o n bpdpm1h e l l o n o f r a m e w o r k : OK S t a r t i n g A p p l i c a t i o n bpdpm1h e l l o n o f r a m e w o r k : OK $
Listing 1.20: Deployment app.js tanpa framework Hasilnya bisa dilihat pada Gambar 1.8
BAB
2.1. REPL
REPL adalah lingkungan pemrograman interaktif, tempat developer bisa mengetikkan program per baris dan langsung mengeksekusi hasilnya. Biasanya ini digunakan untuk menguji perintah-perintah yang cukup dijalankan pada satu baris atau satu blok segmen kode sumber saja. Karena fungsinya itu, maka istilah yang digunakan adalah REPL (read-eval-print-loop), yaitu loop atau perulangan baca perintah - evaluasi perintah - tampilkan hasil. REPL sering juga disebut sebagai interactive top level atau language shell. Tradisi ini sudah dimulai sejak jaman LISP di mesin UNIX di era awal pengembangan development tools. Saat ini hampir semua interpreter/compiler mempunyai REPL, misalnya Python, Ruby, Scala, PHP, berbagai interpreter/compiler LISP, dan tidak ketinggalan Node.js.
Sometimes you g e t s t u c k , t h i s g e t s you out A l i a s f o r . break Exit the r e p l Show r e p l o p t i o n s Load JS from a f i l e i n t o t h e REPL s e s s i o n Save a l l e v a l u a t e d commands i n t h i s REPL s e s s i o n t o a f i l e
17
2.1. REPL
18
Tanda > adalah tanda bahwa REPL Node.js siap untuk menerima perintah. Untuk melihat perintah-perintah REPL, bisa digunakan .help.
Listing 2.2: Contoh penggunaan .load dalam REPL Setelah keluar dari sesi REPL, maka port akan ditutup dan hasil eksekusi di atas akan dibatalkan. Untuk menyimpan hasil sesi REPL menggunakan .save, jika tanpa menyebutkan direktori, maka akan disimpan di direktori aktif saat itu. Contoh:
1 2 3 4 5 $ node > c o n s o l e . l o g ( " Selamat datang di Node . js " ) Selamat datang d i Node . j s undefined > . s a v e /home/bpdp/ k e r j a a n / s r c / j a v a s c r i p t / n o d e j s / h e l l o . j s
19
6 7 8
S e s s i o n s a v e d t o : / home/bpdp/ k e r j a a n / s r c / j a v a s c r i p t / n o d e j s / h e l l o . j s > [ bpdp@bpdpa r c h ~ ] $ cat /home/bpdp/ k e r j a a n / s r c / j a v a s c r i p t / n o d e j s / h e l l o . j s c o n s o l e . l o g ( " Selamat datang di Node . js " )
20
1 2 3 4 5 6 7 8 9 10 11 12
var r e a d l i n e = r e q u i r e ( readline ) ; var r l = r e a d l i n e . c r e a t e I n t e r f a c e ( { input : process . stdin , o ut pu t : p r o c e s s . s t d o u t }); r l . q u e s t i o n ( " What do you think of node . js ? " , function ( answer ) { c o n s o l e . l o g ( " Thank you for your valuable feedback : " , answer ) ; rl . close (); });
Listing 2.4: readline.js: penggunaan pustaka Readline untuk masukan Hasilnya adalah sebagai berikut:
1 2 3 4 [ bpdp@bpdpa r c h modul 2] $ node r e a d l i n e . j s What do you t h i n k o f node . j s ? awesome ! Thank you f o r your v a l u a b l e f e e d b a c k : awesome ! [ bpdp@bpdpa r c h modul 2] $
Catatan: function(answer) pada listing di atas merupakan anonymous function atau fungsi anonimus (sering juga disebut lambda function / fungsi lambda. Posisi fungsi pada listing tersebut disebut dengan fungsi callback. Untuk keperluan pembahasan saat ini, untuk sementara yang perlu dipahami adalah hasil input akan dimasukkan ke answer untuk diproses lebih lanjut. Fungsi dan callback akan dibahas lebih lanjut pada pembahasan berikutnya.
21
1 2 3
var jumlahMahasiswa = 30 c o n s o l e . l o g ( Jumlah mahasiswa dalam satu kelas = + jumlahMahasiswa ) ; // Jumlah mahasiswa dalam satu kelas = 30
Listing 2.6: Fitur dynamically typed language Pada contoh di atas, kita bisa melihat bahwa data akan dikonversi secara otomatis pada saat program dieksekusi.
Catatan: Khusus untuk operator "+", JavaScript akan melakukan penggabungan string (string concatenation), tetapi untuk operator lain, akan dilakukan operasi matematis sesuai operator tersebut (-,/,*). Konversi string ke tipe numerik bisa dilakukan dengan parseInt(string) (jika bilangan bulat) dan parseFloat(string) (jika bilangan pecahan).
2.2.3. Variabel
Variabel adalah suatu nama yang didenisikan untuk menampung suatu nilai. Nama ini akan digunakan sebagai referensi yang akan menunjukkan ke nilai yang ditampungnya. Nama variabel disebut dengan identier / pengenal. Ada beberapa syarat pemberian nama identier di JavaScript: Dimulai dengan huruf, underscore (_), atau tanda dollar ($). Karakter berikutnya bisa berupa angka, selain ketentuan pertama di atas. Membedakan huruf besar - kecil. Konvensi yang digunakan oleh pemrogram JavaScript terkait dengan penamaan ini adalah variasi dari metode camel case, yaitu camelBack. Contoh: jumlahMahasiswa, linkMenu, status.
2.2.4. Konstanta
Konstanta mirip dengan variabel, hanya saja sifatnya read-only, tidak bisa diubah-ubah setelah ditetapkan. Untuk menetapkan konstanta di JavaScript, digunakan kata kunci const. Contoh:
1 c o n s t DEFAULT\_MENU = Home ;
Listing 2.7: Contoh konstanta dalam JavaScript Konvensi penamaan konstanta adalah menggunakan huruf besar semua. Bagian ini (sampai saat buku ini ditulis) hanya berlaku di Firefox dan Google Chrome - V8 (artinya berlaku juga untuk Node.js).
22
2.2.5. Fungsi
Pengertian Fungsi Fungsi merupakan subprogram atau suatu bagian dari keseluruhan program yang ditujukan untuk mengerjakan suatu pekerjaan tertentu dan (biasanya) menghasilkan suatu nilai kembalian. Subprogram ini relatif independen terhadap bagian-bagian lain sehingga memenuhi kaidah "bisa-digunakan-kembali" atau reusable pada beberapa program yang memerlukan fungsionalitasnya. Fungsi dalam ilmu komputer sering kali juga disebut dengan prcedure, routine, atau method. Denisi Fungsi Denisi fungsi dari JavaScript di Node.js bisa dilakukan dengan sintaksis berikut ini:
1 2 3 4 5 6 7 8 function namaFungsi ( argumen1 , argumen2 , .. J a v a S c r i p t code . . J a v a S c r i p t code . . J a v a S c r i p t code . . J a v a S c r i p t code . . .. } ... , argumentN ) {
Listing 2.8: Sintaksis Fungsi dalam JavaScript Setelah dideklarasikan, fungsi tersebut bisa dipanggil dengan cara sebagai berikut:
1 2 3 4 5 .. .. namaFungsi ( argumen1 , argumen2 , .. .. . . . , argumenN ) ;
Listing 2.9: Pemanggilan Fungsi dalam JavaScript Contoh dalam program serta pemanggilannya adalah sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ node > function addX ( angka ) { . . . c o n s o l e . l o g ( angka + 1 0 ) ; ... } undefined > addX ( 2 0 ) ; 30 undefined > > function add2Numbers ( angka1 , angka2 ) { . . . return angka1 + angka2 ; ... } undefined > c o n s o l e . l o g ( " 232 + 432 = " + add2Numbers ( 2 3 2 , 4 3 2 ) ) ; 232 + 432 = 664 undefined >
23
Fungsi anonim adalah fungsi tanpa nama, pemrogram tidak perlu memberikan nama ke fungsi. Biasanya fungsi anonimus ini hanya digunakan untuk fungsi yang dikerjakan pada suatu bagian program saja dan tidak dengan maksud untuk dijadikan komponen yang bisa dipakai di bagian lain dari program (biasanya untuk menangani event atau callback ). Untuk mendeklarasikan fungsi ini, digunakan literal function.
1 2 3 var pangkat = function ( angka ) { return angka angka } ; c o n s o l e . l o g ( pangkat ( 1 0 ) ) ; // output : 100
Fungsi Rekursif Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri. Contoh dari aplikasi fungsi rekursif adalah pada penghitungan faktorial berikut:
1 2 3 4 5 6 function f a c t o r i a l ( n ) { i f ( ( n == 0 ) | | ( n == 1 ) ) return 1 ; else return ( n f a c t o r i a l ( n 1 ) ) ; }
Fungsi di dalam Fungsi / Nested Functions Saat mendenisikan fungsi, di dalam fungsi tersebut pemrogram bisa mendenisikan fungsi lainnya. Meskipun demikian, fungsi yang terletak dalam suatu denisi fungsi tidak bisa diakses dari luar fungsi tersebut dan hanya tersedia untuk fungsi yang didenisikan.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 function induk ( ) { var awal = 0 ; function tambahkan ( ) { awal++; } tambahkan ( ) ; tambahkan ( ) ; c o n s o l e . l o g ( Nilai = + awal ) ; } induk ( ) ; tambahkan ( ) ; // // // // // // // // Hasil : Nilai = 2 / home / bpdp / kerjaan / git - repos / buku - cloud - nodejs / src / modul -2/ nested . js :12 tambahkan (); ^ Ref erence Error : tambahkan is not defined at Object . < anonymous > (/ home / bpdp / kerjaan / git - repos / buku - cloud - nodejs /
24
22 23 24 25 26 27 28 29
// // // // // // // //
at at at at at at
src / modul -2/ nested . js :12:1) Module . _compile ( module . js :449:26) Object . Module . _extensions .. js ( module . js :467:10) Module . load ( module . js :356:32) Function . Module . _load ( module . js :312:12) Module . runMain ( module . js :492:10) process . startup . pr o ce ss N ex t Ti ck . process . _tickCallback ( node . js :244:9)
2.2.6. Literal
Literal digunakan untuk merepresentasikan nilai dalam JavaScript. Ada beberapa tipe literal. Literal Array Array atau variabel berindeks adalah penampung untuk obyek yang menyerupai list atau daftar. Obyek array juga menyediakan berbagai fungsi dan metode untuk mengolah anggota yang terdapat dalam daftar tersebut (terutama untuk operasi traversal dan permutasi. Listing berikut menunjukkan beberapa operasi untuk literal array.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var arrMembers = [ one , two , , three , ] ; // sengaja ada koma di bagian akhir c o n s o l e . l o g ( arrMembers [ 0 ] ) ; // hasil : one c o n s o l e . l o g ( arrMembers [ 2 ] ) ; // hasil : undefined c o n s o l e . l o g ( arrMembers [ 3 ] ) ; // hasil : three c o n s o l e . l o g ( arrMembers [ 4 ] ) ; // hasil : undefined - karena tidak ada c o n s o l e . l o g ( arrMembers . l e n g t h ) ; // hasil : 4 var m u l t i A r r a y = [ [ 0 -0 , 0 -1 , 0 -2 ] , [ 1 -0 , 1 -1 , 1 -2 ] , [ 2 -0 , 2 -1 , 2 -2 ] ] ; c o n s o l e . log ( multiArray [ 0 ] [ 2 ] ) ; // hasil : 0 -2 c o n s o l e . log ( multiArray [ 1 ] [ 2 ] ) ; // hasil : 1 -2
Listing 2.14: Array di JavaScript Literal Boolean Literal boolean menunjukkan nilai benar (true) atau salah (false). Literal Integer Literal integer digunakan untuk mengekspresikan nilai bilangan bulat. Nilai bulangan bulat dalam JavaScript bisa dalam bentuk:
2.2. Dasar-dasar JavaScript di Node.js decimal (basis 10): digit tanpa awalan nol. octal (basis 8): digit diawali dengan 1 angka nol.2 hexadecimal (basis 16): digit diawali dengan 0x. Literal Floating-point
25
Literal ini digunakan untuk mengekspresikan nilai bilangan pecahan, misalnya 0.4343 atau bisa juga menggunakan E/e (nilai eksponensial), misalnya -3.1E12. Literal Obyek Literal ini akan dibahas di bab yang menjelaskan tentang paradigma pemrograman berorientasi obyek di JavaScript. Literal String Literal string mengekspresikan suatu nilai dalam bentuk sederetan karakter dan berada dalam tanda petik (ganda/ maupun tunggal/). Contoh: Kembali ke halaman utama Lisensi Hari ini, Jumat, tanggal 21 November 1234.543 baris pertama \n baris kedua Contoh terakhir di atas menggunakan karakter khusus (\n). Beberapa karakter khusus lainnya adalah: \b: Backspace \f: Form feed \n: New line \r: Carriage return \t: Tab \v: Vertical tab \: Apostrophe atau single quote \": Double quote
2
26
\XXX: Karakter dengan pengkodean Latin-1 dengan tiga digit octal antara 0 and 377. (misal, \251 adalah simbol hak cipta). \xXX: seperti di atas, tetapi hexadecimal (2 digit). \uXXXX: Karakter Unicode dengan 3 digit karakter hexadecimal. Backslash sendiri sering digunakan sebagai escape character, misalnya NaN sering disebut juga sebagai \Not a Number\.
Listing 2.15: Representasi JSON Dari representasi di atas, kita bisa membaca: Nilai data rstname adalah John Data address terdiri atas sub data streetAddress, city, state, dan postalCode yang masing-masing mempunyai nilai data sendiri-sendiri. dan seterusnya
http://en.wikipedia.org/wiki/JSON
27
Pernyataan switch Pernyataan ini digunakan untuk mengevaluasi suatu ekspresi dan membandingkan sama atau tidaknya dengan suatu label tertentu di dalam struktur pernyataan switch, serta mengeksekusi perintah-perintah sesuai dengan label yang cocok.
1 2 3 4 5 var r e a d l i n e = r e q u i r e ( readline ) ; var r l = r e a d l i n e . c r e a t e I n t e r f a c e ( { input : process . stdin , ou tp ut : p r o c e s s . s t d o u t
28
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
}); c o n s o l e . l o g ( " Menu " ) ; c o n s o l e . l o g ( " ==== " ) ; c o n s o l e . l o g ( " 1. Mengisi data " ) ; c o n s o l e . l o g ( " 2. Mengedit data " ) ; c o n s o l e . l o g ( " 3. Menghapus data " ) ; c o n s o l e . l o g ( " 4. Mencari data " ) ; r l . q u e s t i o n ( " Masukkan angka pilihan anda : " , function ( answer ) { c o n s o l e . l o g ( " Pilihan anda : " + answer ) ; switch ( answer ) { case " 1 " : c o n s o l e . l o g ( " Anda memilih menu pengisian data " ) ; break ; case " 2 " : c o n s o l e . l o g ( " Anda memilih menu pengeditan data " ) ; break ; case " 3 " : c o n s o l e . l o g ( " Anda memilih menu penghapusan data " ) ; break ; case " 4 " : c o n s o l e . l o g ( " Anda memilih menu pencarian data " ) ; break ; default : c o n s o l e . l o g ( " Anda tidak memilih salah satu dari menu di atas " ) ; break ; } rl . close (); });
Looping Looping atau sering juga disebut kalang adalah konstruksi program yang digunakan untuk melakukan suatu blok perintah secara berulang-ulang. for
1 2 3 4 5 6 7 8 9 10 11 12 13 f o r ( var i = 0 ; i < 9 ; i ++) { console . log ( i ) ; } // hasil : // 0 // 1 // 2 // 3 // 4 // 5 // 6 // 7 // 8
Listing 2.18: Pernyataan for Pernyataan for juga bisa digunakan untuk mengakses data yang tersimpam dalam struktur data JavaScript (JSON).
1 2 var data = { a : 1 , b : 2 , c : 3 } ;
29
3 4 5 6 7 8 9
f o r ( var i t e r a s i in data ) { c o n s o l e . l o g ( " Nilai dari iterasi " + i t e r a s i + " adalah : " + data [ i t e r a s i ] ) ; } // hasil : // Nilai dari iterasi a adalah : 1 // Nilai dari iterasi b adalah : 2 // Nilai dari iterasi c adalah : 3
Listing 2.19: Pernyataan for .. in do .. while Pernyataan ini digunakan untuk mengerjakan suatu blok program selama suatu kondisi bernilai benar dengan jumlah minimal pengerjaan sebanyak 1 kali.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var i = 0 ; do { i += 2 ; console . log ( i ) ; } while ( i < 2 0 ) ; // hasil : // 2 // 4 // 6 // 8 // 10 // 12 // 14 // 16 // 18 // 20
Listing 2.20: Pernyataan do .. while while Seperti do .. while, pernyataan ini digunakan untuk mengerjakan suatu blok program secara berulang-ulang selama kondisi bernilai benar. Meskipun demikian, bisa saja blok program tersebut tidak pernah dikerjakan jika pada saat awal expresi dievaluasi sudah bernilai false.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var n = 0 ; var x = 0 ; while ( n < 5 ) { n ++; x += n ; c o n s o l e . l o g ( " Nilai n = " + n ) ; c o n s o l e . l o g ( " Nilai x = " + x ) ; } // hasil : // Nilai n = 1 // Nilai x = 1 // Nilai n = 2 // Nilai x = 3 // Nilai n = 3 // Nilai x = 6 // Nilai n = 4 // Nilai x = 10 // Nilai n = 5 // Nilai x = 15
2.2. Dasar-dasar JavaScript di Node.js Listing 2.21: Pernyataan while label, break, dan continue Bagian ini digunakan dalam looping dan switch.
30
label digunakan untuk memberi pengenal pada suatu lokasi program sehingga bisa direferensi oleh break maupun continue (jika dikehendaki). break digunakan untuk menghentikan eksekusi dan meneruskan alur program ke pernyataan setelah looping atau switch continue digunakan untuk meneruskan eksekusi ke iterasi atau ke kondisi switch berikutnya.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var n = 0 ; var x = 0 ; while ( n < 5 ) { n ++; x += n ; i f ( x%2 == 0 ) { continue ; }; i f ( x >10) { break ; }; c o n s o l e . l o g ( " Nilai n = " + n ) ; c o n s o l e . l o g ( " Nilai x = " + x ) ; }; // hasil : // Nilai n // Nilai x // Nilai n // Nilai x
= = = =
1 1 2 3
31
Listing 2.24: Pernyataan break dengan label Jika diperlukan, kita bisa mendenisikan sendiri error dengan menggunakan pernyataan throw.
1 2 3 4 5 6 7 8 try { var a = 1 / 0 ; throw " Pembagian oleh angka 0 " ; } catch ( e ) { c o n s o l e . l o g ( " Error : " + e ) ; }; // hasil : // Error : Pembagian oleh angka 0
BAB
32
33
ditautkan (bound ) ke suatu identier ). Berikut adalah implementasi dari konsep ini di JavaSCript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Diambil dari // http :// stackoverflow . com / questions /3865335/ what - is -a - lambda - language // dengan beberapa perubahan function a p p l y O p e r a t i o n ( a , b , o p e r a t i o n ) { return o p e r a t i o n ( a , b ) ; } function add ( a , b ) { return a+b ; } function s u b t r a c t ( a , b ) { return ab ; } c o n s o l e . l o g ( 1 ,2 , add : + a p p l y O p e r a t i o n ( 1 , 2 , add ) ) ; c o n s o l e . l o g ( 43 ,21 , subtract : + a p p l y O p e r a t i o n ( 4 3 , 2 1 , s u b t r a c t ) ) ; c o n s o l e . l o g ( 4^3: + a p p l y O p e r a t i o n ( 4 , 3 , function ( a , b ) { return Math . pow ( a , b ) } ) ) // // // // hasil : 1 ,2 , add : 3 43 ,21 , subtract : 22 4^3: 64
34
23
// TIGA
3.1.3. Closure
Suatu closure merupakan denisi suatu fungsi bersama-sama dengan lingkungannya. Lingkungan tersebut terdiri atas fungsi internal serta berbagai variabel lokal yang masih tetap tersedia saat fungsi utama / closure tersebut selesai dieksekusi.
1 2 3 4 5 6 7 8 9 10 11 12 13 // Diambil dengan sedikit perubahan dari : // https :// developer . mozilla . org / en - US / docs / JavaScript / Guide / Closures function makeAdder ( x ) { return function ( y ) { return x + y ; }; } var add5 = makeAdder ( 5 ) ; var add10 = makeAdder ( 1 0 ) ; c o n s o l e . l o g ( add5 ( 2 ) ) ; // 7 c o n s o l e . l o g ( add10 ( 2 ) ) ; // 12
3.1.4. Currying
Currying memungkinkan pemrogram untuk membuat suatu fungsi dengan cara menggunakan fungsi yang sudah tersedia secara parsial, artinya tidak perlu menggunakan semua argumen dari fungsi yang sudah tersedia tersebut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Diambil dari : // http :// j a v a s c r i p t w e b l o g . wordpress . com /2010/04/05/ // curry - cooking - up - tastier - functions / // dengan sedikit perubahan function t o A r r a y ( fromEnum ) { return Array . p r o t o t y p e . s l i c e . c a l l ( fromEnum ) ; } Function . p r o t o t y p e . c u r r y = function ( ) { i f ( arguments . l e n g t h <1) { return t h i s ; // nothing to curry with - return function } var __method = t h i s ; var a r g s = t o A r r a y ( arguments ) ; return function ( ) { return __method . a p p l y ( this , a r g s . c o n c a t ( t o A r r a y ( arguments ) ) ) ; } } var add = function ( a , b ) { return a + b ; } // create function that returns 10 + argument
35
26 27
36
17 18 19 20 21 22 23 24 25 26 27 28 29
var halDua = new Halaman ( " http :// bpdp . name / login ? fromHome " ) ; c o n s o l e . l o g ( " Alamat URL yang diakses oleh halSatu = " + h a l S a t u . u r l ) ; c o n s o l e . l o g ( " Alamat URL yang diakses oleh halDua = " + halDua . u r l ) ; c o n s o l e . l o g ( " Nama domain halDua = " + halDua . getDomainName ( ) ) ; // hasil : // Mengakses alamat http :// nodejs . org / api / http . html // Mengakses alamat http :// bpdp . name / login ? fromHome // Alamat URL yang diakses oleh halSatu = http :// nodejs . org / api / http . html // Alamat URL yang diakses oleh halDua = http :// bpdp . name / login ? fromHome // Nama domain halDua = bpdp . name
37
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
// mari diuji var s u b K e l a s S a t u = new SubKelas ( " Parameter 1 Dari Sub Kelas 1 " ) ; c o n s o l e . l o g ( " Property 1 dari sub kelas 1 = " + s u b K e l a s S a t u . p r o p e r t y 1 ) ; c o n s o l e . l o g ( " Property 1 dari sub kelas 1 , diambil dari method + param = " + s u b K e l a s S a t u . methodSatu ( true ) ) ; c o n s o l e . l o g ( " Property 1 dari sub kelas 1 , diambil dari method + param = " + s u b K e l a s S a t u . methodSatu ( f a l s e ) ) ; c o n s o l e . l o g ( s u b K e l a s S a t u . methodDua ( ) ) ; // hasil : // // Property 1 dari kelasSatu = ini parameter 1 dari kelas 1 // Property 1 dari kelasSatu , diambil dari method = ini // parameter 1 dari kelas 1 // Property 1 dari sub kelas 1 = Parameter 1 Dari Sub Kelas 1 // Ubah ke huruf besar ? = true // Property 1 dari sub kelas 1 , diambil dari method + param = // PARAMETER 1 DARI SUB KELAS 1 // Ubah ke huruf besar ? = false // Property 1 dari sub kelas 1 , diambil dari method + param = // parameter 1 dari sub kelas 1 // Berada di method dua dari SubKelas
BAB
beberapa bagian tertulis spesik lokasi direktori di komputer yang digunakan penulis
38
39
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
s t a r t , sto p , submodule , tag , test , t s t , un , u n i n s t a l l , u n l i n k , u n p u b l i s h , u n s t a r , up , update , v e r s i o n , view , whoami npm npm npm npm npm <cmd> h l faq h e l p <term> h e l p npm q u i c k h e l p on <cmd> d i s p l a y f u l l usage i n f o commonly a s k e d q u e s t i o n s s e a r c h f o r h e l p on <term> involved overview
S p e c i f y c o n f i g s i n t h e i n i f o r m a t t e d f i l e : /home/bpdp / . npmrc o r on t h e command l i n e v i a : npm <command key v a l u e > C o n f i g i n f o can be viewed v i a : npm h e l p c o n f i g npm@1 . 1 . 6 6 /home/bpdp/ s o f t w a r e / nodev0 . 8 . 1 5 l i n u x x86 / l i b / node_modules /npm
Listing 4.1: Sintaksis lengkap perintah npm Pada bagian berikut, kita akan membahas lebih lanjut penggunaan perintah npm tersebut.
Listing 4.2: Cara install paket menggunakan npm Perintah diatas akan memasang versi terakhir dari paket pustaka foo. Selain itu npm juga dapat memasang paket pustaka langsung pada sebuah folder, tarball atau tautan untuk sebuah tarball.
https://npmjs.org/doc/faq.html
40
Gambar 4.1.: Hasil perintah npm ls Jika berada pada direktori $HOME, maka paket-paket npm tersebut akan terinstall di $HOME/.npm, sedangkan jika kita berada di luar direktori $HOME, maka paket-paket tersebut akan terinstall di $CWD/node_modules ($CWD = Current Working Directory direktori aktif saat ini). Daftar paket pustaka yang terpasang dapat dilihat menggunakan perintah berikut:
1 $ npm l s
Listing 4.3: Argumen npm untuk melihat daftar paket terpasang Selain melihat daftar paket pustaka yang digunakan dalam aplikasi maupun global, perintah diatas juga akan menampilkan paket dependensi dalam struktur pohon. Gambar 4.1 berikut menampilkan contoh struktur installasi dari paket pustaka lokal aplikasi:
Listing 4.4: Perintah menghapus paket di npm Paket pustaka foo dalam lokal aplikasi akan dihapus, jika menggunakan hak administrasi sudo atau root maka akan menghapus dari installasi global.
41
pwhash
...
Listing 4.5: Perintah menghapus paket di npm Setelah menemukan paketnya, pemrogram bisa menginstall langsung ataupun melihat informasi lebih lanjut tentang pustakan tersebut.
42
BAB
5.1. Pendahuluan
Pada saat membangun aplikasi Cloud dengan antarmuka web menggunakan Node.js, ada beberapa teknik pemrograman yang bisa digunakan. Bab ini akan membahas berbagai teknik tersebut. Untuk mengerjakan beberapa latihan di bab ini, digunakan suatu le dengan format JSON. File pegawai.json berikut ini akan digunakan dalam pembahasan selanjutnya.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 { " pegawai " : [ { " id " : " 1 " , " nama " : " Zaky " , " alamat " : " Purwomartani " }, { " id " : " 2 " , " nama " : " Ahmad " , " alamat " : " Kalasan " }, { " id " : " 3 " , " name " : " Aditya " , " alamat " : " Sleman " } ] }
Listing 5.1: pegawai.json Jika ingin memeriksa validitas dari data berformat JSON, pemrogram bisa menggunakan validator di http://jsonlint.com.
43
44
45
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
var n e t = r e q u i r e ( net ) ; var s e r v e r = n e t . c r e a t e S e r v e r ( function ( s o c k ) { // Event dan event - handler // data = > jika ada data yang dikirimkan dari klien s o c k . on ( data , function ( data ) { c o n s o l e . l o g ( data + s o c k . re m o t e A d dr e s s + : + data ) ; }); // close = > jika koneksi ditutup s o c k . on ( close , function ( data ) { c o n s o l e . l o g ( koneksi ditutup ) ; }); }); s e r v e r . l i s t e n ( 1 3 3 7 , function ( ) { c o n s o l e . l o g ( Server aktif di 127. 0.0.1: 1337 ) ; }); s e r v e r . on ( error , function ( e ) { i f ( e . code == EADDRINUSE ) { c o n s o l e . l o g ( Error : host dan port sudah digunakan . ) ; } });
46
18 19 20 21 22 23 24 25 26 27 28 29 30
// " id ": "2" , // " nama ": " Ahmad " , // " alamat ": " Kalasan " // }, // { // " id ": "3" , // " name ": " Aditya " , // " alamat ": " Sleman " // } // ] // } // // Baris setelah membaca file
BAB
http://www.strozzi.it/cgi-bin/CSA/tw7/I/en_US/nosql/Home%20Page
47
6.2. Mengenal mongoDB dan Fitur-turnya menggunakan format JSON dalam penyimpanan data mendukung indeks mendukung replikasi auto-sharding untuk skalabilitas horizontal query yang lengkap pembaruan data yang cepat mendukung Map/Reduce mendukung GridFS
48
49
Listing 6.1: Menjalankan server MongoDB (mongod) Untuk mengakhiri server, tekan Ctrl-C, mongoDB akan mengakhiri server sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ^CTue Dec 11 1 5 : 1 6 : 3 8 g o t s i g n a l 2 ( I n t e r r u p t ) , w i l l t e r m i n a t e a f t e r c u r r e n t cmd ends Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] now e x i t i n g Tue Dec 11 1 5 : 1 6 : 3 8 d b e x i t : Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : g o i n g t o c l o s e l i s t e n i n g s o c k e t s . . . Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] c l o s i n g l i s t e n i n g s o c k e t : 5 Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] c l o s i n g l i s t e n i n g s o c k e t : 6 Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] c l o s i n g l i s t e n i n g s o c k e t : 7 Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] removing s o c k e t f i l e : /tmp/mongodb 27017. s o c k Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : g o i n g t o f l u s h d i a g l o g . . . Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : g o i n g t o c l o s e s o c k e t s . . . Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : w a i t i n g f o r f s p r e a l l o c a t o r . . . Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : c l o s i n g a l l f i l e s . . . Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] c l o s e A l l F i l e s ( ) f i n i s h e d Tue Dec 11 1 5 : 1 6 : 3 8 [ i n t e r r u p t T h r e a d ] shutdown : removing f s l o c k . . . Tue Dec 11 1 5 : 1 6 : 3 8 d b e x i t : r e a l l y e x i t i n g now
50
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
> u s e mydb s w i t c h e d t o db mydb > show dbs local ( empty ) > emp1 = { name : " Zaky " , a d d r e s s : " Griya Purwa Asri " } { " name " : " Zaky " , " address " : " Griya Purwa Asri " } > emp2 = { name : " Ahmad " , a d d r e s s : " Purwomartani " , e m a i l : " z a k y a h m a d a d i t y a @ g m a i l . com " } { " name " : " Ahmad " , " address " : " Purwomartani " , " email " : " z a k y a h m a d a d i t y a @ g m a i l . com " } > emp3 = { name : " Aditya " , a d d r e s s : " Kalasan " , phone : " 08787878787 " } { " name " : " Aditya " , " address " : " Kalasan " , " phone " : " 08787878787 " } > db . e m p l o y e e s . i n s e r t ( emp1 ) > db . e m p l o y e e s . i n s e r t ( emp2 ) > db . e m p l o y e e s . i n s e r t ( emp3 ) > show dbs local ( empty ) mydb 0 . 0 6 2 5GB > db mydb > show c o l l e c t i o n s employees system . i n d e x e s > db . e m p l o y e e s . f i n d ( ) { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 3 a 7 f 8 3 c b a 1 1 e 6 b 2 1 e " ) , " name " : " Zaky " , " address " : " Griya Purwa Asri " } { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 d a 7 f 8 3 c b a 1 1 e 6 b 2 1 f " ) , " name " : " Ahmad " , " address " :
51
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
" Purwomartani " , " email " : " z a k y a h m a d a d i t y a @ g m a i l . com " } { " _id " : O b j e c t I d ( " 50 c 7 4 b 7 9 a 7 f 8 3 c b a 1 1 e 6 b 2 2 0 " ) , " name " : " Aditya " , " address " : " Kalasan " , " phone " : " 08787878787 " } > db . e m p l o y e e s . f i n d ( {name : " Ahmad " } ) { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 d a 7 f 8 3 c b a 1 1 e 6 b 2 1 f " ) , " name " : " Ahmad " , " address " : " Purwomartani " , " email " : " z a k y a h m a d a d i t y a @ g m a i l . com " } > db . e m p l o y e e s . findOne ( ) { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 3 a 7 f 8 3 c b a 1 1 e 6 b 2 1 e " ) , " name " : " Zaky " , " address " : " Griya Purwa Asri " } > db . e m p l o y e e s . f i n d ( ) . l i m i t ( 2 ) { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 3 a 7 f 8 3 c b a 1 1 e 6 b 2 1 e " ) , " name " : " Zaky " , " address " : " Griya Purwa Asri " } { " _id " : O b j e c t I d ( " 50 c 7 4 b 6 d a 7 f 8 3 c b a 1 1 e 6 b 2 1 f " ) , " name " : " Ahmad " , " address " : " Purwomartani " , " email " : " z a k y a h m a d a d i t y a @ g m a i l . com " } >
Listing 6.4: Sesi dalam shell mongoDB Basis data mongoDB hanya akan dibuat jika sudah dilakukan perintah untuk menyisipkan atau mengisikan data documents ke dalam collections seperti perintah di atas.
52
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / r i m r a f npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / which npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / nopt npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / o s e n v npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / npmlog npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / semver//semver 1 . 1 . 1 . t g z npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / t a r // t a r 0 . 1 . 1 4 . t g z npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / abbrev npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / sigmund npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / l r u c a c h e npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / a n s i npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p GET h t t p s : / / r e g i s t r y . npmjs . o r g / b l o c k stream npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / sigmund npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / abbrev npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / l r u c a c h e npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p 304 h t t p s : / / r e g i s t r y . npmjs . o r g / i n h e r i t s npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / a n s i npm h t t p 200 h t t p s : / / r e g i s t r y . npmjs . o r g / b l o c k stream /home/bpdp/ s o f t w a r e / n o d e j s / b i n / nodegyp > /home/bpdp/ s o f t w a r e / n o d e j s / l i b / node_modules / nodegyp / b i n / nodegyp . j s nodegyp@0 . 8 . 1 /home/bpdp/ s o f t w a r e / n o d e j s / l i b / node_modules / nodegyp + g r a c e f u l fs@1 . 1 . 1 4 | osenv@0 . 0 . 3 | rimraf@2 . 0 . 2 | mkdirp@0 . 3 . 4 | which@1 . 0 . 5 | semver@1 . 1 . 1 | r e q u e s t @ 2 . 9 . 2 0 3 | nopt@2 . 0 . 0 ( abbrev@1 . 0 . 3 ) | minimatch@0 . 2 . 9 ( sigmund@1 . 0 . 0 , l r u cache@2 . 0 . 4 ) | glob@3 . 1 . 1 4 ( i n h e r i t s @ 1 . 0 . 0 ) | fstream@0 . 1 . 1 9 ( i n h e r i t s @ 1 . 0 . 0 ) | npmlog@0 . 0 . 2 ( ansi@0 . 1 . 2 ) + tar@0 . 1 . 1 4 ( i n h e r i t s @ 1 . 0 . 0 , b l o c k stream@0 . 0 . 6 )
Listing 6.5: Instalasi node-gyp Node-gyp ini diinstall pada lokasi global. Pada materi ini, Node-gyp diperlukan untuk membangun driver dari mongoDB sehingga mongoDB bisa diakses oleh Node.js.
53
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
================================================================================ = = = Attempting t o b u i l d bson c++ e x t e n s i o n = = Windows : no b u i l d w i l l be attempted a s b i n a r i e s a r e p r e p a c k a g e d = = Unix : on f a i l u r e t h e package w i l l s t i l l i n s t a l l w i t h o u t t h e C++ e x t e n s i o n = = = ================================================================================ nodegyp c l e a n nodegyp c o n f i g u r e b u i l d gyp h t t p GET h t t p : / / n o d e j s . o r g / d i s t / v0 . 8 . 1 5 / nodev0 . 8 . 1 5 . t a r . gz gyp h t t p 200 h t t p : / / n o d e j s . o r g / d i s t / v0 . 8 . 1 5 / nodev0 . 8 . 1 5 . t a r . gz make [ 1 ] : E n t e r i n g d i r e c t o r y / home/bpdp/ node_modules /mongodb/ node_modules / bson / b u i l d CXX( t a r g e t ) R e l e a s e / o b j . t a r g e t / bson / e x t / bson . o SOLINK_MODULE( t a r g e t ) R e l e a s e / o b j . t a r g e t / bson . node SOLINK_MODULE( t a r g e t ) R e l e a s e / o b j . t a r g e t / bson . node : F i n i s h e d COPY R e l e a s e / bson . node make [ 1 ] : L e a v i n g d i r e c t o r y / home/bpdp/ node_modules /mongodb/ node_modules / bson / b u i l d c h i l d p r o c e s s e x i t e d with code 0 mongodb@1 . 2 . 3 . . / . . / . . / . . / . . / node_modules /mongodb + bson@0 . 1 . 5
Listing 6.6: Instalasi driver mongoDB Solusi lain yang bisa digunakan antara lain adalah: Mongoose (http://mongoosejs.com/) Mongojs (https://github.com/gett/mongojs) Mongolia (https://github.com/masylum/mongolia) Mongoskin (https://github.com/kissjs/node-mongoskin)
Listing 6.7: Instalasi driver mongoDB Setelah itu, buat program sesuai dengan listing program berikut.
1 2 3 4 5 v a r d a t a b a s e U r l = " localhost / mydb " ; v a r c o l l e c t i o n s = [ " employees " ] ; v a r db = r e q u i r e ( " mongojs " ) . c o n n e c t ( d a t a b a s e U r l , c o l l e c t i o n s ) ; // m e n c a r i pegawai bernama Aditya
54
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
db . e m p l o y e e s . f i n d ( { name : " Aditya " } , function ( e r r , e m p l o y e e s ) { i f ( e r r | | ! e m p l o y e e s ) c o n s o l e . l o g ( " Tidak ada pegawai dengan nama Aditya " ) ; e l s e e m p l o y e e s . f o r E a c h ( function ( emps ) { c o n s o l e . l o g ( emps ) ; }); }); // menyimpan data pegawai baru : Bambang db . e m p l o y e e s . s a v e ( { name : " Bambang " , a d d r e s s : " Yogyakarta " , password : " ealhadalah " , s e x : " male " } , function ( e r r , s a v e d ) { i f ( e r r | | ! s a v e d ) c o n s o l e . l o g ( " Pegawai Bambang gagal disimpan " ) ; e l s e c o n s o l e . l o g ( " Data pegawai Bambang tersimpan " ) ; }); // mengupdate data pegawai : Ahmad db . e m p l o y e e s . update ( { name : " Ahmad " } , { $ s e t : { a d d r e s s : " Finlandia " } } , function ( e r r , updated ) { i f ( e r r | | ! updated ) c o n s o l e . l o g ( " Data Ahmad gagal diperbaharui " ) ; e l s e c o n s o l e . l o g ( " Data Ahmad berhasil diperbaharui " ) ; }); // H a s i l : //{ _id : 50 c 7 4 b 7 9 a 7 f 8 3 c b a 1 1 e 6 b 2 2 0 , // name : Aditya , // a d d r e s s : Kalasan , // phone : 0 8 7 8 7 8 7 8 7 8 7 } // Data pegawai Bambang t e r s i m p a n // Data Ahmad b e r h a s i l d i p e r b a h a r u i // // H a s i l d i db : //> db . e m p l o y e e s . f i n d ( ) //{ " _id " : O b j e c t I d ( " 50 c 7 4 b 6 3 a 7 f 8 3 c b a 1 1 e 6 b 2 1 e " ) , " name " : // " Zaky " , " address " : " Griya Purwa Asri " } //{ " _id " : O b j e c t I d ( " 50 c 7 4 b 6 d a 7 f 8 3 c b a 1 1 e 6 b 2 1 f " ) , " address " : // " Finlandia " , " email " : " z a k y a h m a d a d i t y a @ g m a i l . com " , " name " : " Ahmad " } //{ " _id " : O b j e c t I d ( " 50 c 7 4 b 7 9 a 7 f 8 3 c b a 1 1 e 6 b 2 2 0 " ) , " name " : // " Aditya " , " address " : " Kalasan " , " phone " : " 08787878787 " } //{ " name " : " Bambang " , " address " : " Yogyakarta " , " password " : // " ealhadalah " , " sex " : " male " , " _id " : // O b j e c t I d ( " 50 c 7 5 d 4 3 c 1 1 1 3 8 4 8 4 6 0 0 0 0 0 1 " ) } //> //
55
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
create create create create create create create create create create create create create create
: : : : : : : : : : : : : :
. . / package . j s o n . / app . j s ./ public . / p u b l i c / images ./ public / stylesheets ./ public / stylesheets / style . css ./ routes . / routes / index . j s ./ routes / user . j s . / views . / views / layout . jade . / views / index . jade ./ public / javascripts
Listing 6.9: Mengakses mongoDB dari Node.js Berikut ini adalah beberapa perubahan yang dilakukan untuk rerangka aplikasi yang dihasilkan dari perintah express tersebut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 /* * * Module dependencies . */ var , , , , e x p r e s s = r e q u i r e ( express ) r o u t e s = r e q u i r e ( ./ routes ) employee = r e q u i r e ( ./ routes / employee ) h t t p = r e q u i r e ( http ) path = r e q u i r e ( path ) ;
var app = e x p r e s s ( ) ; app . c o n f i g u r e ( function ( ) { app . s e t ( port , p r o c e s s . env .PORT | | 3 0 0 0 ) ; app . s e t ( views , __dirname + / views ) ; app . s e t ( view engine , jade ) ; app . u s e ( e x p r e s s . f a v i c o n ( ) ) ; app . u s e ( e x p r e s s . l o g g e r ( dev ) ) ; app . u s e ( e x p r e s s . b o d y P a r s e r ( ) ) ; app . u s e ( e x p r e s s . methodOverride ( ) ) ; app . u s e ( app . r o u t e r ) ; app . u s e ( e x p r e s s . s t a t i c ( path . j o i n ( __dirname , public ) ) ) ; }); app . c o n f i g u r e ( development , function ( ) { app . u s e ( e x p r e s s . e r r o r H a n d l e r ( ) ) ; }); app . g e t ( / , r o u t e s . i n d e x ) ; app . g e t ( / employees , employee . l i s t ) ; h t t p . c r e a t e S e r v e r ( app ) . l i s t e n ( app . g e t ( port ) , function ( ) { c o n s o l e . l o g ( " Express server listening on port " + app . g e t ( port ) ) ; });
6.4. Aplikasi Web Menggunakan Node.js dan mongoDB Listing 6.10: app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 { " name " : " show - employees " , " version " : " 0.0.1 " , " private " : true , " scripts " : { " start " : " node app " }, " dependencies " : { " express " : " 3.0.4 " , " jade " : " * " , " mongojs " : " latest " } } \ end { l i s t i n g } \ l s t s e t { l a n g u a g e=J a v a S c r i p t , c a p t i o n=r o u t e s / i n d e x . j s } \ begin { l s t l i s t i n g } /* * GET home page . */ e x p o r t s . i n d e x = function ( req , r e s ) { r e s . r e n d e r ( index , { t i t l e : Contoh Express + mongoDB } ) ; };
56
Listing 6.11: package.json Selain itu, ada beberapa tambahan le (routes/employee.js dan views/employee.jade), penghapusan le (routes/user.js), dan perubahan yang cukup signikan pada le views/index.jade.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /* * GET employees listing . */ var d a t a b a s e U r l = " localhost / mydb " ; var c o l l e c t i o n s = [ " employees " ] ; var db = r e q u i r e ( " mongojs " ) . c o n n e c t ( d a t a b a s e U r l , c o l l e c t i o n s ) ; e x p o r t s . l i s t = function ( req , r e s ) { // mencari dan menampilkan semua pegawai db . e m p l o y e e s . f i n d ( function ( e r r , e m p l o y e e s ) { r e s . r e n d e r ( employee , { l i s t O f E m p l o y e e : employees , }); };
t i t l e : Daftar pegawai } ) ;
57
Selamat datang d i #{ t i t l e } . A p l i k a s i i n i hanya s e k e d a r c on to h a p l i k a s i web dengan mongoDB s e b a g a i backend . Untuk s a a t i n i hanya t e r s e d i a f a s i l i t a s untuk m e l i h a t a ( h r e f=" / employees " ) d a f t a r pegawai .
BAB
58
59
60
Listing 7.1: Struktur direktori asli aplikasi ExpressJS Struktur direktori tersebut akan diubah sesuai dengan pola MVC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ tree . . + app . j s | c o n t r o l l e r s | + i n d e x . j s | + u s e r . j s | models | + db . j s | package . j s o n | p u b l i c | + images | | j a v a s c r i p t s | + s t y l e s h e e t s | + s t y l e . c s s + v i e w s + i n d e x . j a d e + l a y o u t . j a d e 7 directories , 8 f i l e s
61
Listing 7.2: Struktur direktori ExpressJS sesuai pola MVC Beberapa perubahan terhadap struktur direktori: direktori routes diubah menjadi controllers membuat direktori models untuk mendenisikan skema basis data
var mongoose = r e q u i r e ( mongoose ) ; var app = e x p r e s s ( ) ; mongoose . c o n n e c t ( mongodb :// localhost / mydb ) ; app . c o n f i g u r e ( function ( ) { app . s e t ( port , p r o c e s s . env .PORT | | 3 0 0 0 ) ; app . s e t ( views , __dirname + / views ) ; app . s e t ( view engine , jade ) ; app . u s e ( e x p r e s s . f a v i c o n ( ) ) ; app . u s e ( e x p r e s s . l o g g e r ( dev ) ) ; app . u s e ( e x p r e s s . b o d y P a r s e r ( ) ) ; app . u s e ( e x p r e s s . methodOverride ( ) ) ; app . u s e ( app . r o u t e r ) ; app . u s e ( e x p r e s s . s t a t i c ( path . j o i n ( __dirname , public ) ) ) ; }); app . c o n f i g u r e ( development , function ( ) { app . u s e ( e x p r e s s . e r r o r H a n d l e r ( ) ) ; }); app . g e t ( / , c o n t r o l l e r s . i n d e x ) ; app . g e t ( / users , u s e r . l i s t ) ; h t t p . c r e a t e S e r v e r ( app ) . l i s t e n ( app . g e t ( port ) , function ( ) { c o n s o l e . l o g ( " Express server listening on port " + app . g e t ( port ) ) ; });
62
6 7 8 9 10 11
7.3.3. Hasil
Setelah server dieksekusi (menggunakan perintah node app.js), maka hasilnya akan bisa diakses di http://localhost:3000/users. Hasil di browser bisa dilihat di gambar 7.2
63
Gambar 7.2.: Pola arsitektur MVC RVP (Resource-View-Presenter): Flatiron (http://flatironjs.org) MVA (Model-View-Adapter). Hierarchical MVC Presentation-Abstract-Control.
BAB
64
8.2. Teknologi Pendukung Real-time Web DOM (Document Object Model ) untuk menampilkan data secara dinamis
65
XML dan XSLT untuk pertukaran data (seringkali tidak menggunakan XML tetapi JSON). Obyek XMLHttpRequest untuk komunikasi asynchronous JavaScript
8.3. Socket.io
66
8.2.3. WebSocket
WebSocket merupakan teknologi Web yang menyediakan saluran komunikasi full duplex pada satu koneksi TCP. Protokol WebSocket distandarkan oleh IETF di RFC 6455 sedangkap API (Application Programming Interface) dikembangkan dan distandarkan oleh W3C sebagai bagian dari HTML5. Komunikasi antara klien dengan server dilaksanakan menggunakan TCP dengan nomor port 80. WebSocket diimplementasikan di sisi server dan klien dan memungkinkan adanya interaksi yang lebih real-time daripada teknologi push karena protokol dan API ini diimplementasikan dan bisa digunakan di sisi klien maupun server. Browser yang sudah mendukung protokol dan API WebSocket ini adalah Chrome, Firefox, Safari, Opera, dan Internet Explorer. Perkembangan dari WebSocket bisa dilihat dan diikuti di http://www.websocket. org/
8.3. Socket.io
8.3.1. Apa itu Socket.io?
Socket.io adalah pustaka JavaScript yang merupakan implementasi dari protokol WebSocket serta berbagai improvisasi lain yang diperlukan untuk real-time web (heartbeats, timeouts, dan disconnection). Protokol transport yang didukung adalah sebagai berikut: WebSocket Adobe Flash Socket AJAX long polling AJAX multipart streaming Forever Iframe JSONP Polling Pustaka ini terdiri atas pustaka untuk sisi klien (browser) dan server (menggunakan Node.js). Browser yang didukung adalah: Internet Explorer 5.5+ (desktop) Safari 3+ (desktop) Google Chrome 4+ (desktop) Firefox 3+ (desktop) Opera 10.61+ (desktop) iPhone Safari (mobile)
8.3. Socket.io iPad Safari (mobile) Android WebKit (mobile) WebOs WebKit (mobile)
67
8.3. Socket.io
68
Pada pembahasan berikutnya, kita akan mengadakan berbagai perubahan yang diperlukan. Instalasi Paket yang Diperlukan File package.json berisi beberapa informasi tentang aplikasi ini serta beberapa paket yang diperlukan. Isi dari le ini adalah sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 { " name " : " socket . io - expressjs " , " version " : " 0.0.1 " , " author " : " Bambang Purnomosidi D . P . " , " private " : true , " scripts " : { " start " : " node app " }, " dependencies " : { " express " : " latest " , " jade " : " * " , " socket . io " : " latest " , " socket . io - client " : " latest " } }
Listing 8.2: package.json Setelah itu. install paket-paket tersebut dengan menggunakan perintah npm install di direktori tersebut. Kongurasi JavaScript untuk Browser Browser juga memerlukan pustaka untuk Socket.io yang diperoleh dari paket socket.ioclient. Pada paket tersebut, terdapat direktori dist:
1 2 3 4 5 6 7 8 $ l s node_modules / s o c k e t . i o c l i e n t / d i s t / t o t a l 496 drwxrxrx 2 bpdp u s e r s 4096 Dec 16 2 0 : 1 8 drwxrxrx 7 bpdp u s e r s 4096 Dec 16 2 0 : 1 8 rwrr 1 bpdp u s e r s 101222 Nov 2 2 2 : 0 2 rwrr 1 bpdp u s e r s 44789 Nov 2 2 2 : 0 2 rwrr 1 bpdp u s e r s 175953 Mar 28 2012 rwrr 1 bpdp u s e r s 175830 Mar 28 2012
Listing 8.3: Isi direktori dist di socket.io-client Copy-kan le-le tersebut ke direktori public/javascripts. Hapus File yang Tidak Diperlukan Ada beberapa le yang tidak diperlukan dan harus dihapus: routes/user.js
8.3. Socket.io Ubah File-le Tertentu Beberapa le akan diedit. Beberapa diantaranya akan diuraikan di bagian ini.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 var e x p r e s s = r e q u i r e ( express ) , app = e x p r e s s ( ) , r o u t e s = r e q u i r e ( ./ routes ) , h t t p = r e q u i r e ( http ) , s e r v e r = h t t p . c r e a t e S e r v e r ( app ) , i o = r e q u i r e ( socket . io ) . l i s t e n ( s e r v e r ) ; server . listen (80); app . c o n f i g u r e ( function ( ) { app . s e t ( views , __dirname + / views ) ; app . s e t ( view engine , jade ) ; app . u s e ( e x p r e s s . f a v i c o n ( ) ) ; app . u s e ( e x p r e s s . l o g g e r ( dev ) ) ; app . u s e ( e x p r e s s . b o d y P a r s e r ( ) ) ; app . u s e ( e x p r e s s . methodOverride ( ) ) ; app . u s e ( e x p r e s s . s t a t i c ( __dirname + / public ) ) ; app . u s e ( app . r o u t e r ) ; }); app . g e t ( / , r o u t e s . i n d e x ) ; i o . s o c k e t s . on ( connection , function ( s o c k e t ) { s o c k e t . emit ( kirim ke browser , { k a l i m a t D a r i S e r v e r : Kalimat ini dikirim dari server } ) ; s o c k e t . on ( dari browser , function ( data ) { c o n s o l e . l o g ( data . k a l i m a t D a r i B r o w s e r ) ; }); });
69
8.3. Socket.io
70
};
Menjalankan Server Socket.io Server socket.io menggunakan port 80 sehingga harus dijalankan oleh root.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 # node app . js info socket . io started debug c l i e n t a u t h o r i z e d i n f o handshake a u t h o r i z e d qrMUlAcSRMywnvUK31RV debug s e t t i n g r e q u e s t GET / s o c k e t . i o /1/ w e b s o c k e t /qrMUlAcSRMywnvUK31RV debug set h e a r t b e a t i n t e r v a l f o r c l i e n t qrMUlAcSRMywnvUK31RV debug c l i e n t a u t h o r i z e d f o r debug w e b s o c k e t w r i t i n g 1 : : debug w e b s o c k e t w r i t i n g 5 : : : { " name " : " kirim ke browser " , " args " : [ { " k a l i m a t D a r i S e r v e r " : " Kalimat ini dikirim dari server " } ] } Kalimat i n i d i k i r i m d a r i b r o w s e r GET / 200 44ms 628 i n f o t r a n s p o r t end ( s o c k e t end ) debug set c l o s e t i m e o u t f o r c l i e n t qrMUlAcSRMywnvUK31RV debug c l e a r e d c l o s e t i m e o u t f o r c l i e n t qrMUlAcSRMywnvUK31RV debug c l e a r e d h e a r t b e a t i n t e r v a l f o r c l i e n t qrMUlAcSRMywnvUK31RV debug d i s c a r d i n g t r a n s p o r t GET / j a v a s c r i p t s / s o c k e t . i o . j s 304 4ms GET / s t y l e s h e e t s / s t y l e . c s s 304 4ms debug c l i e n t a u t h o r i z e d i n f o handshake a u t h o r i z e d Eug556YX4R8fOB31RW debug s e t t i n g r e q u e s t GET / s o c k e t . i o /1/ w e b s o c k e t /Eug556YX4R8fOB31RW debug set h e a r t b e a t i n t e r v a l f o r c l i e n t Eug556YX4R8fOB31RW debug c l i e n t a u t h o r i z e d f o r debug w e b s o c k e t w r i t i n g 1 : : debug w e b s o c k e t w r i t i n g 5 : : : { " name " : " kirim ke browser " , " args " : [ { " k a l i m a t D a r i S e r v e r " : " Kalimat ini dikirim dari server " } ] } Kalimat i n i d i k i r i m d a r i b r o w s e r debug e m i t t i n g h e a r t b e a t f o r c l i e n t Eug556YX4R8fOB31RW debug w e b s o c k e t w r i t i n g 2 : : debug set h e a r t b e a t t i m e o u t f o r c l i e n t Eug556YX4R8fOB31RW debug g o t h e a r t b e a t p a c k e t debug c l e a r e d h e a r t b e a t t i m e o u t f o r c l i e n t Eug556YX4R8fOB31RW debug set h e a r t b e a t i n t e r v a l f o r c l i e n t Eug556YX4R8fOB31RW ... ... ... ...
Listing 8.7: Menjalankan server Socket.io Keluaran pada sisi server tersebut merupakan keluaran yang sudah termasuk akses dari browser. Setelah server dijalankan, buka browser kemudian akses URL http:// localhost. Setelah diakses melalui browser, server akan mengirimkan kode sumber HTML sebagai berikut:
1 2 3 4 5 < !D C Y E html> O T P <html> <head> < t i t l e>Contoh S o c k e t . i o + E x p r e s s</ t i t l e> <l i n k r e l=" stylesheet " href=" / stylesheets / style . css ">
8.3. Socket.io
71
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
</head> <body> <h1>Contoh S o c k e t . i o + E x p r e s s</h1> <p>Contoh S o c k e t . i o + E x p r e s s</p> <s c r i p t src=" / javascripts / socket . io . js "></ s c r i p t> <s c r i p t> var s o c k e t = i o . connect ( http : / / l o c a l h o s t ) ; s o c k e t . on ( k i r i m ke browser , f u n c t i o n ( data ) { document . getElementById ( " container " ) . innerHTML= " <p > " + data . k a l i m a t D a r i S e r v e r + " </p > " ; s o c k e t . emit ( d a r i browser , { k a l i m a t D a r i B r o w s e r : Kalimat i n i d i k i r i m d a r i browser } ) ; }); </ s c r i p t> <div id=" container "> <p>Contoh S o c k e t . i o + E x p r e s s</p> </ div> </body> </html>
Listing 8.8: Kode sumber di browser Tampilan di browser bisa dilihat pada gambar 8.1 Contoh pada materi ini merupakan contoh sederhana, tetapi diharapkan bisa dengan mudah dipahami untuk membuat aplikasi Web real-time.
Daftar Pustaka
[1] Anonim, Mozilla Developer Network - JavaScript, https://developer.mozilla. org/en-US/docs/JavaScript. [2] Cody Lindley, JavaScript Enlightenment, http://javascriptenlightenment.com, 2012. [3] David Flanagan, JavaScript: The Denitive Guide, 4th Edition, OReilly, 2001. [4] Don Nguyen, Jump Start Node.js, SitePoint, 2012. [5] Douglas Crockford, JavaScript: The Good Parts, OReilly, 2008. [6] Marijn Haverbeke, Eloquent JavaScript: A Modern Introduction to Programming, No Starch Press, 2011. [7] Shelley Powers, Learning Node, OReilly, 2012. [8] Tom Hughes-Croucher, Mike Wilson, Node: Up and Running, OReilly, 2012.
72
Lampiran
73
LAMPIRAN
A.2.1. DESCRIPTION
npms coding style is a bit unconventional. It is not dierent for dierences sake, but rather a carefully crafted style that is designed to reduce visual clutter and make bugs more apparent. If you want to contribute to npm (which is very encouraged), you should make your code conform to npms style.
74
75
A.2.3. Indentation
Two-spaces. Tabs are better, but they look like hell in web browsers (and on github), and node uses 2 spaces, so thats that. Congure your editor appropriately.
Listing A.2: Good curly braces placement - 1 If a block needs to wrap to the next line, use a curly brace. Dont use it if it doesnt. Bad:
1 2 3 i f ( f o o ) { bar ( ) } while ( f o o ) bar ( )
A.2.5. Semicolons
Dont use them except in four situations: for (;;) loops. Theyre actually required. null loops like: while (something) ; (But youd better have a good reason for doing that.) case "foo": doSomething(); break
76
In front of a leading ( or [ at the start of the line. This prevents the expression from being interpreted as a function call or property access, respectively. Some examples of good semicolon usage:
1 2 3 4 5 6 7 8 9 10 ; ( x | | y ) . doSomething ( ) ; [ a , b , c ] . f o r E a c h ( doSomething ) f o r ( var i = 0 ; i < 1 0 ; i ++) { switch ( s t a t e ) { case " begin " : s t a r t ( ) ; c o n t i n u e case " end " : f i n i s h ( ) ; break d e f a u l t : throw new E r r o r ( " unknown state " ) } end ( ) }
Listing A.5: Good semicolon usage Note that starting lines with - and + also should be prexed with a semicolon, but this is much less common.
A.2.7. Whitespace
Put a single space in front of ( for anything other than a function call. Also use a single space wherever it makes things more readable. Dont leave trailing whitespace at the end of lines. Dont indent empty lines. Dont use more spaces than are helpful.
A.2.8. Functions
Use named functions. They make stack traces a lot easier to read.
77
A.2.10. Errors
Always create a new Error object with your message. Dont just return a string message to the callback. Stack traces are handy.
A.2.11. Logging
Logging is done using the npmlog utility. Please clean up logs when they are no longer helpful. In particular, logging the same object over and over again is not helpful. Logs should report whats happening so that its easier to track down where a fault occurs. Use appropriate log levels. See cong(1) and search for "loglevel".
78
Dont set things to undened. Reserve that value to mean "not yet set to anything." Boolean objects are verboten.
Selain gaya penulisan kode dari NPM ini, ada beberapa lagi lainnya yang bisa dilihat, antara lain: Spludo http://spludo.com/source/coding-standards/ Google JavaScript Style Guide (http://google-styleguide.googlecode.com/svn/ trunk/javascriptguide.xml) Felixs Node.js Style Guide (http://nodeguide.com/style.html)
LAMPIRAN
Buku ini merupakan hasil karya bersama dari beberapa penulis. Peran masing-masing penulis bisa dilihat pada bagian ringkasan dari sejarah commit. Penulis utama adalah saya (Bambang Purnomosidi D. P), sementara pada bab 5 ada kontribusi dari Aji Kisworo Mukti. Hasil log dari git menunjukkan peran masing-masing penulis (git shortlog):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 A j i Kisworo Bab 5 Bab 5 Bab 5 Mukti ( 3 ) : S t r u k t u r I n s t a l l a s i Paket Node . j s I n s t a l l a s i Paket Menghapus Paket
Bambang Purnomosidi D. P ( 6 4 ) : I n i t i a l commit F i r s t commit i n i t i a l i z i n g empty r e p o Merge branch master o f h t t p s : / / g i t h u b . com/bpdp/bukuc l o u d n o d e j s Menambahkan l i n k ke t e k s bahasa I n d o n e s i a untuk l i s e n s i CC BY SA Menambahkan l i n k ke t e k s bahasa I n d o n e s i a untuk l i s e n s i CC BY SA Menambahkan l i n k ke t e k s bahasa I n d o n e s i a untuk l i s e n s i CC BY SA Menambahkan t i p s untuk i n d e k s Melengkapi bab 1 , terutama t e n t a n g t e o r i Cloud Computing k e s a l a h a n k e c i l , t i d a k menutup t e x t i t dengan { t a p i | Menambahkan i n d e k s d a r i Bab 1 Bab 1 s e l e s a i Bab 2 b a g i a n REPL s e l e s a i Edit bagian i n s t a l a s i F l a t i r o n h a s i l d i r e k t o r i Menambahkan t e n t a n g p e n u l i s buku Bab 1 s e d i k i t k e t e r a n g a n t t g Node . j s , Bab 2 awal d a s a r 2 J a v a S c r i p t Penambahan i s i d i bab 2 dan 7 Update bab 5 > mengubah NPM mjd npm dan menambahkan Apakah npm i t u ? M a k e f i l e => buat c l e a n a l l dan c l e a n withoutpdf , bab 2 s e l e s a i R e a d l i n e t r i v i a l changes Penambahan d i bab 2 , menetapkan shadowbox untuk c a t a t a n Bab 2 : n i l a i , t i p e data , dan v a r i a b e l . Menambahkan utk c a t a t a n ke t i p s Penambahan t e n t a n g L i t e r a l dan r e o r g a n i s a s i sub bab ( f u n g s i ) Bab 2 : Pembahasan Fungsi s e l e s a i . Bab 2 L i t e r a l , s e l e s a i Bab 2 Pernyataan k o n d i s i i f . . e l s e i f . . e l s e : s e l e s a i Bab 2 JSON , s w i t c h , dan l o o p i n g f o r s e l e s a i
79
80
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
Memperbaiki s e d i k i t typo , kurang s a t u { d i f o o t n o t e w i k i p e d i a utk JSON Bab 2 s e l e s a i Bab 3 p e n g e r t i a n PBO dan d e f i n i s i obyek > s e l e s a i Menambahkan A j i Kisworo Mukti ke k o n t r i b u t o r d i README. md Minor r e v i s i o n d i bab 5 , menambahkan gambar npmls ( s o a l n y a kode ASCII k e l u a r a n n y a kacau d i LaTex dan s a y a blm tau workaroundnya Mengubah c o v e r > l e b i h umum, g a n t i dg l o g o NodeJS , menambahkan A j i ke k o n t r i b u t o r , appendix B > commit h i s t d a r i k o n t r i b u t o r Menambahkan m a t e r i PBO => m e l e n g k a p i d e f i n i s i obyek s e r t a i n h e r i t a n c e . Contoh i n h e r i t a n c e . j s ditambahkan Bab 3 Pemrograman f u n g s i o n a l d i JS => p e n g e r t i a + b e b e r a p a p o i n t yg akan d i b a h a s Menambahkan i n f o t e n t a n g komas c r i p t d i README. md dan M a k e f i l e v e r s i t e r a k h i r Menambahkan n e s t e d f u n c t i o n s d i bab 2 Menambahkan source code n e s t e d . j s ( bab 2 ) Bab 3 b e b e r a p a penambahan d i pemrograman f u n g s i o n a l Bab 3 Lambda E x p r e s s i o n + c on to h Highero r d e r function Bab 3 M e n y e l e s a i k a n C l o s u r e dan C u r r y i n g d i Bab 3 . Bab 3 sudah s e l e s a i . Mengganti s t r u k t u r bab 4 > 5 dan s e b a l i k n y a . Bab 4 s e l e s a i , Bab 3 minor r e v Bab 5 > (A) Synchronous programming Bab 5 > r e o r g a n i s a s i , minor r e v i s i o n Bab 5 : EventDriven Programming menggunakan e v e n t s . EventEmitter . => Bab 5 s e l e s a i Bab 6 : S e d i k i t p e n j e l a s a n t e n t a n g db NoSQL Bab 6 menambahkan p e n j e l a s a n t t g mongoDB : f i t u r , s e r v e r , c l i e n t web Bab 6 : nodegyp dan i n s t a l a s i d r i v e r mongodb Bab 6 : menambahkan i n s t a l a s i npm untuk mongodb Bab 6 : i n s t a l l mongojs , a k s e s mongojs d a r i Node . j s . Kurang a p l i k a s i web Bab 4 : menambahkan i n f o t t g i n s t a l l ke homedir ( j i k a b era da dlm home ) dan node_modules ( j i k a d i l u a r home ) Bab 6 : memulai a p l i k a s i web dengan n o d e j s+e x p r e s s j s+mongodb Bab 6 : s r c code utk a p l i k a s i web n o d e j s+e x p r e s s+mongoDB s e l e s a i Bab 6 s e l e s a i R e o r g a n i s a s i bab 7 dan 8 , menghapus db mongoDB , menambahkan README. md utk l a t i h a n 2 d i bab 6 E d i t README. md bab 6 Menambah i s i bab 7 dan 8 Bab 8 : source code utk s o c k e t . i o Bab 8 s e l e s a i , menambahkan c on to h a p l i k a s i S o c k e t . i o S e l e s a i . s e d i k i t pembenahan . h a r i i n i bab 7 dan 8 s e l e s a i R e v i s i minor bab 6 dan 8 Menambahkan d a f t a r p u s t a k a yang digunakan R e v i s i minor d i bbrp bab , terutama t e r k a i t margin kanan yg t e r l a l u b a b l a s Menambahkan i n d e k s Bambang Purnomosidi D. P . ( 1 ) : Merge p u l l r e q u e s t # 1 from adzymaniac / master
Indeks
AJAX, 64 Aliran kendali, 27 Array, 24 Asynchronous, 45 Bayeux Protocol, 65 Boolean, 24 BOSH, 65 Callback, 45 Closure, 34 Cloud Computing, 1 Denisi, 1 Karakteristik, 1 Model layanan, 3 Private, 3 Public, 3 CloudFoundry, 4 vmc, 4 Comet, 65 CommonJS, 19 Currying, 34 Dynamically typed, 20 ECMAScript, 19 Ekspresi Lambda, 32 Event-Driven, 44 events.EventEmitter, 44 Floating-point, 25
Fungsi, 22 Fungsi Anonim, 23 Fungsi rekursif, 23 Higher-order Function, 33 Identier, 21 if, 27 Integer, 24 JSON, 26 Validator, 43 Konstanta, 21 Literal, 24 Looping, 28 mongoDB, 47 Driver, 52 Multitenancy, 3 MVC, 58 dan ExpressJS, 60 Nested functions, 23 Node-gyp, 51 Node.js, 4 Hosting, 4 Non-blocking IO, 45 NOSQL, 47 npm, 38 Cari paket, 40
81
Indeks Hapus paket, 40 Info paket, 41 install paket, 39 Struktur paket, 39 Update paket, 42 Obyek, 25, 35 PBO, 35 Penanganan error, 31 Pewarisan, 36 Pola arsitektur, 58 Readline, 19 Real-time Web, 64 REPL, 17 Server-Sent Events, 65 Socket.io, 66 String, 25 switch, 27 Tipe data, 20 Variabel, 21 WebSocket, 66
82