Skip to content
All essays
ArchitectureJanuary 16, 202515 min

Express.js Complete Guide: Building Scalable Web Applications

Comprehensive guide to Express.js. Learn routing, middleware, error handling, and best practices for production-ready applications.

Ü
Ümit Uz
Mobile & Full Stack Developer

Getting Started

Express.js is a minimal and flexible Node.js web application framework that provides robust features for web and mobile applications.

Basic Setup

javascript
import express from 'express'; const app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.get('/', (req, res) => { res.json({ message: 'Hello World' }); }); app.listen(3000);

Routing

Express provides a powerful routing system.

RESTful Routes

javascript
// GET all users app.get('/api/users', async (req, res) => { const users = await User.find(); res.json(users); }); // GET single user app.get('/api/users/:id', async (req, res) => { const user = await User.findById(req.params.id); if (!user) return res.status(404).json({ error: 'User not found' }); res.json(user); }); // POST new user app.post('/api/users', async (req, res) => { const user = await User.create(req.body); res.status(201).json(user); }); // PUT update user app.put('/api/users/:id', async (req, res) => { const user = await User.findByIdAndUpdate( req.params.id, req.body, { new: true } ); res.json(user); }); // DELETE user app.delete('/api/users/:id', async (req, res) => { await User.findByIdAndDelete(req.params.id); res.status(204).send(); });

Middleware

Middleware functions have access to req, res, and next.

Application-Level Middleware

javascript
// Logger middleware app.use((req, res, next) => { console.log(`${req.method} ${req.url}`); next(); }); // Authentication middleware app.use('/api/protected', (req, res, next) => { if (req.headers.authorization) { next(); } else { res.status(401).json({ error: 'Unauthorized' }); } });

Error Handling Middleware

javascript
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).json({ error: 'Something went wrong!', message: process.env.NODE_ENV === 'development' ? err.message : undefined }); });

Best Practices

  1. 1Use router modules: Organize routes by feature
  2. 2Validate input: Use validation middleware
  3. 3Secure your app: Helmet, CORS, rate limiting
  4. 4Handle errors: Never let errors crash your app
  5. 5Use async/await: Modern async patterns

Project Structure

src/
├── routes/
│   ├── auth.js
│   ├── users.js
│   └── posts.js
├── middleware/
│   ├── auth.js
│   ├── validation.js
│   └── errorHandler.js
├── controllers/
├── models/
└── app.js

Conclusion

Express.js provides a solid foundation for building web applications. Follow these patterns to build maintainable, scalable applications.

Next essay
Node.js Event Loop: Deep Dive into Asynchronous Programming