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 modular structure

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.