Table Of Contents
Quick Fix: UUID Request ID Middleware
const express = require('express');
const { v4: uuidv4 } = require('uuid');
// Create request ID middleware
const requestIdMiddleware = (req, res, next) => {
// Check if client sent X-Request-Id header
req.id = req.headers['x-request-id'] || uuidv4();
// Add to response headers for client correlation
res.setHeader('X-Request-Id', req.id);
next();
};
const app = express();
app.use(requestIdMiddleware);
// Access request ID in any route
app.get('/api/users', (req, res) => {
console.log(`[${req.id}] Processing user request`);
res.json({ requestId: req.id, users: [] });
});
Express Built-in Solution: Using express-request-id
const express = require('express');
const requestId = require('express-request-id');
const app = express();
// Auto-generate request IDs
app.use(requestId({
generator: () => require('crypto').randomUUID(),
headerName: 'X-Request-Id'
}));
// Integrate with logging (Winston example)
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.printf(({ level, message, ...meta }) => {
const requestId = meta.requestId || 'no-request-id';
return `[${requestId}] ${level}: ${message}`;
})
),
transports: [new winston.transports.Console()]
});
// Log with request ID
app.use((req, res, next) => {
req.log = (message) => logger.info(message, { requestId: req.id });
next();
});
app.get('/api/data', (req, res) => {
req.log('Fetching data'); // Logs: [uuid-here] info: Fetching data
res.json({ id: req.id });
});
Request IDs solve "correlating logs across microservices" issues and help debug "which request caused this error" problems. Express v4+ compatible, works with PM2 cluster mode. Alternative packages: cls-hooked for async context propagation, pino-http includes request IDs automatically.
How to Handle Async Errors in Express Routes How to Add Custom Headers to All Express Responses with Middleware How to Implement Basic Authentication Middleware
Share this article
Add Comment
No comments yet. Be the first to comment!