Express.js REST API
Express REST API cheat sheet covering routing, middleware, database integration, authentication, error handling, and testing patterns.
Other Node.js Sheets
Express.js Basic Setup
Initialize Express server and configure essential middleware
Create and configure a basic Express server with essential middleware
const express = require('express');
const app = express();
// Middleware
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Basic route
app.get('/', (req, res) => {
res.json({ message: 'Hello World!' });
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});Create custom middleware for authentication, logging, and request processing
// Custom middleware
const auth = (req, res, next) => {
const token = req.header('Authorization');
if (!token) {
return res.status(401).json({ error: 'Access denied' });
}
next();
};
// Apply middleware
app.use(auth);
app.get('/protected', auth, (req, res) => {
res.json({ message: 'Protected route' });
});Routing & REST APIs
Define routes and implement RESTful API endpoints
Implement Create, Read, Update, Delete operations following REST conventions
// Basic CRUD routes
app.get('/api/users', (req, res) => {
res.json(users);
});
app.get('/api/users/:id', (req, res) => {
const user = users.find(u => u.id === req.params.id);
if (!user) return res.status(404).json({ error: 'User not found' });
res.json(user);
});
app.post('/api/users', (req, res) => {
const user = { id: Date.now(), ...req.body };
users.push(user);
res.status(201).json(user);
});Organize routes into modular routers for scalable API structure
// routes/users.js
const express = require('express');
const router = express.Router();
router.get('/', getAllUsers);
router.get('/:id', getUserById);
router.post('/', createUser);
router.put('/:id', updateUser);
router.delete('/:id', deleteUser);
module.exports = router;
// app.js
app.use('/api/users', require('./routes/users'));
app.use('/api/products', require('./routes/products'));Database Integration
Connect and interact with databases in Express
Connect Express to MongoDB using Mongoose ODM for data modeling
const mongoose = require('mongoose');
// Connect to MongoDB
mongoose.connect('mongodb://localhost:27017/mydb', {
useNewUrlParser: true,
useUnifiedTopology: true
});
// Define schema
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
age: Number,
createdAt: { type: Date, default: Date.now }
});
const User = mongoose.model('User', userSchema);Connect Express to PostgreSQL/MySQL using query builders or ORMs
const mysql = require('mysql2/promise');
// Database connection
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'mydb',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
// Query examples
const getUsers = async () => {
const [rows] = await pool.execute('SELECT * FROM users WHERE active = ?', [1]);
return rows;
};Error Handling & Testing
Handle errors gracefully and test your API endpoints
Implement centralized error handling and custom error responses
// Custom error classes
class AppError extends Error {
constructor(message, statusCode) {
super(message);
this.statusCode = statusCode;
this.isOperational = true;
Error.captureStackTrace(this, this.constructor);
}
}
// Global error handler
app.use((err, req, res, next) => {
const { statusCode = 500, message } = err;
res.status(statusCode).json({
error: {
message,
...(process.env.NODE_ENV === 'development' && { stack: err.stack })
}
});
});Write unit and integration tests for API endpoints
// Jest test example
const request = require('supertest');
const app = require('../app');
describe('User API', () => {
test('GET /api/users should return users', async () => {
const response = await request(app)
.get('/api/users')
.expect(200);
expect(response.body).toHaveProperty('users');
expect(Array.isArray(response.body.users)).toBe(true);
});
test('POST /api/users should create user', async () => {
const userData = {
name: 'John Doe',
email: 'john@example.com',
password: 'password123'
};
const response = await request(app)
.post('/api/users')
.send(userData)
.expect(201);
expect(response.body.user.name).toBe(userData.name);
});
});