Chapter 14: Production API Best Practices
Chapter 14 of 14
Chapter 14: Production API Best Practices
14.1 Production Considerations
Production APIs require monitoring, logging, and proper error handling.
// Request logging
const morgan = require('morgan');
app.use(morgan('combined'));
// Error tracking
const Sentry = require('@sentry/node');
Sentry.init({ dsn: process.env.SENTRY_DSN });
app.use(Sentry.Handlers.requestHandler());
app.use(Sentry.Handlers.errorHandler());
// Health check endpoint
app.get('/health', async (req, res) => {
const health = {
status: 'ok',
timestamp: Date.now(),
uptime: process.uptime(),
database: await checkDatabase(),
redis: await checkRedis()
};
const statusCode = health.database && health.redis ? 200 : 503;
res.status(statusCode).json(health);
});
14.2 API Monitoring
// Track API metrics
const prometheus = require('prom-client');
const httpRequestDuration = new prometheus.Histogram({
name: 'http_request_duration_seconds',
help: 'Duration of HTTP requests',
labelNames: ['method', 'route', 'status']
});
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = (Date.now() - start) / 1000;
httpRequestDuration.observe({
method: req.method,
route: req.route?.path || req.path,
status: res.statusCode
}, duration);
});
next();
});
14.3 Rate Limiting
// Per-user rate limiting
const rateLimit = require('express-rate-limit');
const RedisStore = require('rate-limit-redis');
const redis = require('redis');
const limiter = rateLimit({
store: new RedisStore({
client: redis.createClient()
}),
windowMs: 15 * 60 * 1000,
max: async (req) => {
// Different limits for different users
const user = await getUserFromToken(req);
return user?.isPremium ? 1000 : 100;
},
keyGenerator: (req) => req.user?.id || req.ip
});
14.4 API Documentation in Production
// Keep documentation updated
// Use automated tools to generate docs from code
// Include examples and error responses
// Version your documentation with your API
Conclusion
Master API development to create robust, secure, and scalable APIs.