Skip to content

Evanion/nestjs-correlation-id

Repository files navigation

Nest.js Correlation ID middleware

Transparently include correlation IDs in all requests

Why?

When debugging an issue in your applications logs, it helps to be able to follow a specific request up and down your whole stack. This is usually done by including a correlation-id (aka Request-id) header in all your requests, and forwarding the same id across all your microservices.

Installation

yarn add @evanion/nestjs-correlation-id
npm install @evanion/nestjs-correlation-id

How to use

Add the middleware to your AppModule

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import {
  CorrelationIdMiddleware,
  CorrelationModule,
} from '@evanion/nestjs-correlation-id';

@Module({
  imports: [CorrelationModule.forRoot()],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(CorrelationIdMiddleware).forRoutes('*');
  }
}

And then just inject the correlation middleware in your HttpService by calling the registerAsync method with the withCorrelation function.

import { HttpModule } from '@nestjs/axios';
import { withCorrelation } from '@evanion/nestjs-correlation-id';

@Module({
  imports: [HttpModule.registerAsync(withCorrelation())],
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

You can now use the HttpService as usual in your UsersService and UsersController

Customize

You can easily customize the header and ID by including a config when you register the module

@Module({
  imports: [CorrelationModule.forRoot({
    header: string
    generator: () => string
  })]
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(CorrelationIdMiddleware).forRoutes('*');
  }
}

see e2e tests for a fully working example

Change Log

See Changelog for more information.

Contributing

Contributions welcome! See Contributing.

Author

Mikael Pettersson (Evanion on Discord)

License

Licensed under the MIT License - see the LICENSE file for details.