Express.js REST API
Express REST API cheat sheet covering routing, middleware, database integration, authentication, error handling, and testing patterns.
Other Node.js Sheets
Sign in to mark items as known and track your progress.
Sign inExpress.js Basic Setup
Initialize Express server and configure essential middleware
Express Server Setup
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');
});Middleware Functions
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
CRUD Operations
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);
});Router Organization
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
MongoDB with Mongoose
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);SQL Database Integration
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
Error Handling Best Practices
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 })
}
});
});Testing Express APIs
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);
});
});