- Published on
Express.js Middleware Patterns
746 words4 min read
Authentication Middleware
const jwt = require('jsonwebtoken')
const authenticateToken = (req, res, next) => {
const authHeader = req.headers['authorization']
const token = authHeader && authHeader.split(' ')[1]
if (!token) {
return res.status(401).json({ error: 'Access token required' })
}
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if (err) {
return res.status(403).json({ error: 'Invalid or expired token' })
}
req.user = user
next()
})
}
module.exports = { authenticateToken }
Error Handling Middleware
const errorHandler = (err, req, res, next) => {
const statusCode = err.statusCode || 500
const message = err.message || 'Internal Server Error'
res.status(statusCode).json({
success: false,
error: message,
...(process.env.NODE_ENV === 'development' && { stack: err.stack }),
})
}
module.exports = errorHandler
Async Error Wrapper
const asyncHandler = (fn) => (req, res, next) => {
Promise.resolve(fn(req, res, next)).catch(next)
}
// Usage
const getUsers = asyncHandler(async (req, res) => {
const users = await User.find()
res.json(users)
})
Request Validation Middleware
const validateRequest = (schema) => {
return (req, res, next) => {
const { error } = schema.validate(req.body)
if (error) {
return res.status(400).json({
error: error.details[0].message,
})
}
next()
}
}
// Usage with Joi
const userSchema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string().min(6).required(),
})
router.post('/register', validateRequest(userSchema), registerUser)