Menggunakan Param Middleware

Param middleware adalah middleware yang akan dieksekusi berdasarkan parameter tertentu yang dipasing dari URL. Contoh dari project ini adalah parameter id yang digunakan untuk routing ‘/api/v1/tours/:id’

Pada modul sebelumnya, validasi dilakukan pada masing-masing fungsi. Kita dapat menggunakan param middleware untuk mengakses fungsi validasi ketika routing mengandung parameter id.

Dengan menggunakan param middleware code akan lebih clean karena fungsi validasi berdiri sendiri dan hanya dijalankan bila URL memiliki parameter yang dimaksud.

Tambahkan code berikut di tourRoutes.js

router.param('id', tourCtrl.chekId);

Hasil akhir file tourRoute.js adalah seperti dibawah

const express = require('express');
const tourCtrl = require('../controllers/tourController');

const router = express.Router();

router.param('id', tourCtrl.chekId);

router.route('/').get(tourCtrl.getAllTours).post(tourCtrl.createTour);
router.route('/:id').get(tourCtrl.getTours).patch(tourCtrl.updateTour).delete(tourCtrl.deleteTour);

module.exports = router;

Tambahkan code dibawah di tourController.js

exports.chekId = (req, res, next, val) => {
    if(req.params.id * 1 > tours.length){
        return res.status(404).json({
            status: 'fail',
            message: 'Invalid ID'
        });
    }
    next();
}

Hasil akhir dari file tourController.js

const fs = require('fs');

const tours = JSON.parse(fs.readFileSync(`${__dirname}/../devdata/tours-simple.json`));

exports.chekId = (req, res, next, val) => {
    if(req.params.id * 1 > tours.length){
        return res.status(404).json({
            status: 'fail',
            message: 'Invalid ID'
        });
    }
    next();
}

exports.getAllTours = (req, res) => {
    res.status(200).json({
        status: 'success',
        results: tours.length ,
        data: {
            tours: tours
        }
    });
}

exports.getTours = (req, res) => {
    const id = req.params.id * 1;
    const tour = tours.find(el => el.id === id);

    res.status(200).json({
        status: 'success',
        data: {
            tour: tour
        }
    });
}

exports.createTour = (req, res) => {
    const newId = tours[tours.length-1].id + 1;
    const newTour = Object.assign({id: newId}, req.body);

    tours.push(newTour);
    fs.writeFile(`${__dirname}/../devdata/tours-simple.json`, JSON.stringify(tours), err=>{
        res.status(201).json({
            status: 'success',
            data: {
                tour: newTour
            }
        });
    });
}

exports.updateTour = (req, res)=> {
    res.status(201).json({
        status: 'success',
        data: {
            tour: 'data updated'
        }
    });
}

exports.deleteTour = (req, res)=> {
    res.status(204).json({
        status: 'success',
        data: null
    });
}

Mungkin Ada pemikiran, tidak perlu dibuat middleware, namun dibuat fungsi tersendiri yang melakukan validasi, dan memanggil fungsi validasi tersebut dari masing-masing fungsi yang membutuhkan validasi id.

Namun pendekatan ini tidak sesuai dengan filosofi dari express, yaitu sebisa mungkin menggunakan middleware.

Selain itu, dapat dilihat dari code diatas, fungsi yang memerlukan validasi id, seperti deleteTour, updateTour dan getTours tidak perlu melakukan proses validasi sendiri-sendiri.

Masing-masing sesuai dengan spesifikasi fungsinya, karena proses validasi dipisahkan menjadi fungsi sendiri dan menghindari repetisi code.

Sharing is caring:

Leave a Comment