Middleware untuk Handle Error RESTful API Node JS + Express

Muhamad Azmi Rizkifar
Chevalier Lab
Published in
6 min readMay 12, 2020

Haloo semuanyaa…
Gimana nih pada lancar ga puasanya? karena sebelumnya gua pernah janji mau bikin tutorial buat bikin Error Handling, jadi gua bakal tepatin janjinya nihh

Langsung aja yaa gua lanjut lagi tutorial sebelumnya yang RESTful API Node JS + Express + MySQL dengan Model & Controller. Kalau belum ikutin tutorial sebelumnya, kalian bisa pergi kesini dulu yah ikutin antriannya dari awal biar terstruktur belajarnyaa

Karena bagian ini adalah tutorial lanjutan dari tutorial diatas yaa

Sebelumnya udah pada tau kah kenapa perlu kita membuat error handling? lalu apa sih middleware itu?

Yok kita breakdown satu-satu dulu definisinya. Kenapa kita perlu error handling? karena tentunya kita sebagai developer gamau dong sampai aplikasi/project yang kita buat itu mengalami crash pada saat dijalankan oleh user. Nah maka dari itu kita perlu handling si error ini supaya ketika nanti user melakukan aktivitas yang berujung pada terjadinya error, aplikasi kita ga mengalami crash karena sudah kita handle si error nya ini. Dan error handling ini macemnya banyak banget cuyy, karena setiap error itu jenisnya banyak.

Nahh kalau middleware ni apa sih? pada dasarnya midleware ini adalah “penengah” atau “jembatan”. Kok gitu? karena middleware ini simplenya adalah sebuah aturan yang harus kita lewatin dulu sebelum masuk ke dalam sebuah sistem. Contoh gampangnya sih gini…

Misalkan kita mau ngelamar kerja ke perusahaan besar nih, tentunya kita harus ngelewatin prosedurnya dulu dong sebelum kita bisa diterima di perusahaan tersebut? Ya mungkin kita di interview, test kelayakan, dan prosedur lainnya. Nahh tahapan itu bisa kita sebut sebagai middleware.

Itu sedikit intermezzonya dulu yaa sebelum gua mulai tutorialnya hehehe, yang pasti disini gua share tutorial ini bukan karena gua udah jago sama ginian. Tapi karena gua juga masih tahap belajar dan mau coba buat bagiin apa yang gua bisa. Jadi semoga kalian bisa paham dan ngerti ya apa yang gua jelasin nantii!

Yokk langsung sikat gan!

Sebelumnya kita install package tambahan dulu, yaitu validate.js. nahh package ini fungsinya buat validasi inputan yang di kirimkan oleh user. Salah saty contohnya misalkan user masukkin sesuatu dengan null value, maka package ini bakal ngasih tau kalau field/isian tersebut ga boleh kosong atau wajib diisi. Dan contoh lainnya ketika user masukkin email dengan format yang salah, maka package ini bakal ngasih tau kalau format emailnya ga sesuai.

Caranya dengan ketik perintah dibawah ini :

npm i validate.js

Kalau udah berhasil, ayo kita mulai ngoding bareng-bareng ^_^

Pertama, kita buat file bernama “validation.js” di dalam folder utils. Kemudian kita isi dengan code ini :

validation.js

Validation.js ini juga punya dokumentasi buat cara penggunaannya, kalian bisa pergi kesini buat liat cara penggunaannya dan macam-macam opsi validator nya.

Nahh sekarang, kita buka file bootcamp-controller.js yang ada di dalam folder controllers, lalu kita panggil fungsi validateBootcamp() yang barusan kita buat di file validation.js

const {
insertBootcamp,
getBootcamps,
updateBootcamp,
deleteBootcamp
} = require('../models/bootcamp-model');
const { validateBootcamp } = require('../utils/validation');

Selanjutnya, kita masukkan validasinya ke fungsi Create karena fungsi ini yang akan menerima data lengkap dari inputan.

Silahkan kalian pergi ke function createData(), lalu tambahkan kode yang gua cetak tebal

// create bootcamp
exports.createData = (req, res) => {
// buat variabel penampung data dan query sql
const data = { ...req.body };
const querySql = 'INSERT INTO bootcamp SET ?';
// validasi
var errors = validateBootcamp(data);
if (errors) {
return res.status(400).json({
success: false,
message: errors[0],
});
}
// masukkan ke dalam model
insertBootcamp(res, querySql, data);
};

Nanti isi file bootcamp-controller.js kalian kurang lebih kaya gini :

bootcamp-controller.js

Nahh kalau udah selesai pasang validation.js nya, silahkan kalian coba jalankan yaa dengan value null kaya gini :

Testing validate.js

Kalau udah muncul respon errornya, sekarang kita lanjut ke pembuatan middleware buat handling errornya yuk

Pertama kita buat file baru di dalam folder utils dan kasih nama “errorResponse.js”. Kemudian kita buat sebuah class yang meng-extends ke class Error, lalu buat constructornya

Lalu exports class tersebut dengan module.exports

class ErrorResponse extends Error {
constructor(message, statusCode) {
super(message);
this.statusCode = statusCode;
}
}
module.exports = ErrorResponse;

Kemudian buat folder baru yang sejajar dengan folder config, models, dll dan beri nama “middleware”. Lalu buat file baru dengan nama “error.js” di dalam folder middleware yang barusan kita buat

