SyntaxStudy
Sign Up
Express.js Writing and Registering Middleware
Express.js Beginner 1 min read

Writing and Registering Middleware

Middleware in Express is any function with the signature `(req, res, next)`. Application-level middleware registered with `app.use()` runs for every request that reaches it; route-level middleware is passed directly to a route method and runs only for that route. The order of `app.use()` calls determines execution order. Middleware placed before route definitions can modify `req`, set headers, or short-circuit the request. Middleware placed after all routes serves as a catch-all for 404 responses. Error-handling middleware uses a four-argument signature `(err, req, res, next)` and must be registered last. Third-party middleware packages follow the same pattern. `morgan` for HTTP logging, `helmet` for security headers, `compression` for gzip — all are simply functions you pass to `app.use()`. Writing your own middleware works exactly the same way, making the API highly composable.
Example
const express     = require('express');
const morgan      = require('morgan');
const compression = require('compression');
const app         = express();

// ── Third-party middleware ────────────────────────────────────
app.use(morgan('dev'));          // HTTP request logger
app.use(compression());         // gzip responses
app.use(express.json());

// ── Custom app-level middleware ───────────────────────────────
app.use((req, res, next) => {
    req.requestId = crypto.randomUUID();
    res.setHeader('X-Request-Id', req.requestId);
    next();
});

// ── Route-level middleware ────────────────────────────────────
function requireAdmin(req, res, next) {
    if (req.headers['x-admin-key'] !== process.env.ADMIN_KEY) {
        return res.status(403).json({ error: 'Forbidden' });
    }
    next();
}

app.delete('/admin/cache', requireAdmin, (req, res) => {
    res.json({ cleared: true });
});

// ── 404 fallback ──────────────────────────────────────────────
app.use((req, res) => {
    res.status(404).json({ error: `${req.method} ${req.path} not found` });
});

app.listen(3000);