Mengembangkan API Untuk Aplikasi Mobile dan Web Menggunakan Nodejs
Halo. Kali ini kita akan sedikit masuk ke dunia backend, yaitu membuat API menggunakan nodejs yang dapat di gunakan untuk aplikasi mobile ataupun web. Pada artikel ini api yang dibuat bukan dari awal, tapi menggunakan sebuah skeleton backend nodejs yang dibuat oleh senior software engineer yang telah berpengalaman di perusahaan saya sekarang. Sebagai pemula di bidang ini, saya merasa skeleton tersebut sangat mudah dipelajari dan akan mempercepat proses pengembangan. Terlebih juga, skeleton tersebut telah didesain seperti layaknya framework pada umumnya, yaitu memiliki konfigurasi environment, terdapat migrasi, model, seeder, router dan tentunya sistem keamanan identitas berbasis bearer. Project tersebut telah di upload ke repository Github di bawah ini.
Disini saya akan sedikit mendemonstrasikankan bagaimana penggunaan skeleton tersebut agar teman-teman yang baru ingin mencoba mempelajari dunia backend dapat menggunakannya juga.
Konfigurasi
Pertama, mari kita clone dulu repo tersebut ke komputer .
git clone https://github.com/taufiqrahman/Node-restApi-Boilerplate.git node_api
lalu sesuai pada readme.md pada project tersebut, ada beberapa inisialisasi yang perlu dilakukan, salah satunya adalah npm install
.
npm install
Untuk query data ke db, kita akan menggunakan sequelize
. Install terlebih dahulu sequelize secara global dengan perintah berikut.
npm install -g sequelize-cli
Untuk menghubungkan sequelize ke database, kita perlu memberitahukan sequelize bagaimana cara terhubung ke database melalui file config/config.json
. Tetapi tenang saja, untuk konfigurasi ini telah dibungkus sedemikian rupa sehingga tidak melalui config.json
, melainkan melalui main.js
yang terletak di dalam folder config. Kita hanya perlu mengubah melalui file .env
dengan cara menyalin env-example
menjadi file baru bernama .env
kemudian membuat sebuah file .sequelizerc
untuk memberitahukan sequelize dimana pengaturan tersebut berada karena kita menggunakan dynamic configuration. Sesuaikan pengaturan dengan database yang akan digunakan. Dalam hal ini, saya menggunakan mysql dengan pengaturan berikut:
# .envNODE_ENV=development
PORT=3000
# Set Database here
DBHOST = 127.0.0.1
DBUSER = root
DBPASS = root
DBNAME = node_api
Silahkan buat file baru untuk .sequelizerc
pada root folder dan salin kode berikut:
# .sequelizercconst path = require('path');module.exports = {
'config': path.resolve('config', 'main.js'),
'models-path': path.resolve( 'models'),
'seeders-path': path.resolve( 'seeders'),
'migrations-path': path.resolve( 'migrations')
};
.sequelizerc
File ini adalah file konfigurasi khusus yang memungkinkan kita untuk menetapkan parameter berikut yang biasanya diikutsertakan sebagai argumen pada CLI
env
: environment dimana perintah akan dijalankanconfig
: path ke file konfigurasioptions-path
: path ke sebuah json file dengan opsi-opsi tambahanmigrations-path
: path ke folder migrasiseeders-path
: path to ke folder seedermodels-path
: path ke folder modelurl
: database connection string yang akan digunakandebug
: ketika disediakan akan menampilkan berbagai informasi debug
Contoh skenario dimana file ini digunakan:
- Ketika ingin memindahkan default pathdari
migrations
,models
,seeders
atauconfig
folder. Default seperti yang telah dituliskan tadi. Lalu mungkin ingin memindahkan semua aksi database ke dalam folderdb/migration
maka dituliskan seperti berikut'migration-path'=path.resolve('db/migration')
- ketikan ingin mengubah
config.json
ke nama file lain, misaldatabase.json
. atau untuk keperluan dynamic configuration seprti yang sedang kita buat
Apa yang terjadi kalau tidak dibuat .sequelizerc
?
Pada saat awal, sebenarnya diperlukan perintah sequelize init
untuk membuat folder config, models, migrations dan seeders. Tapi pada project tersebut, sudah tersedia folder yang akan dibuat, namun tidak terdapat config.json
yang mana sebelumnya telah dijelaskan bahwa kita akan menggunakan config/main.js
sebagai konfigurasi.
Jika tidak ada .sequelize.rc
pada root folder, saat menjalankan perintah sequelize, sangat besar kemungkinan muncul pesan kesalahan berikut:
Cannot find "/project_folder_location/project_name/config/config.json". Have you run "sequelize init"?
Oke. Jika sudah membuat file .env
serta .sequelizerc
, kita dapat menjalankan perintah sequelize. Pada project ini sudah terdapat migration untuk tabel user yang akan digunakan pada autentukasi di API. Jalankan perintah berikut untuk membuat tabel di database.
sequelize db:migrate
Jika berhasil, maka akan muncul log seperti berikut:
sequelize CLI [Node: 12.18.3, CLI: 5.5.1, ORM: 5.21.3]Loaded configuration file "config/main.js".
Using environment "development".
(node:47839) [SEQUELIZE0004] DeprecationWarning: A boolean value was passed to options.operatorsAliases. This is a no-op with v5 and should be removed.
== 20200127124015-createUserTable: migrating =======
== 20200127124015-createUserTable: migrated (0.118s)
Mari kita lihat ke database, seharusnya terdapat sebuah tabel baru dengan nama user
. Untuk field yang terdapat pada tabel tersebut, dapat disesuaikan pada folder migrations/20200127124015-createUserTable.js
Baik, sekarang pengaturannya selesai. Mari kita coba API ini melalui insomnia
atau postman
. Jangan lupa untuk start menggunakan perintah berikut. Semuanya sudah ada di readme jika teman-teman ingin mendalami.
node index.js
Oh ya, menggunakan perintah node index.js
memerlukan restart setiap kali ada perubahan. Saya lebih memilih menggunakan nodemon
karena pada setiap perubahan, aplikasi akan dimulai ulang secara otomatis. Perintahnya hampir sama, namun harus menginstall terlebih dahulu jika belum tersedia. Coba cari di google atau StackOverflow ya..
nodemon index.js
pada saat menjalankan perintah tersebut, akan muncul log dan juga pesan error jika terdapat kesalahan. Semisal berikut adalah jika database yang digunakan belum memiliki konfigurasi yang tepat, maka harus diperiksa kembali nilai pada berkas .env
.
Unhandled rejection SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306
Pada readme terdapat endpoint dan request body untuk menjalankan api. Saya akan contohkan beberapa route yang telah ada:
Register
curl --request POST \
--url http://localhost:3000/api/v1/user/signup \
--header 'content-type: application/json' \
--cookie 'advanced-web_app=3j0c0eekp0qakpe6obbvtrka41; _csrf=MlrFBT1DjOvug8FWYD0GSBCLQ4XtVRw2; advanced-mobile=j5u676vtrb1hacgsif49o9qj40' \
--data '{
"username": "name",
"password": "123456",
"email":"name@gmail.com"
}'
Coba kita cek ke database tabel user. Seharusnya ada record baru sesuai dengan data yang kita kirimkan. Pada database saya tentunya ada.
Login
curl --request POST \
--url http://localhost:3000/api/v1/user/signin \
--header 'content-type: application/json' \
--cookie 'advanced-web_app=3j0c0eekp0qakpe6obbvtrka41; _csrf=MlrFBT1DjOvug8FWYD0GSBCLQ4XtVRw2; advanced-mobile=j5u676vtrb1hacgsif49o9qj40' \
--data '{
"username": "name",
"password": "123456"
}'
Show user information (with bearer)
Nah untuk endpoint ini membutuhkan autentikasi melalui bearer token. Token ini bisa di dapatkan pada response login ataupun register.
Lalu, bagaimana kalau tokennya salah untuk endpoint yang memiliki auth bearer? bagaimana kalau informasi login yang diberikan salah? Bisa dicoba sendiri, tapi default seperti ini.
Tapi wait, ini kan yang sudah disediakan dari project. Kalau mau membuat yang endpoint baru bagaimana caranya?
Oke, tenang dulu. Pada bagian kedua akan saya coba sedikit menjelaskan cara membuat endpoint baru dengan menggunakan project ini dan sequelize
. Pada tahap ini teman-teman sudah memiliki minimal fitur untuk API. Tinggal bagaimana cara teman-teman mengembangkan apa yang telah ada. Mungkin setelah bagian kedua nanti, akan sedikit lebih tercerahkan jika belum pernah bermain dengan hal seperti ini sebelumnya.
Untuk kode yang dapat langsung digunakan, saya telah membuat salinan melalui fork github yang dapat diakses melalui link dibawah ini. Ada beberapa branch, feel free jika ingin melihat-lihat.
Sampai jumpa di bagian kedua. Semoga artikel ini bermanfaat.