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 logging
A 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';
}