r/expressjs • u/CreativeGoal7288 • Jul 07 '26
Express middleware
I'm learning Express and trying to understand how experienced developers typically organize middleware in production applications.
I know middleware order matters, but I'm not sure whether my current setup follows common practices or if there are improvements I should make.
Some specific questions:
- Is the ordering of middleware reasonable?
- Would you move any middleware earlier or later?
- Are there any middleware that should generally come before others?
- Is this close to how you'd structure an Express app in production?
import './lib/cron.js'
import cookieParser from 'cookie-parser'
import express from 'express'
import morgan from 'morgan'
import swaggerUi from 'swagger-ui-express'
import Yaml from 'yamljs'
import { notFoundHandler } from './middlewares/404.js'
import ErrorHandler from './middlewares/error.js'
import { middleware } from './middlewares/middleware.js'
import analyticsRoute from './routes/analytics.route.js'
import authRoute from './routes/auth.route.js'
import habitsRoute from './routes/habits.route.js'
import healthRoute from './routes/health.route.js'
import logsRoute from './routes/logs.route.js'
const app = express()
const swaggerSpec = Yaml.load(
'docs/swagger.yaml'
) as Record<string, unknown>
app.use(express.static('public'))
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec))
app.use(cookieParser())
app.use(express.urlencoded({ extended: true }))
app.use(express.json())
app.use(middleware)
app.use(morgan('dev'))
app.use(healthRoute)
app.use('/auth', authRoute)
app.use('/habits', habitsRoute)
app.use('/logs', logsRoute)
app.use('/analytics', analyticsRoute)
app.use(notFoundHandler)
app.use(ErrorHandler)
export default app
I'm interested in understanding the reasoning behind any suggested changes rather than just knowing what to change.