Buat REST API Dengan Express JS Dan Mongoose

Hmm apa yaa? OK. Enjoy!

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.

https://twitter.com/kevanantha/status/1202270840777138176?s=20

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, pastiin curl uda terinstall, kalo jq 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!

Menikmati tulisan ini?

Blog ini tidak menampilkan iklan, yang berarti blog ini didanai oleh pembaca seperti kamu. Gabung bersama yang telah membantu blog ini agar terus bisa mencakup tulisan yang lebih berkualitas dan bermanfaat!

Pendukung

Kamu?