ExpressJS Autentikasi #8 | Error Handling Middleware

Ahmad Nurul Laiq
3 min readApr 22, 2024

Pengantar

Dalam pengembangan aplikasi web dengan ExpressJS, error handling merupakan bagian penting untuk menangani kondisi-kondisi yang tidak diinginkan. Pada panduan ini, kita akan melihat bagaimana cara mengimplementasikan Error Handling Middleware di ExpressJS.

Buat File Middleware asyncHandle.js

Buat file asyncHandle.js di dalam folder middleware dengan kode berikut:

const asyncHandle = (fn) => (req, res, next) => {
Promise.resolve(fn(req, res, next)).catch(next);
};

module.exports = asyncHandle;
  • Middleware ini akan meng-handle fungsi async dan menangani error jika terjadi.

Buat File Middleware errorMiddleware.js

Buat file errorMiddleware.js di dalam folder middleware dengan kode berikut:

  • Middleware notFound akan menangani route yang tidak ditemukan (404).
  • Middleware errorHandler akan menangani error dari seluruh aplikasi dan mengembalikan respons JSON yang sesuai dengan jenis error.

Update File app.js

Perbarui file app.js dengan kode berikut:

const express = require('express');
const app = express();
const dotenv = require('dotenv');
const cors = require('cors');
const CategoriesRouter = require('./routes/categories');
const AuthRouter = require('./routes/auth');
const morgan = require('morgan');
const { errorHandler, notFound } = require('./middleware/errorMiddleware');

dotenv.config();
// Middleware
app.use(express.json()); // Parse JSON bodies
app.use(morgan('dev')); // Logging middleware
app.use(cors()); // Enable CORS
// Routing
app.use('/api/v1/categories', CategoriesRouter);
app.use('/api/v1/auth', AuthRouter);
// Error handling
app.use(notFound);
app.use(errorHandler);
// Server
const port = process.env.PORT || 3000; // Use port from environment variable or default to 3000
app.listen(port, () => {
console.log(`Server berjalan di port ${port}`);
});
  • Di sini kita menggunakan middleware notFound untuk menangani route yang tidak ditemukan.
  • Middleware errorHandler digunakan untuk menangani kesalahan dari seluruh aplikasi.

Update File categoryController

Perbarui file categoryController.js dengan menggunakan asyncHandle untuk meng-handle fungsi async:

const { Category } = require('../models');
const asyncHandle = require('../middleware/asyncHandle');

exports.getAllCategories = async (req, res) => {
try {
const categories = await Category.findAll();
res.status(200).json({
status: "Success",
data: categories
});
} catch (error) {
res.status(500).json({
status: 'Fail',
error: 'Server Down'
});
}
};
exports.getCategoryByID = asyncHandle(async (req, res) => {
try {
const { id } = req.params;
const category = await Category.findByPk(id);
if (!category) {
return res.status(404).json({
status: "fail",
message: "Category not found"
});
}
res.status(200).json({
status: "success",
data: category
});
} catch (error) {
res.status(500).json({
status: "fail",
error: error.message
});
}
});
exports.storeCategory = async (req, res) => {
try {
const { name, description } = req.body;
const category = await Category.create({
name,
description
});
res.status(201).json({
status: "success",
data: category
});
} catch (error) {
res.status(500).json({
status: "fail",
error: error.message
});
}
};
exports.updateCategory = async (req, res) => {
try {
const { id } = req.params;
const { name, description } = req.body;
const category = await Category.findByPk(id);
if (!category) {
return res.status(404).json({
status: "fail",
message: "Category not found"
});
}
category.name = name;
category.description = description;
await category.save();
res.status(200).json({
status: "success",
data: category
});
} catch (error) {
res.status(500).json({
status: "fail",
error: error.message
});
}
};
exports.deleteCategory = async (req, res) => {
try {
const { id } = req.params;
const category = await Category.findByPk(id);
if (!category) {
return res.status(404).json({
status: "fail",
message: "Category not found"
});
}
await category.destroy();
res.status(200).json({
status: "success",
message: "Category " + id + " deleted"
});
} catch (error) {
res.status(500).json({
status: "fail",
error: error.message
});
}
};
  • Kita menggunakan asyncHandle untuk meng-handle fungsi async di getCategoryByID.

Kesimpulan

Dengan mengimplementasikan Error Handling Middleware, kita dapat dengan lebih baik menangani kesalahan yang terjadi dalam aplikasi ExpressJS. Middleware ini membantu memastikan bahwa respons yang dihasilkan sesuai dengan jenis kesalahan yang terjadi.

Jika Anda ingin melihat contoh kode yang lengkap, Anda dapat mengunjungi repositori GitHub saya di sini.

Referensi:

--

--

Ahmad Nurul Laiq

full stack developer an have experience for 2+ years. I am always eager to learn and stay abreast of the latest technology in the world of software development.