Script Valley
Express.js: APIs and Middleware
Express.js FundamentalsLesson 1.5

Express Router โ€” how to split routes into separate files

express.Router, router instance, router.get router.post, app.use prefix, modular routing, require router file, route organization

Modular Routing with Express.Router

express.Router() creates a mini Express app โ€” it has the same routing methods but is scoped to a file. You mount it on a path prefix in your main app.

routes/users.js

const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
  res.json([{ id: 1, name: 'Alice' }]);
});

router.get('/:id', (req, res) => {
  res.json({ id: req.params.id });
});

router.post('/', (req, res) => {
  res.status(201).json(req.body);
});

module.exports = router;

app.js

const express = require('express');
const app = express();
const usersRouter = require('./routes/users');

app.use(express.json());
app.use('/users', usersRouter);

app.listen(3000);

When you mount usersRouter at /users, the router's / becomes /users and its /:id becomes /users/:id. The prefix is prepended automatically.

Scale this pattern: one router file per resource (users.js, products.js, orders.js). Your app.js stays clean โ€” it only mounts routers and global middleware.

Express Router โ€” how to split routes into separate files โ€” Express.js Fundamentals โ€” Express.js: APIs and Middleware โ€” Script Valley โ€” Script Valley