Skip to content

Express Router

Introduction

Like you have seen in our Restfull Example Users App it start to be a mess when you have a multiple endpoints/routes in a same JavaScript file. The express.Router() function is used to create a new router object which allows group the route handlers for a particular part of a site together and access them using a common route-prefix. In a bigger Express applications the main app file consists of several middleware calls and the rest of the app is divided into multiple files for better structuring of the application.

Modify Users App

Modify earlier created Users App to have /api/users/ routes in different JavaScript files.

Project folder will be look as below after you have done all the modifications.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
.
├── index.js
├── controllers
│   └── usersController.js
├── middleware
│   └── logger.js
├── node_modules
├── package.json
└── routes
    └── users.js

First create a routes folder to store users.js routes. Use Express Router module to configure routes to usersController.

routes/users.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
const express = require('express')
const router = express.Router()

// require controller modules
const usersController = require("../controllers/usersController");

// users routes
router.get('/', usersController.getUsers)
router.get('/:id', usersController.getUser)
router.post('/', usersController.createUser)
router.put('/:id', usersController.updateUser)
router.delete('/:id', usersController.deleteUser)

module.exports = router

Create a new controllers folder to have usersController.js JavaScript file. Move all the route logic there. We have the users data here inside the controller right now. This will be changed when we are using a real MongoDB Database.

usersController.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// use sample users data
let { users } = require('../data')

// get all users
const getUsers = (req, res) => {
  res.status(200).json({success:true,data:users})
}

// modify other routes here as a functions, like above one
...

// export all functions
module.exports = {
  getUsers,
  getUser,
  deleteUser,
  updateUser,
  createUser
}

Create a new middleware folder and move a logger inside it.

logger.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
const logger = (req, res, next) => {
  const dateNow = new Date()
  const dateString = `${dateNow.toLocaleDateString()} 
                      ${dateNow.toLocaleTimeString()}`
  console.log('Date:', dateString)
  console.log('Method:', req.method)
  console.log('Url:  ', req.url)
  next()
}

module.exports = logger

Finally require logger middleware and use users router in index.js. Look how nice and clean your main JavaScript file is right now. You can easily add different routes in your app.

index.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
require('dotenv').config()
const express = require('express') 
const app = express()
const port = process.env.PORT

// json parser middleware
// parse incoming requests with JSON, assign it to requests body
app.use(express.json())

// logger is executed every time the app receives a request
const logger = require('./middleware/logger')
app.use(logger)

// use users router
const usersRouter = require("./routes/users");
app.use("/api/users", usersRouter);

app.listen(port, () => {
  console.log(`Server listening on port ${port}...`)
})

Read more

Goals of this topic

Understand

  • How to use Express Router