Overview

Generate unique request IDs for distributed tracing and logging correlation.

Features

  • UUID generation
  • Correlation ID support
  • Response headers
  • AWS ALB support

Installation

npx hanma add request-id-middleware --framework nest

Dependencies

uuid

Code

import { Injectable, NestMiddleware } from "@nestjs/common";
import { Request, Response, NextFunction } from "express";
import { v4 as uuidv4 } from "uuid";

declare global {
  namespace Express {
    interface Request {
      id: string;
      correlationId?: string;
      startTime: number;
    }
  }
}

@Injectable()
export class RequestIdMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    // Use existing request ID or generate new one
    const requestId =
      (req.headers["x-request-id"] as string) ||
      (req.headers["x-amzn-trace-id"] as string) || // AWS ALB
      uuidv4();

    // Correlation ID for tracing across services
    const correlationId =
      (req.headers["x-correlation-id"] as string) ||
      requestId;

    // Attach to request object
    req.id = requestId;
    req.correlationId = correlationId;
    req.startTime = Date.now();

    // Set response headers
    res.setHeader("X-Request-Id", requestId);
    res.setHeader("X-Correlation-Id", correlationId);

    next();
  }
}

// Functional middleware for simpler use
export function requestIdMiddleware(
  req: Request,
  res: Response,
  next: NextFunction
) {
  const requestId =
    (req.headers["x-request-id"] as string) ||
    uuidv4();

  const correlationId =
    (req.headers["x-correlation-id"] as string) ||
    requestId;

  req.id = requestId;
  req.correlationId = correlationId;
  req.startTime = Date.now();

  res.setHeader("X-Request-Id", requestId);
  res.setHeader("X-Correlation-Id", correlationId);

  next();
}

// Usage in AppModule:
/*
import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common";
import { RequestIdMiddleware } from "./middleware/request-id.middleware";

@Module({})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(RequestIdMiddleware).forRoutes("*");
  }
}
*/

Usage

// In AppModule
configure(consumer: MiddlewareConsumer) {
  consumer.apply(RequestIdMiddleware).forRoutes('*');
}

Dependencies

Frequently Asked Questions

How do I install Request ID Middleware?
Run the following command: npx hanma add request-id-middleware --framework nest
What dependencies are required?
This snippet requires: uuid. Make sure to install them before using the snippet.
How do I use this snippet?
Copy the code and paste it into your project. The snippet will be saved to src/middleware/request-id.middleware.ts.
Can I customize this snippet?
Yes! All snippets are copy-paste code that you own. Feel free to modify them to fit your needs.
Does this work with other frameworks?
This snippet is designed for the specific framework. Check the other framework pages for equivalent implementations.