Kalau udah, tinggal kalian isi dengan code ini

const errorHandler = (err, req, res, next) => {
let error = { ...err };
error.message = err.message;
res.status(error.statusCode || 500).json({
success: false,
message: error.message || 'Server error',
});
};
module.exports = errorHandler;

Yak disini kita buat sebuah function dengan nama errorHandler() yang nantinya bakal kita set di konfigurasi utama di dalam file app.js untuk dijadikan middleware error handling

Nahh sekarang kalian bisa buka file app.js lalu panggil si errorHandler tadi.
kemudian kita set untuk dijadikan middleware (lihat code yang gua cetak tebal).

const express = require('express');
const bodyParser = require('body-parser');
const bootcampRouter = require('./routes/bootcamp-router');
const errorHandler = require('./middleware/error');
const app = express();
const PORT = process.env.PORT || 5000;
// set body parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// set routing
app.use('/api/bootcamp', bootcampRouter);
// set error middleware
app.use(errorHandler);
// buat server nya
app.listen(PORT, () => console.log(`Server running at port: ${PORT}`));

Nahh barusan kita udah buat ErrorResponse, errorHandler, dan juga udah kita set buat dijadiin middleware. Sekarang ngapain lagi? ngopi dulu gan biar seger hehehe

Sekarang, waktunya kita implementasiin error handling nya! tinggal kita cari aja kodingan yang ngasih error responsenya.

Yang pertama ada di bootcamp-controller.js, kita panggil dulu ErrorResponse buat nampung error message dan statusCodenya (lihat code yang di cetak tebal)

const {
insertBootcamp,
getBootcamps,
updateBootcamp,
deleteBootcamp
} = require('../models/bootcamp-model');
const { validateBootcamp } = require('../utils/validation');
const ErrorResponse = require('../utils/errorResponse');

Lalu kita ke bagian function createData(), dan kita tambahkan satu parameter di function tersebut dengan nama next.

Dan kita ganti response errornya menggunakan next untuk di passing ke middleware (lihat code yang di cetak tebal)

// create bootcamp
exports.createData = (req, res, next) => {
// buat variabel penampung data dan query sql
const data = { ...req.body };
const querySql = 'INSERT INTO bootcamp SET ?';
// validasi
var errors = validateBootcamp(data);
if (errors) {
return next(new ErrorResponse(errors[0], 400));
}
// masukkan ke dalam model
insertBootcamp(res, querySql, data);
};

Setelah ini ngapain lagi?

Sekarang kita masuk ke file bootcamp-model.js, dan lakukan hal yang sama kaya di bootcamp-controller.js tadi. Kita panggil ErrorResponse nya

const koneksi = require('../config/database');
const { responseData, responseMessage } = require('../utils/response-handler');
const ErrorResponse = require('../utils/errorResponse');

Lalu kita masuk ke function insertBootcamp(), dan kita tambahkan satu parameter di function tersebut dengan nama next.

Dan kita ganti response errornya menggunakan next untuk di passing ke middleware (lihat code yang di cetak tebal)

// insert bootcamp
exports.insertBootcamp = (response, statement, data, next) => {
// jalankan query
koneksi.query(statement, data, (err, rows, field) => {
// error handling
if (err) {
return next(new ErrorResponse(err.message, 500));
}
// jika request berhasil
responseMessage(response, 201, 'Berhasil insert data!');
});
};

Kalau udah, sekarang kita ke function createData() yang ada di dalam file bootcamp-controller.js

Lalu di function insertBootcamp(), tambahin isian parameter next nya (lihat code yang di cetak tebal)

// create bootcamp
exports.createData = (req, res, next) => {
// buat variabel penampung data dan query sql
const data = { ...req.body };
const querySql = 'INSERT INTO bootcamp SET ?';

// validasi
var errors = validateBootcamp(data);
if (errors) {
return next(new ErrorResponse(errors[0], 400));
}
// masukkan ke dalam model
insertBootcamp(res, querySql, data, next);
};

Nahh sekarang tinggal kalian lakukan hal yang sama pada function getBootcamps(), updateBootcamp(), deleteBootcamp()

Kalau udah, nanti hasil isi file bootcamp-controller.js dan bootcamp-model.js kalian kurang lebih kaya gini :

bootcamp-controller.js
bootcamp-model.js

Dahlahh segitu aja tutorialnya.. gimana pusing ga? boong banget nih kalau ga pusing hehehe. Sebenernya ada banyak cara buat handling error, ga cuman cara ini aja kok gaiss. Karena ada sebuah pepatah yang bilang gini, “banyak jalan menuju roma” jadi tetap semangat cari-cari jalan lain dan jangan gampang ngerasa hebat ya! karena hal itu bakal buat lo ngerasa puas dan males buat belajar lagi. Ingat bukan cuma kalian orang hebat yang ada di dunia ini, jadi mari kita berkembang bareng-bareng bro&sis ^_^

Sampai sini dulu yaa tutorial bikin middleware buat handle error nya. Selanjutnya ngapain lagi nih kira-kira? hmmm

Nanti di bagian selanjutnya kita bakal buat autentikasi dasar dulu nihh. tau kan autentikasi? yapss, kita bakal buat login dan register yang tentunya nnti kita bakal gunain enkripsi buat ngamanin password kita.

See u later! semoga bermanfaat dan selamat berpuasa^_^

Source code tutorial ini bisa diambil disini yaa, di branch error-handling :

--

--