Masih meneruskan posting kemarin tentang Belajar Bahasa Pemrograman. Kali ini saya menuliskan tentang proses balajar Node.js. Sebenarnya Node.js ini bukanlah bahasa pemrograman. Dia adalah sebuah runtime yang dibangun dari mesin Chrome v8. Mesin ini sejatinya ada di browser Chrome. Tugasnya untuk menjalankan JavaScript sehingga browser bisa lebih interaktif dan dinamis. Nah mesin ini dibawa ke sisi server sehingga bisa dijadikan back-end yang handal.
Keuntungan utamanya adalah supaya programmer cukup belajar 1 bahasa pemrograman saja namun sudah bisa membuat program untuk front-end (sisi client) sekaligus back-end (sisi server). Cukup belajar bahasa JavaScript saja. Ini tentu berbeda dengan sebelumnya dimana programmer dituntut belajar JavaScript untuk front-end dan PHP untuk back-end. Opsi untuk back-end sebenarnya cukup banyak, seperti python, Golang, .NET, Ruby on Rails, dan lain-lain. Belum lagi banyaknya opsi framework untuk masing-masing bahasa tersebut. Pusing kan?
Dengan diadopsinya mesin runtime JavaScript di server ini sudah sangat membantu programmer sehingga bisa full stack (memprogram dari front-end sampai back-end) dengan 1 bahasa saja, yaitu JavaScript. Ehm, sebenarnya tidak benar-benar hanya 1 bahasa sih, karena tetap harus belajar HTML, CSS, dan SQL.
Nah, terkait dengan pekerjaan, saat ini saya sedang membutuhkan fitur messaging yang realtime, handal dan mudah. Dan kriteria ini terdapat di Socket.io, sebuah library terkenal untuk Node.js. Untuk dapat mengadopsinya, mau tidak mau harus belajar Node.js. Syukurlah belajar Node.js tidak terlalu sulit karena saya sudah sedikit mengerti Java dan JavaScript.
Tapi bukan berarti tidak ada kesulitan. Karena untuk belajar Node.js ini perlu sedikit mengubah paradigma sebelumnya di mana saya lebih familiar dengan solusi LAMP stack (Linux, Apache, MySQL, PHP). Node.js punya library Express yang dapat berfungsi sebagai web server dengan mudah. Sudah punya mekanisme rewrite yang mana sebelumnya harus dikonfigurasi di Apache. Perlu tambahan modul seperti body-parser, querystring, url dan mysql supaya bisa seperti LAMP stack. Plus modul Socket.io tentu saja. Enaknya adalah semuanya sudah tersedia. Tinggal install via npm dan gunakan saja. Praktis deh pokoknya kalau pakai npm ini.
Namun bukan berarti kemudian tidak ada kesulitan ya? Karena setelah itu persoalan muncul ketika saya mulai mengakses database. Sesuai nature-nya, Node.js tidak menunggu proses I/O ke MySQL. Setelah menjalan proses akses ke database, Node.js menyerahkannya ke callback dan meneruskan ke proses berikutnya. Ini berbeda dengan PHP atau Python yang terstruktur yang menunggu sebuah proses selesai baru kemudian melanjutkan ke proses selanjutnya. Semua berjalan urut. Kecuali jika mengaktifkan thread.
Sedangkan Node.js sudah asynchronous dan non-blocking. Saya yang berasal dari pemrograman terstruktur jadi bingung, karena jika ada proses A, B, C yang ditulis berurutan, mungkin proses C sudah selesai lebih dulu. Karena proses tidak selesai berurutan, maka program harus memastikan A, B, C selesai barulah mengembalikan hasil ke client. Kalau tidak dipastikan, maka bisa jadi yang dikembalikan ke client cuma proses C yang selesai duluan. Atau jika proses A, B, C ini terkait I/O yang diperlakukan non-blocking, maka tidak ada hasil yang dikembalikan ke client. Jadi kita harus memastikan semua proses selesai.
Setelah pusing beberapa jam, akhirnya masalah ini bisa dipecahkan dengan Promise. Promise ini memastikan suatu proses selesai untuk kemudian menyerahkan hasil prosesnya ke proses selanjutnya. Bisa juga menggunakan async/await dengan mekanisme berbeda, tapi untuk kasus saya sudah cukup menggunakan Promise.
Oh iya, sebelum belajar Promise, code saya nyaris terjebak ke apa yang disebut sebagai callback hell. Yaitu suatu kondisi dimana terjadi banyak callback yang nested. Code jadi banyak indentasi. Tampak bagus sih, tapi jadi sangat sulit ditelusuri jika ada yang salah, hahaha…
Tapi semenjak belajar Promise jadi lebih baik code-nya. Lebih bersih dan nyaman ditelusuri jika ada yang salah.
Di atas adalah screenshot code hasil belajar Promise. Entah benar atau tidak. Entah efisien atau tidak. Yang pasti sih sudah bisa memecahkan masalah saya.
Kalau pembaca punya masukan, pendapat, saran atau kritik, jangan ragu untuk menuliskannya di bagian komentar. Siapa tahu kita bisa belajar bersama.
Salam.