{"id":34327986,"url":"https://github.com/idjs/belajar-nodejs","last_synced_at":"2026-03-11T16:02:45.274Z","repository":{"id":9323147,"uuid":"11167260","full_name":"idjs/belajar-nodejs","owner":"idjs","description":"Introduction to Node.js and Example Applications (Bahasa Indonesia)","archived":false,"fork":false,"pushed_at":"2019-08-19T09:15:21.000Z","size":9538,"stargazers_count":59,"open_issues_count":0,"forks_count":28,"subscribers_count":13,"default_branch":"gh-pages","last_synced_at":"2025-12-21T02:41:17.403Z","etag":null,"topics":["ebook","indonesian-language","javascript","nodejs"],"latest_commit_sha":null,"homepage":"http://idjs.github.io/belajar-nodejs/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/idjs.png","metadata":{"files":{"readme":"README-OLD.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-07-04T04:45:12.000Z","updated_at":"2025-07-23T04:43:34.000Z","dependencies_parsed_at":"2022-09-07T01:53:40.047Z","dependency_job_id":null,"html_url":"https://github.com/idjs/belajar-nodejs","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/idjs/belajar-nodejs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idjs%2Fbelajar-nodejs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idjs%2Fbelajar-nodejs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idjs%2Fbelajar-nodejs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idjs%2Fbelajar-nodejs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/idjs","download_url":"https://codeload.github.com/idjs/belajar-nodejs/tar.gz/refs/heads/gh-pages","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idjs%2Fbelajar-nodejs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30386983,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T14:10:17.325Z","status":"ssl_error","status_checked_at":"2026-03-11T14:09:37.934Z","response_time":84,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ebook","indonesian-language","javascript","nodejs"],"created_at":"2025-12-17T17:03:16.068Z","updated_at":"2026-03-11T16:02:45.268Z","avatar_url":"https://github.com/idjs.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"Belajar Node.js\n===============\nMaintained by [Equan Pr][1].\n\n[![cc-by-3.0](http://i.creativecommons.org/l/by/3.0/80x15.png)](http://creativecommons.org/licenses/by/3.0/)\n\n\n\u003e Buku ini juga tersedia di GitBook online. Kunjungi link berikut ini untuk format PDF, EPUB atau MOBI \n\u003e http://junwatu.gitbooks.io/pengenalan-nodejs/\n\n\nDaftar Isi:\n\n+ [Pengenalan] (#Pengenalan)\n+ Asinkron I/O \u0026 Event\n+ Server HTTP Dasar\n+ Menyediakan File Statis\n+ Memproses Data Form HTML\n+ Modul\n+ Express - Framework Aplikasi Web\n+ Aplikasi Picture Uploader\n\n\n##Pengenalan\n\nJavascript merupakan bahasa pemrograman yang lengkap hanya saja selama ini di pakai sebagai bahasa untuk pengembangan aplikasi web yang berjalan pada sisi client atau browser saja. Tetapi sejak ditemukannya Node.js oleh Ryan Dhal pada tahun 2009, Javascript bisa digunakan sebagai bahasa pemrograman di sisi server sekelas dengan PHP, ASP, C#, Ruby dll dengan kata lain Node.js menyediakan platform untuk membuat aplikasi Javascript dapat dijalankan di sisi server. \n\nUntuk mengeksekusi Javascript sebagai bahasa server diperlukan engine yang cepat dan mempunyai performansi yang bagus. Engine Javascript dari Google bernama V8 yang dipakai oleh Node.js yang merupakan engine yang sama yang dipakai di browser Google Chrome.\n\n\n###Javascript Di Server\n\n\nTak terelakkan bahwa Javascript merupakan bahasa pemrograman yang paling populer. Jika anda sebagai developer pernah mengembangkan aplikasi web maka penggunaan Javascript pasti tidak terhindarkan.\n\nSekarang dengan berjalannya Javascript di server lalu apa keuntungan yang anda peroleh dengan mempelajari Node.js, kurang lebih seperti ini :\n\n+ Pengembang hanya memakai satu bahasa untuk mengembangkan aplikasi lengkap client \u0026 server sehingga mengurangi 'Learning Curve' untuk mempelajari bahasa server yang lain.\n\n+ Sharing kode antara client dan server atau istilahnya code reuse.\n\n+ Javascript secara native mendukung JSON yang merupakan standar transfer data yang banyak dipakai saat ini sehingga untuk mengkonsumsi data-data dari pihak ketiga pemrosesan di Node.js akan sangat mudah sekali.\n\n+ Database NoSQL seperti MongoDB dan CouchDB mendukung langsung Javascript sehingga interfacing dengan database ini akan jauh lebih mudah.\n\n+ Node.js memakai V8 yang selalu mengikuti perkembangan standar ECMAScript, jadi tidak perlu ada kekhawatiran bahwa browser tidak akan mendukung fitur-fitur di Node.js.\n\n\n###Node.js In Action\n\nSupaya anda lebih tertarik dalam belajar Node.js berikut beberapa website terkenal yang sudah memakai Node.js\n\n\nwww.myspace.com\n\n![myspace](https://raw.github.com/idjs/belajar-nodejs/gh-pages/images/mypspace.png)\n\n\nwww.yummly.com\n\n![yummly](https://raw.github.com/idjs/belajar-nodejs/gh-pages/images/yummly.png)\n\n\nwww.shutterstock.com \n\n![shutterstock](https://raw.github.com/idjs/belajar-nodejs/gh-pages/images/shutterstock.png)\n\n\nwww.klout.com\n\n![klout](https://raw.github.com/idjs/belajar-nodejs/gh-pages/images/klout.png)\n\n\nwww.geekli.st\n\n![geeklist](https://raw.github.com/idjs/belajar-nodejs/gh-pages/images/geeklist.png)\n\n\nwww.learnboost.com\n\n![learnboost](https://raw.github.com/idjs/belajar-nodejs/gh-pages/images/learnboost.png)\n\n\nApakah masih ragu untuk memakai Node.js ?...Kalau masih penasaran apa yang membuat Node.js berbeda dari backend pada umumnya, silahkan dilanjutkan membaca :smile:\n\n\n##Asinkron I/O \u0026 Event\n\n\nTidak seperti kebanyakan bahasa backend lainnya operasi fungsi di javascript lebih bersifat `asinkron` dan banyak menggunakan `event` demikian juga dengan Node.js. Sebelum penjelasan lebih lanjut mari kita lihat terlebih dahulu tentang metode `sinkron` seperti yang dipakai pada PHP dengan web server Apache.\n\n\n###PHP \u0026 Server HTTP Apache\n\nMari kita lihat contoh berikut yaitu operasi fungsi akses ke database MySQL oleh PHP yang dilakukan secara sinkron\n\n```\n$hasil = mysql_query(\"SELECT * FROM TabelAnggota\");\nprint_r($hasil);\n```  \n\npengambilan data oleh `mysql_query()` diatas akan dijalankan dan operasi berikutnya `print_r()` akan diblok atau tidak akan berjalan sebelum akses ke database selesai. Yang perlu menjadi perhatian disini yaitu proses Input Output atau I/O akses ke database oleh `mysql_query()` dapat memakan waktu yang relatif mungkin beberapa detik atau menit tergantung dari waktu latensi dari I/O. Waktu latensi ini tergantung dari banyak hal seperti \n\n+ Query database lambat akibat banyak pengguna yang mengakses\n+ Kualitas jaringan untuk akses ke database jelek\n+ Proses baca tulis ke disk komputer database yang membutuhkan waktu\n+ ...\n\nSebelum proses I/O selesai maka selama beberapa detik atau menit tersebut state dari proses `mysql_query()` bisa dibilang idle atau tidak melakukan apa-apa. \n\nLalu jika proses I/O di blok bagaimana jika ada request lagi dari user ? apa yang akan dilakukan oleh server untuk menangani request ini ?..penyelesaiannya yaitu dengan memakai pendekatan proses `multithread`. Melalui pendekatan ini tiap koneksi yang terjadi akan ditangani oleh `thread`. Thread disini bisa dikatakan sebagai task yang dijalankan oleh prosesor komputer. \n\nSepertinya permasalahan I/O yang terblok terselesaikan dengan pendekatan metode ini tetapi dengan bertambahnya koneksi yang terjadi maka `thread` akan semakin banyak sehingga prosesor akan semakin terbebani, belum lagi untuk switching antar thread menyebabkan konsumsi memory (RAM) komputer yang cukup besar. \n\nBerikut contoh benchmark antara web server Apache dan Nginx (server HTTP seperti halnya Apache hanya saja Nginx memakai sistem asinkron I/O dan event yang mirip Node.js). Gambar ini diambil dari [goo.gl/pvLL4](http://goo.gl/pvLL4)\n\n\n![apache-vs-nginx-reqs-sec](https://raw.github.com/idjs/belajar-nodejs/gh-pages/images/nginx-apache-reqs-sec.png) \n\n\nBisa dilihat bahwa Nginx bisa menangani request yang jauh lebih banyak daripada web server Apache pada jumlah koneksi bersama yang semakin naik. \n\n\n###Javascript \u0026 Node.js\n\nKembali ke Javascript!. Untuk mengetahui apa yang dimaksud dengan pemrograman asinkron bisa lebih mudah dengan memakai pendekatan contoh kode. Perhatikan kode Javascript pada Node.js berikut \n\n\n```\nvar fs = require('fs');\n\t\nfs.readFile('./resource.json',function(err, data){\n\tif(err) throw err;\n\tconsole.log(JSON.parse(data));\n});\n\nconsole.log('Selanjutnya...');\n\n```\n\nfungsi `readFile()` akan membaca membaca isi dari file `resource.json` secara asinkron yang artinya  proses eksekusi program tidak akan menunggu pembacaan file `resource.json` sampai selesai tetapi program akan tetap menjalankan kode Javascript selanjutnya yaitu `console.log('Selanjutnya...')`. Sekarng lihat apa yang terjadi jika kode javascript diatas dijalankan\n\n\n![belajar-asinkron-nodejs](https://raw.github.com/idjs/belajar-nodejs/gh-pages/images/belajar-asinkron-nodejs.png)\n\n\nJika proses pembacaan file `resource.json` selesai maka fungsi callback pada `readFile()` akan di jalankan dan hasilnya akan ditampilkan pada console. Yah, fungsi callback merupakan konsep yang penting dalam proses I/O yang asinkron karena melalui fungsi callback ini data data yang dikembalikan oleh proses I/O akan di proses.\n\nLalu bagaimana platform Node.js mengetahui kalau suatu proses itu telah selesai atau tidak ?...jawabannya adalah [Event Loop](http://en.wikipedia.org/wiki/Event_loop). Event - event yang terjadi karena proses asinkron seperti pada fungsi `fs.readFile()` akan ditangani oleh yang namanya Event Loop ini.\n\nCampuran teknologi antara event driven dan proses asinkron ini memungkinkan pembuatan aplikasi dengan penggunaan data secara masif dan real-time. Sifat komunikasi Node.js I/O yang ringan dan bisa menangani user secara bersamaan dalam jumlah relatif besar tetapi tetap menjaga state dari koneksi supaya tetap terbuka dan dengan penggunaan memori yang cukup kecil memungkinkan pengembangan aplikasi dengan penggunaan data yang besar dan kolaboratif...Yeah, Node.js FTW! :metal:\n\n\n##Server HTTP Dasar\n\nPenggunaan Node.js yang revolusioner yaitu sebagai server. Yup...mungkin kita terbiasa memakai server seperti Apache - PHP, Nginx - PHP, Java - Tomcat - Apache atau IIS - ASP.NET sebagai pemroses data di sisi server, tetapi sekarang semua itu bisa tergantikan dengan memakai JavaScript - Node.js!. Lihat contoh dasar dari server Node.js berikut (kode sumber pada direktori code pada repositori ini)\n\n[`server-http.js`](https://raw.github.com/idjs/belajar-nodejs/gh-pages/code/server-http.js)\n\n```\nvar http = require('http'),\n\tPORT = 3400;\n\nvar server = http.createServer(function(req, res){\n\tvar body = \"\u003cpre\u003eHaruskah belajar Node.js?\u003c/pre\u003e\u003cp\u003e\u003ch3\u003e...Yo Mesto!\u003c/h3\u003e\u003c/p\u003e\"\n\tres.writeHead(200, {\n\t\t'Content-Length':body.length,\n\t\t'Content-Type':'text/html',\n\t\t'Pesan-Header':'Pengenalan Node.js'\n\t});\n\n\tres.write(body);\n\tres.end();\n});\n\nserver.listen(PORT);\n\nconsole.log(\"Port \"+PORT+\" : Node.js Server...\");\n\n```\n\nPaket [http](http://nodejs.org/api/http.html#http_http) merupakan paket bawaan dari platform Node.js yang mendukung penggunaan fitur-fitur protokol HTTP. Object `server` merupakan object yang di kembalikan dari fungsi `createServer()`.\n\n```\nvar server = http.createServer([requestListener])\n\n```\n\nTiap request yang terjadi akan ditangani oleh fungsi callback `requestListener`. Cara kerja callback ini hampir sama dengan ketika kita menekan tombol button html yang mempunyai atribut event `onclick`, jika ditekan maka fungsi yang teregistrasi oleh event `onclick` yaitu `clickHandler(event)` akan dijalankan. \n\n[`onclick-button.html`](https://raw.github.com/idjs/belajar-nodejs/gh-pages/code/onclick-button.html)\n\n```\n\u003cscript\u003e\n\tfunction clickHandler(event){\n\t\tconsole.log(event.target.innerHTML+\" Terus!\");\n\t}\n\u003c/script\u003e\n\n\u003cbutton onclick=\"clickHandler(event)\"\u003eTEKAN\u003c/button\u003e\n\n```\n\nSama halnya dengan callback `requestListener` pada object `server` ini jika ada request maka `requestListener` akan dijalankan\n\n\n```\n\nfunction(req, res){\n\tvar body = \"\u003cpre\u003eHaruskah belajar Node.js?\u003c/pre\u003e\u003cp\u003e\u003ch3\u003e...Yo Mesto!\u003c/h3\u003e\u003c/p\u003e\"\n\tres.writeHead(200, {\n\t\t'Content-Length':body.length,\n\t\t'Content-Type':'text/html',\n\t\t'Pesan-Header':'Pengenalan Node.js'\n\t});\n\n\tres.write(body);\n\tres.end();\n}\n\n```\n\nPaket http Node.js memberikan keleluasan bagi developer untuk membangun server tingkat rendah. Bahkan mudah saja kalau harus men-setting nilai field header dari [HTTP](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields). \n\nSeperti pada contoh diatas agar respon dari request diperlakukan sebagai HTML oleh browser maka nilai field `Content-Type` harus berupa `text/html`. Setting ini bisa dilakukan melalui metode [`writeHead()`](http://nodejs.org/api/http.html#http_response_writehead_statuscode_reasonphrase_headers), `res.setHeader(field, value)` dan beberapa metode lainnya. \n\nUntuk membaca header bisa dipakai fungsi seperti `res.getHeader(field, value)` dan untuk menghapus field header tertentu dengan memakai fungsi `res.removeHeader(field)`. Perlu diingat bahwa setting header dilakukan sebelum fungsi `res.write()` atau `res.end()` di jalankan karena jika `res.write()` dijalankan tetapi kemudian ada perubahan field header maka perubahan ini akan diabaikan.\n\nSatu hal lagi yaitu tentang [kode status dari respon HTTP](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes). Kode status ini bisa disetting selain 200 (request http sukses), misalnya bila diperlukan halaman error dengan kode status 404. \n\n\n###Menjalankan Server Node.js\n\nUntuk menjalankan server Node.js ketik perintah berikut\n\n```\n$ node server-http.js\nPort 3400 : Node.js Server...\n\n```\n\nBuka browser (chrome) dan buka url `http://localhost:3400` kemudian ketik `CTRL+SHIFT+I` untuk membuka Chrome Dev Tool, dengan tool ini bisa dilihat respon header dari HTTP dimana beberapa fieldnya telah diset sebelumnya (lingkaran merah pada screenshot dibawah ini)\n\n\n![server-response-dev-tool](https://raw.github.com/idjs/belajar-nodejs/gh-pages/images/server-response-dev-tool.png)\n\n\n\n##Menyediakan File Statis\n\n\nAplikasi web memerlukan file - file statis seperti CSS, font dan gambar atau file - file library JavaScript agar aplikasi web bekerja sebagaimana mestinya. File - file ini sengaja dipisahkan agar terstruktur dan secara *best practices* file - file ini memang harus dipisahkan. Lalu bagaimana caranya Node.js bisa menyediakan file - file ini ?...ok mari kita buat server Node.js untuk menyediakan file statis. \n\nAgar server Node.js bisa mengirimkan file statis ke klien maka server perlu mengetahui `path` atau tempat dimana file tersebut berada. \n\nNode.js bisa mengirimkan file tersebut secara streaming melalui fungsi [`fs.createReadStream()`](http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options). Sebelum dijelaskan lebih lanjut mungkin bisa dilihat atau di coba saja server file Node.js dibawah ini\n\n[`server-file.js`](https://raw.github.com/idjs/belajar-nodejs/gh-pages/code/server-file/server-file.js)\n\n```\nvar http = require('http'),\n\tparse = require('url').parse,\n\tjoin = require('path').join,\n\tfs = require('fs'),\n\troot = join(__dirname, 'www'),\n\tPORT = 3300,\n\n\tserver = http.createServer(function(req, res){\n\t\tvar url = parse(req.url),\n\t\t\tpath = join(root, url.pathname),\n\t\t\tstream = fs.createReadStream(path);\n\n\t\tstream.on('data', function(bagian){\n\t\t\tres.write(bagian);\n\t\t});\n\n\t\tstream.on('end', function(){\n\t\t\tres.end();\n\t\t});\n\n\t\tstream.on('error', function(){\n\t\t\tres.setHeader('Content-Type','text/html');\n\n\t\t\tvar url_demo = \"http://localhost:\"+PORT+\"/index.html\";\n\t\t\tres.write(\"coba buka \u003ca href=\"+url_demo+\"\u003e\"+url_demo+\"\u003c/a\u003e\");\n\t\t\tres.end();\n\t\t})\n\n\t});\n\n\tserver.listen(PORT);\n\tconsole.log('Port '+PORT+': Server File ');\n\n```\n\nBerikut sedikit penjelasan dari kode diatas\n\n- [`__dirname`](http://nodejs.org/api/globals.html#globals_dirname) merupakan variabel global yang disediakan oleh Node.js yang berisi path direktori dari file yang sedang aktif mengeksekusi `__dirname`. \n- `root` merupakan direktori root atau referensi tempat dimana file-file yang akan dikirimkan oleh server Node.js. Pada kode server diatas direktori root di setting pada direktori `www`.\n- `path` adalah path file yang bisa didapatkan dengan menggabungkan path direktori root dan `pathname`. `pathname` yang dimaksud di sini misalnya jika URL yang diminta yaitu `http://localhost:3300/index.html` maka `pathname` adalah `/index.html`. Nilai variabel `path` dihasilkan dengan memakai fungsi `join()`.  \n\n```\nvar path = join(root, url.pathname)\n```\n\n- `stream` yang di kembalikan oleh fungsi `fs.createReadStream()` merupakan class [`stream.Readable`](http://nodejs.org/api/stream.html#stream_class_stream_readable). Objek `stream` ini mengeluarkan data secara streaming untuk di olah lebih lanjut. Perlu menjadi catatan bahwa `stream.Readable` tidak akan mengeluarkan data jikalau tidak di kehendaki. Nah...cara untuk mendeteksi data streaming ini sudah siap di konsumsi atau belum adalah melalui event.\n\nEvent yang di dukung oleh class `stream.Readable` adalah sebagai berikut\n\n\n - Event: `readable`\n - Event: `data`\n - Event: `end`\n - Event: `error`\n - Event: `close`\n \n\nMungkin anda bertanya kenapa server file statis diatas memakai stream, bukankah menyediakan file secara langsung saja sudah bisa? jawabannya memang bisa, tetapi mungkin tidak akan efisien kalau file yang akan di berikan ke client mempunyai ukuran yang besar. Coba lihat kode berikut\n\n```\nvar http = require('http');\nvar fs = require('fs');\n\nvar server = http.createServer(function (req, res) {\n    fs.readFile(__dirname + '/data.txt', function (err, data) {\n        res.end(data);\n    });\n});\nserver.listen(8000);\n\n```\nJika file `data.txt` terlalu besar maka buffer yang digunakan oleh sistem juga besar dan konsumsi memori juga akan bertambah besar seiring semakin banyak pengguna yang mengakses file ini. \n\nJika anda ingin lebih banyak mendalami tentang Node.js Stream silahkan lihat resource berikut (dalam Bahasa Inggris):\n\n 1. [Node.js API Stream][2]\n 2. [Stream Handbook][3]\n\n\n##Memproses Data Form HTML\n\n\nAplikasi web memperoleh data dari pengguna umumnya melalui pengisian form HTML. Contohnya seperti ketika registrasi di media sosial atau aktifitas update status di Facebook misalnya pasti akan mengisi text field dan kemudian menekan tombol submit ataupun enter agar data bisa terkirim dan diproses oleh server.\n\n\nData yang dikirim oleh form biasanya salah satu dari dua tipe mime berikut\n\n- application/x-www-form-urlencoded\n- multipart/form-data\n\nNode.js sendiri hanya menyediakan parsing data melalui `body` dari `request` sedangkan untuk validasi atau pemrosesan data akan diserahkan kepada komunitas.\n\n### URL Encode\n\nHanya akan dibahas untuk 2 metode HTTP yaitu `GET` dan `POST` saja. Metode `GET` untuk menampilkan form html dan `POST` untuk menangani data form yang dikirim\n\nOk langsung kita lihat kode server sederhana untuk parsing data form melalui objek `request` dengan data form bertipe `application/x-www-form-urlencoded` yang merupakan default dari tag form.\n\n```\nvar http = require('http');\nvar data = [];\nvar qs = require('querystring');\n\nvar server = http.createServer(function(req, res){\n    if('/' == req.url){\n        switch(req.method){\n            case 'GET':\n                tampilkanForm(res);\n                break;\n            case 'POST':\n                prosesData(req, res);\n                break;\n            default:\n                badRequest(res);\n        }\n    } else {\n        notFound(res);\n    }\n});\n\nfunction tampilkanForm(res){\n    var html = '\u003chtml\u003e\u003chead\u003e\u003ctitle\u003eData Hobiku\u003c/title\u003e\u003c/head\u003e\u003cbody\u003e'\n\t\t+ '\u003ch1\u003eHobiku\u003c/h1\u003e'\n\t\t+ '\u003cform method=\"post\" action=\"/\"\u003e'\n\t\t+ '\u003cp\u003e\u003cinput type=\"text\" name=\"hobi\"\u003e\u003c/p\u003e'\n\t\t+ '\u003cp\u003e\u003cinput type=\"submit\" value=\"Simpan\"\u003e\u003c/p\u003e'\n\t\t+ '\u003c/form\u003e\u003c/body\u003e\u003c/html\u003e';\n\n    res.setHeader('Content-Type', 'text/html');\n    res.setHeader('Content-Length', Buffer.byteLength(html));\n    res.end(html);\n}\n\nfunction prosesData(req, res) {\n   var body= '';\n   req.setEncoding('utf-8');\n   req.on('data', function(chunk){\n       body += chunk;\n   });\n\n   req.on('end', function(){\n       var data = qs.parse(body);\n       res.setHeader('Content-Type', 'text/plain');\n       res.end('Hobiku: '+data.hobi);\n   });\n}\n\nfunction badRequest(res){\n   res.statusCode = 400;\n   res.setHeader('Content-Type', 'text/plain');\n   res.end('400 - Bad Request');\n}\n\nfunction notFound(res) {\n   res.statusCode = 404;\n   res.setHeader('Content-Type', 'text/plain');\n   res.end('404 - Not Found');\n}\n\nserver.listen(3003);\nconsole.log('server http berjalan pada port 3003');\n\n```\n\nUntuk mengetest `GET` dan `POST` bisa dilakukan melalui curl, browser atau melalui gui [Postman](http://www.getpostman.com/).\n\n####GET\n\n![GET form fields](https://raw.githubusercontent.com/idjs/belajar-nodejs/gh-pages/images/get-form.png)\n\n####POST\n\n![POST](https://raw.githubusercontent.com/idjs/belajar-nodejs/gh-pages/images/post-urlencoded-data.png)\n\n\n### Multipart Data\n\n##Modul npm\n\n`nice people matter`\n\nnpm merupakan package manager untuk Node.js dan untuk nama `npm` bukanlah suatu singkatan. Hanya dalam waktu 2 tahun sejak di releasenya Node.js ke publik jumlah modul melesat jauh bahkan hampir menyamai modul java ataupun ruby gems.\n\n\n![modulecount npm](https://raw.githubusercontent.com/idjs/belajar-nodejs/gh-pages/images/modul-npm.png)\n\n\nGrafik diatas didapat dari http://modulecounts.com.\n\nBanyaknya push module ke repositori npm dapat diartikan adanya kepercayaan publik terhadap platform ini dan untuk kedepannya Node.js akan menjadi platform yang prospektif untuk berinvestasi.\n\n###Konsep\n\nnpm memakai sistem modul [CommonJS](http://www.commonjs.org/specs/) yang cukup mudah dalam penggunaanya. Sistem modul ini akan meng-export objek JavaScript ke variabel `exports` yang bersifat global di modul tersebut.\n\nSebagai contoh\n\n`band.js`\n\n```\n'use strict';\n\nfunction Band(){}\n\nBand.prototype.info = function(){\n    return 'Nama Band: '+this.name;\n}\n\nBand.prototype.add = function(name){\n    this.name = name;\n}\n\nmodule.exports = new Band();\n```\n\nUntuk pemakaiannya seperti di bawah ini\n\n`app.js`\n\n```\nvar band = require('./band.js');\nband.add('Dewa 19');\n\nconsole.log(band.info);\n\n```\n\n###npmjs.org\n\nSejak versi Node.js 0.6.3 command `npm` sudah ter-bundle dengan installer Node.js. Untuk menginstall modul npm yang anda butuhkan ketik misalnya\n\n```\nnpm install express\n\n```\n\nperintah diatas akan mendownload paket `express` dari `http://npmjs.org` dan secara otomatis akan membuat directory `node_modules`.\n\nUntuk memakai modul `express` ini cukup dengan membuat file JavaScript baru di luar direktori `node_modules` dan load modul dengan keyword `require`.\n\n\n```\nvar app = require('express');\n\n// kode lainnya\n\n```\n\n##Membuat Paket npm\n\nBerikut alur umum untuk membuat paket npm\n\n\n\n![alur pembuatan npm](https://raw.githubusercontent.com/idjs/belajar-nodejs/gh-pages/images/npm-flow.png)\n\n\n\nUntuk lebih jelasnya silahkan kunjungi dokumentasi untuk [developer npm](https://www.npmjs.org/doc/misc/npm-developers.html).\n\n\n\n\n##Express - Framework Aplikasi Web\n\n(TODO:)\n\n##Aplikasi Picture Uploader\n\n(TODO:)\n\n\n  [1]: http://junwatu.github.io\n  [2]: http://nodejs.org/api/stream.html\n  [3]: https://github.com/substack/stream-handbook\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fidjs%2Fbelajar-nodejs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fidjs%2Fbelajar-nodejs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fidjs%2Fbelajar-nodejs/lists"}