API Response Optimization
Reduce payload sizes, implement caching, and enable compression for faster APIs.
Sparse Fieldsets
// Allow clients to select fields: GET /users?fields=id,name,email app.get('/users', async (req, res) => { const fields = req.query.fields?.split(',') || null; const users = await User.find({}, fields?.join(' ')); res.json(users); });
HTTP Caching Headers
app.get('/products/:id', async (req, res) => { const product = await Product.findById(req.params.id); const etag = crypto.createHash('md5').update(JSON.stringify(product)).digest('hex');
if (req.headers['if-none-match'] === etag) { return res.status(304).end(); }
res.set({ 'Cache-Control': 'public, max-age=3600', 'ETag': etag }); res.json(product); });
Response Compression
const compression = require('compression');
app.use(compression({ filter: (req, res) => { if (req.headers['x-no-compression']) return false; return compression.filter(req, res); }, level: 6 // Balance between speed and compression }));
Performance Targets
Metric Target
Response time <100ms (from 500ms)
Payload size <50KB (from 500KB)
Server CPU <30% (from 80%)
Optimization Checklist
-
Remove sensitive/unnecessary fields from responses
-
Implement sparse fieldsets
-
Add ETag/Last-Modified headers
-
Enable gzip/brotli compression
-
Use pagination for collections
-
Eager load to prevent N+1 queries
-
Monitor with APM tools
Best Practices
-
Cache immutable resources aggressively
-
Use short TTL for frequently changing data
-
Invalidate cache on writes
-
Compress responses >1KB
-
Profile before optimizing