Kemarin gue sempet polling di Twitter buat REST API pake Express atau Rails API, jadi kerena hasilnya 50:50 (8 orang doang yang vote hahaha), gue putusin pake tulisan jawa.
Lanjutin nulis REST API, mau pake apa ya?
— Kevin Anantha (@kevanantha) December 4, 2019
Gue langsung aja deh. At least kelen bisa JS dan basic Express untuk baca tulisan ga jelas ini, kalo belum mundur dulu om (Cmd + w atau Ctrl + w).
Dan satu lagi, tulisan ini belum termasuk error handling dan belum MVC(Model View Controller) juga.
Usahain jangan copas ye, biar belajar tuh jari-jarinya ngetik 11 jari dan ngerti flownya.
Setup Express
Silakan siapin working directory dulu om, kosongan aja gpp.
Pertama-tama init package.json dulu
// jalanin ini command di bawah satu-satu ya, ngerti lah ya setup doang
npm init -y
npm i express
touch app.js
Gue pake nodemon
di global, kalo kelen mau pake di lokal boleh... atau mau pake node
silakan juga...
Untuk install nodemon
di lokal tinggal jalanin:
npm i -D nodemon
Lalu buka text editor kesayangan kelen.
Di app.js
setup server.
const express = require('express')
const PORT = 3000
const app = express()
app.listen(PORT, _ => console.log(`Server runs on PORT: ${PORT}))
Tambahin "dev": "nodemon app.js"
di script package.json
.

Terus jalanin npm run dev
di terminal kelen.
Setup Mongoose
Apa itu mongoose? baca sendiri yaa, nih ada quick startnya juga tuh.
Tapi sebelumnya harus setup MongoDB
dulu, semangat..
Install mongoose, run command npm i mongoose
di terminal.
app.js
const express = require('express')
const mongoose = require('mongoose')
const { Schema, model } = mongoose
const PORT = process.env.PORT || 3000
const app = express()
// connect ke mongodb
mongoose
.connect('mongodb://localhost:27017/rest-api', {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(_ => console.log('Connected to DB'))
.catch(err => console.log(err))
// buat schema
const articleSchema = new Schema(
{
title: String,
author: String,
content: String,
},
{ timestamps: true, versionKey: false },
)
const Article = model('Article', articleSchema)
...
GET Endpoint
Masih di app.js
. Tambahin kode ini.
...
const app = express()
app.get('/articles', async (req, res) => {
const articles = await Article.find()
res.status(200).json(articles)
})
app.listen(PORT, _ => console.log(`Server runs on PORT: ${PORT}`))
Run curl http://localhost:3000/articles | jq
di terminal. (ini bebas mau pake Postman atau JME atau TIKO atau Insomnia atau Anemia atau Amnesia)
Kalo mau pake curl, pastiincurl
uda terinstall, kalojq
itu opsional sih, biar cantik aja kayak Resly (hi).
Untuk methods yang ada di mongoose bisa liat disini lengkap.
Pas jalanin curl http://localhost:3000/articles | jq
di terminal seharusnya dapet array kosong karena di database masih belom ada apa-apa.
Untuk HTTP status bisa baca disini.
POST Endpoint
Sekarang create data nih..
Setelah kode yang tadi, sekarang tambahin kode ini:
app.post('/articles', async (req, res) => {
const { title, author, content } = req.body
const article = await Article.create({ title, author, content })
res.status(201).json(article)
})
Sebelum eksekusi, kita harus nambahin middleware parser
...
const app = express()
app.use(express.json() // for parsing application/json
app.use(express.urlencoded({ extended: false })) // for parsing application/x-www-form-urlencoded
...
Langsung tembak aja endpointnya http://localhost:3000/articles
dengan method POST
curl -d '{"title": "ormas nakal", "author": "epilfooktori", "content": "Jangan ganggu dia lagi!"}' \
-H "Content-Type: application/json" \
-X POST http://localhost:3000/articles | jq
Kalo mau liat GUInya juga bisa, tinggal download MongoDB Compass atau semacamnya.

Coba GET
lagi dengan jalanin perintah curl http://localhost:3000/articles
, seharusnya responsenya ga array kosong lagi.
Find One
app.get('/articles/:articleId', async (req, res) => {
const article = await Article.findById(req.params.articleId)
res.status(200).json(article)
})
Cara pakenya => curl http://localhost:3000/articles/<articleId>
Run:
curl http://localhost:3000/articles/5df3e372f8a0e1633c31e962 | jq
Tadi karena datanya cuma 1 ga terlalu keliatan sih, coba aja create data lagi, terus find one lagi biar keliatan.
DELETE Endpoint
app.delete('/articles/:articleId/delete', async (req, res) => {
const article = await Article.deleteOne({ _id: req.params.articleId })
res.status(200).json(article)
})
Cara pakenya => curl http://localhost:3000/articles/<articleId>/delete
Run:
curl -X DELETE http://localhost:3000/articles/5df3e372f8a0e1633c31e962/delete | jq
PUT Endpoint (Update)
Untuk update bisa pake PUT
atau PATCH
Yang gue tau kalo PUT
lebih untuk ganti semua data kalo PATCH
untuk ganti spesifik data (misalnya mau ganti field title aja dan yang lain ga di ganti), tapi pake dua-duanya ga masalah deh KAYAKNYA #CMIIW.
Untuk kali ini pake yang PUT
aja ya, kalo mau pake yang PATCH
coba-coba aja sendiri.
app.put('/articles/:articleId/update', async (req, res) => {
const { title, author, content } = req.body
const article = await Article.updateOne(
{ _id: req.params.articleId },
{
title,
author,
content,
},
)
res.status(200).json(article)
})
Run:
curl -d '{"title": "ormas ga jelas", "author": "epilfooktori gaje", "content": "Sikat!"}' \
-H "Content-Type: application/json" \
-X PUT http://localhost:3000/articles/5df3e372f8a0e1633c31e962/update | jq
Mantap, uda jadi REST APInya..
Kira-kira semua kodenya kayak gini:

Terimakasih. Jangan kesini lagi ya!