Tips to write cleaner and faster Express code like a seasoned pro!
š¤ Think Express.js is Simple? Think Again.
Express is simpleābut mastering it means knowing those clever little tricks that make your code ⨠clean, fast, and beautiful. This post isnāt about building routes⦠itās about writing smarter Express apps.
š The Trick: Use express.Router()
for Clean, Modular Routing
Instead of dumping all routes in index.js
like this:
// index.js
app.get('/users', getUsers);
app.post('/users', createUser);
app.put('/users/:id', updateUser);
Split your code like a pro:
ā Create a router module
routes/userRoutes.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => res.send('Get users'));
router.post('/', (req, res) => res.send('Create user'));
router.put('/:id', (req, res) => res.send('Update user'));
module.exports = router;
ā Use it in your main app
index.js
const express = require('express');
const app = express();
const userRoutes = require('./routes/userRoutes');
app.use('/api/users', userRoutes);
Boom! Cleaner, reusable, and maintainable.
š Bonus Tip 1: Use asyncHandler
to Catch Errors Automatically
Avoid writing try/catch
in every route.
š§ Problem:
router.get('/', async (req, res) => {
try {
const users = await getUsers();
res.json(users);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
š Solution: Use a wrapper!
npm install express-async-handler
const asyncHandler = require('express-async-handler');
router.get('/', asyncHandler(async (req, res) => {
const users = await getUsers();
res.json(users);
}));
No try/catch
, no clutter. š„
š§¼ Bonus Tip 2: Use Middleware Like a Pro
Instead of writing auth logic in every routeā¦
ā Donāt do this:
router.get('/dashboard', (req, res) => {
if (!req.user) return res.status(401).send('Unauthorized');
res.send('Welcome!');
});
ā Do this:
middleware/auth.js
module.exports = (req, res, next) => {
if (!req.headers.authorization) return res.status(401).send('Unauthorized');
// Add your token logic here
next();
};
Apply it globally or per-route
const auth = require('./middleware/auth');
app.use('/api/secure', auth, secureRoutes);
āļø Bonus Tip 3: Use res.locals
for Shared Data
Need to pass user info across middleware and routes?
app.use((req, res, next) => {
res.locals.user = { id: 1, name: 'Devesh' };
next();
});
app.get('/dashboard', (req, res) => {
res.send(`Welcome, ${res.locals.user.name}`);
});
Great for templating and context sharing.
šÆ TL;DR
Trick | Why it rocks |
---|---|
express.Router() | Cleaner file structure |
express-async-handler | Avoids messy try/catch |
Middleware | DRY and secure code |
res.locals | Share data without global vars |