Skip to main content
current (v2.x.x)

Middleware

Express middleware collection for handling common web server requirements including request identification, timing, error handling, timeouts, and request context management.

API​

Interfaces and Types​

export type Middleware = (req: Request, res: Response, next: NextFunction) => void | Promise<void>;

export interface ErrorHandlerOptions {
/** Whether to log errors (default: true) */
logErrors?: boolean;
/** Whether to include error details in non-production (default: false) */
includeDetails?: boolean;
}

Example Usage​

import { requestId, responseTime, errorHandler } from '@catbee/utils/middleware';

app.use(requestId({ headerName: 'X-Request-ID' })); // Sets X-Request-ID header and attaches req.id
app.use(setupRequestContext({ autoLog: true, headerName: 'X-Request-ID' })); // Initializes request context with req.id and sets up logging
app.use(responseTime({ addHeader: true, logOnComplete: true })); // Adds X-Response-Time header
app.use(timeout(10_000)); // Aborts requests taking longer than 10 seconds
// ... your route handlers here ...
app.use(errorHandler({ logErrors: true, includeDetails: false })); // Last middleware

Function Documentation & Usage Examples​

requestId()​

Attaches a unique request ID to each request for tracing and correlation between logs.

Method Signature:

function requestId(options?: {
headerName?: string; // default: 'X-Request-ID'
exposeHeader?: boolean; // default: true
generator?: () => string; // default: uuid
}): Middleware;

Parameters:

  • options?: object - Configuration options
    • headerName?: string - Header name for request ID (default: 'X-Request-ID')
    • exposeHeader?: boolean - Whether to expose the header in response (default: true)
    • generator?: () => string - Custom ID generator function (default: uuid)

Returns:

  • Middleware - Express middleware function

Example:

import express from 'express';
import { requestId } from '@catbee/utils/middleware';
const app = express();

// Basic usage with defaults
app.use(requestId());

// Custom configuration
app.use(
requestId({
headerName: 'Correlation-ID',
exposeHeader: true,
generator: () => `req-${Date.now()}`
})
);

responseTime()​

Measures request processing time and adds it to response headers or logs.

Method Signature:

function responseTime(options?: {
addHeader?: boolean; // default: true
logOnComplete?: boolean; // default: false
}): Middleware;

Parameters:

  • options?: object - Configuration options
    • addHeader?: boolean - Whether to add X-Response-Time header (default: true)
    • logOnComplete?: boolean - Whether to log timing info (default: false)

Returns:

  • Middleware - Express middleware function

Example:

import express from 'express';
import { responseTime } from '@catbee/utils/middleware';
const app = express();

// Basic usage
app.use(responseTime());

// With logging enabled
app.use(
responseTime({
addHeader: true,
logOnComplete: true
})
);

timeout()​

Aborts requests that take too long to process.

Method Signature:

function timeout(timeoutMs = 30000): Middleware;

Parameters:

  • timeoutMs?: number - Timeout in milliseconds (default: 30000)

Returns:

  • Middleware - Express middleware function

Example:

import express from 'express';
import { timeout } from '@catbee/utils/middleware';
const app = express();

// Default 30-second timeout
app.use(timeout());

// Custom 5-second timeout
app.use(timeout(5000));

setupRequestContext()​

Creates an Express middleware that initializes a per-request context.

Method Signature:

function setupRequestContext(options?: {
headerName?: string; // default: 'x-request-id'
autoLog?: boolean; // default: true
}): Middleware;

Parameters:

  • options?: object - Optional configuration
    • headerName?: string - Header to look for request ID (default: 'x-request-id')
    • autoLog?: boolean - Whether to log automatically when context is initialized (default: true)

Returns:

  • Middleware - Express middleware function

Example:

import express from 'express';
import { setupRequestContext } from '@catbee/utils/middleware';
const app = express();

// Basic usage with defaults
app.use(setupRequestContext());

// Custom configuration
app.use(
setupRequestContext({
headerName: 'correlation-id',
autoLog: false
})
);

errorHandler()​

Global error handling middleware with enhanced features.

Method Signature:

function errorHandler(options?: ErrorHandlerOptions): Middleware;

interface ErrorHandlerOptions {
logErrors?: boolean; // default: true
includeDetails?: boolean; // default: false
}

Parameters:

  • options?: ErrorHandlerOptions - Error handler options
    • logErrors?: boolean - Whether to log errors (default: true)
    • includeDetails?: boolean - Whether to include error details in non-production (default: false)

Returns:

  • Middleware - Express error-handling middleware function

Example:

import express from 'express';
import { errorHandler } from '@catbee/utils/middleware';
const app = express();

// Basic error handler
app.use(errorHandler());

// Custom error handler with stack traces in development
app.use(
errorHandler({
logErrors: true,
includeDetails: process.env.NODE_ENV !== 'production'
})
);

healthCheck()​

Health check middleware for service status and custom checks.

Method Signature:

function healthCheck(options?: {
path?: string; // default: '/healthz'
checks?: Array<{ name: string; check: () => Promise<boolean> | boolean }>;
detailed?: boolean; // default: true
}): Middleware;

Parameters:

  • options?: object - Health check options
    • path?: string - Health check endpoint path (default: '/healthz')
    • checks?: Array<{name: string; check: () => Promise<boolean> | boolean}> - Custom health checks to run
    • detailed?: boolean - Show detailed check results (default: true)

Returns:

  • Middleware - Express middleware function

Example:

import express from 'express';
import { healthCheck } from '@catbee/utils/middleware';
const app = express();

// Basic health check
app.use(healthCheck());

// Health check with custom checks
app.use(
healthCheck({
path: '/health',
detailed: true,
checks: [
{
name: 'database',
check: async () => {
// Check database connection
return db.isConnected();
}
},
{
name: 'redis',
check: async () => {
// Check Redis connection
return redis.ping();
}
}
]
})
);