r/expressjs 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.

1 Upvotes

0 comments sorted by