Chaining Middleware

Chaining middleware dapat digunakan untuk menambahkan urutan middleware pada routing tertentu.

Contoh kasus, tambahkan middleware untuk melakukan check apakah request.body memiliki data name dan price. Checking ini tentu akan tepat jika dilakukan sebelum melakukan posting data tour.

Pendekatan yang dilakukan adalah menambahkan fungsi checkBody pada tourController.js

exports.checkBody = (req, res, next) => {
    if(!req.body.name || !req.body.price){
        return res.status(404).json({
            status: 'fail',
            message: 'Invalid Data'
        });
    }
    next();
}

kemudian fungsi ini dipanggil di tourRouters.js pada routing post.

router
    .route('/')
    .get(tourCtrl.getAllTours)
    .post(tourCtrl.checkBody, tourCtrl.createTour);

Berikut file tourRouters.js dan tourController.js setelah diubah

//tourRoutes.js

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.checkBody, tourCtrl.createTour);
router.route('/:id').get(tourCtrl.getTours).patch(tourCtrl.updateTour).delete(tourCtrl.deleteTour);

module.exports = router;
//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.checkBody = (req, res, next) => {
    if(!req.body.name || !req.body.price){
        return res.status(404).json({
            status: 'fail',
            message: 'Invalid Data'
        });
    }
    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
    });
}
Sharing is caring:

Leave a Comment