In NestJS, interceptors serve functions such as modifying the incoming request, the outgoing response, logging, transformations, and caching. They share a lot of characteristics with middleware, although they are much more exact, such as transforming responses or adding more functionality.
Follow these instructions to make and implement interceptors in NestJS:
You may create the file directly or use the NestJS CLI to create the interceptor.
Type the following command into the CLI:
nest g interceptor loggingA new file called logging.interceptor.ts will now be generated.
For interceptors to work, interceptors need to implement the NestInterceptor interface that has an intercept() method. This method comes with two parameters: the context of the execution and a handler which lets one pass the request to the next function in the lifecycle.
Here is all the code for the logging interceptor, which logs the request and the response:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';import { Observable } from 'rxjs';import { tap } from 'rxjs/operators';@Injectable()export class LoggingInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { const now = Date.now(); console.log('Before the handler...'); return next .handle() .pipe( tap(() => console.log(`After the handler... ${Date.now() - now}ms`)), ); }}
In this case, the intercept method measures time, and can therefore be used for performance monitoring.
An interceptor can be applied at the method level, the controller level, or globally.
Globally: In main.ts:
import { LoggingInterceptor } from './logging.interceptor';import { AppModule } from './app.module';async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalInterceptors(new LoggingInterceptor()); await app.listen(3000);}bootstrap();
Controller Level: For all methods within a controller, you set the interceptor.
import { Controller, UseInterceptors, Get } from '@nestjs/common';import { LoggingInterceptor } from './logging.interceptor';@Controller('example')@UseInterceptors(LoggingInterceptor)export class ExampleController { @Get() getExample() { return 'This is an example'; }}
Method Level: Applying the interceptor to a particular route.
@Get('example')@UseInterceptors(LoggingInterceptor)getExample() { return 'This is an example';}
Contact Us