Mengembangkan API Untuk Aplikasi Mobile dan Web Menggunakan Nodejs

Hamamul Fauzi
6 min readOct 6, 2020

--

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 dijalankan
  • config: path ke file konfigurasi
  • options-path: path ke sebuah json file dengan opsi-opsi tambahan
  • migrations-path: path ke folder migrasi
  • seeders-path: path to ke folder seeder
  • models-path: path ke folder model
  • url: database connection string yang akan digunakan
  • debug: ketika disediakan akan menampilkan berbagai informasi debug

Contoh skenario dimana file ini digunakan:

  • Ketika ingin memindahkan default pathdari migrations, models, seeders atau config folder. Default seperti yang telah dituliskan tadi. Lalu mungkin ingin memindahkan semua aksi database ke dalam folder db/migration maka dituliskan seperti berikut
    'migration-path'=path.resolve('db/migration')
  • ketikan ingin mengubahconfig.json ke nama file lain, misal database.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

Tabel User

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.

--

--

Hamamul Fauzi
Hamamul Fauzi

Written by Hamamul Fauzi

Flutter Developer who have interest in API Development

No responses yet