Seperti sudah dibahas sebelumnya, express is about middleware. disini akan kita bahas express.Router, yaitu middleware untuk membuat modular, mountable route handlers.
Berikut contoh dari app.js, kita convert routing menggunakan express.Router
//sebelum diconvert
app.route('/api/v1/tours').get(getAllTours).post(createTour);
app.route('/api/v1/tours/:id').get(getTours).patch(updateTour).delete(deleteTour);
//setelah diconvert menjadi express.router
const router = express.Router();
router.route('/').get(getAllTours).post(createTour);
router.route('/:id').get(getTours).patch(updateTour).delete(deleteTour);
app.use('/api/v1/tours', router);
Dengan mengubah menjadi middleware, aplikasi dapat lebih modular. Kita bisa mengembangkan banyak routing dan hanya perlu di mount dengan menggunakan app.use(). Proses ini sering disebut dengar route mounting.
Restrukturisasi Code
Berikutnya mari restrukturisasi code dengan memindahkan routing dan routing handler ke file terpisah.
Buat direktori baru yaitu routes yang akan diisi file routing. Buat file baru tourRoutes.js, lalu pindahkan code routing. (nama folder dan file bebas, sesuaikan dengan kebutuhan Anda).
//tourRoutes.js const express = require('express'); const tourCtrl = require('../controllers/tourController'); const router = express.Router(); router.route('/').get(tourCtrl.getAllTours).post(tourCtrl.createTour); router.route('/:id').get(tourCtrl.getTours).patch(tourCtrl.updateTour).delete(tourCtrl.deleteTour); module.exports = router;
Buat direktori baru controllers, lalu buat file tourController.js. Pindahkan fungsi yang menangani routing.
const fs = require('fs'); const tours = JSON.parse(fs.readFileSync(`${__dirname}/../devdata/tours-simple.json`)); 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); if(id > tours.length){ return res.status(404).json({ status: 'fail', message: 'invalid 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 }); }
Buat file server.js di root directory dari project. Pindahkan code yang tidak berhubungan dengan express, berikut isi server.js
//server.js const app = require('./app'); const port = 3000; app.listen(port, ()=>{ console.log(`Listening on port ${port}...`); });
Setelah memindahkan semua code dari file app.js, maka hasil akhir file app.js akan seperti dibawah,
//app.js const express = require('express'); const morgan = require('morgan'); const tourRouter = require('./routes/tourRoutes'); const app = express(); app.use(express.json()); app.use(morgan('dev')); app.use((req, res, next) =>{ console.log('Ini berasal dari middleware'); next(); }); app.use('/api/v1/tours', tourRouter); module.exports = app;
Dengan restrukturisasi yang telah dilakukan, akan mempermudah kita dalam maintenance dan membaca code.
Maksud restukturisasi diatas akan menjadi lebih masuk akal, jika kita mulai memiliki banyak routing yang harus ditangani.
Misalnya kita akan menghandle data user, maka yang perlu dilakukan adalah
- Membuat userRouter.js di folder routers
- Membuat router handler userController.js di folder controllers
- Menambahkannya sebagai middleware pada app.js