Bird
Raised Fist0
NestJSframework~5 mins

Interceptor interface in NestJS - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of the Interceptor interface in NestJS?
The Interceptor interface allows you to add extra logic before or after method execution, transform the result, or handle errors in a centralized way.
Click to reveal answer
beginner
Which method must be implemented when creating a class that uses the Interceptor interface?
You must implement the intercept(context: ExecutionContext, next: CallHandler): Observable<any> method.
Click to reveal answer
intermediate
What does the next.handle() call inside the intercept method do?
It passes control to the next handler in the request pipeline and returns an Observable of the response.
Click to reveal answer
intermediate
How can you modify the response data inside an interceptor?
By using RxJS operators like map on the Observable returned by next.handle() to transform the data before sending it to the client.
Click to reveal answer
beginner
Name two common use cases for interceptors in NestJS.
Logging request/response data and transforming response formats are common uses of interceptors.
Click to reveal answer
What does the Interceptor interface in NestJS primarily allow you to do?
AHandle HTTP routing
BDefine database schemas
CManage user authentication
DAdd logic before and after method execution
Which method signature is required by the Interceptor interface?
Aintercept(context: ExecutionContext, next: CallHandler)
Bhandle(request: Request, response: Response)
Cexecute(context: Context)
Dprocess(data: any)
Inside the intercept method, what does calling next.handle() return?
AA Promise of the response
BAn Observable of the response
CA callback function
DA synchronous value
Which RxJS operator is commonly used inside interceptors to modify response data?
Amap
Bconcat
Creduce
Dfilter
Which of these is NOT a typical use case for NestJS interceptors?
ALogging requests
BTransforming responses
CHandling database migrations
DMeasuring execution time
Explain how the Interceptor interface works in NestJS and what you can do inside the intercept method.
Think about how you can control the flow of a request and response.
You got /5 concepts.
    Describe two practical examples where you might use an interceptor in a NestJS application.
    Consider common tasks that happen around method calls.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the primary purpose of an interceptor in NestJS?
      easy
      A. To run code before and after a request is handled
      B. To define database schemas
      C. To handle HTTP routing
      D. To manage user authentication

      Solution

      1. Step 1: Understand the role of interceptors

        Interceptors in NestJS are designed to execute code before and after the main request handler runs.
      2. Step 2: Compare with other options

        Database schemas, routing, and authentication are handled by other parts of NestJS, not interceptors.
      3. Final Answer:

        To run code before and after a request is handled -> Option A
      4. Quick Check:

        Interceptor purpose = run code before/after request [OK]
      Hint: Interceptors wrap request handling with extra code [OK]
      Common Mistakes:
      • Confusing interceptors with middleware
      • Thinking interceptors handle routing
      • Assuming interceptors manage authentication
      2. Which method must be implemented when creating a NestJS interceptor?
      easy
      A. handle()
      B. intercept()
      C. execute()
      D. process()

      Solution

      1. Step 1: Recall the interceptor interface

        The NestJS interceptor interface requires implementing the intercept() method.
      2. Step 2: Verify other options

        Methods like handle(), execute(), or process() are not part of the interceptor interface.
      3. Final Answer:

        intercept() -> Option B
      4. Quick Check:

        Interceptor method = intercept() [OK]
      Hint: Remember: intercept() runs your interceptor logic [OK]
      Common Mistakes:
      • Using handle() instead of intercept()
      • Confusing with middleware method names
      • Forgetting to implement intercept()
      3. Given this interceptor code snippet, what will be logged?
      import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
      import { Observable, tap } from 'rxjs';
      
      @Injectable()
      export class LoggingInterceptor implements NestInterceptor {
        intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
          console.log('Before handler');
          return next.handle().pipe(
            tap(() => console.log('After handler'))
          );
        }
      }
      medium
      A. Only 'Before handler' is logged
      B. Only 'After handler' is logged
      C. 'Before handler' then 'After handler' are logged
      D. No logs are produced

      Solution

      1. Step 1: Analyze the intercept method

        The interceptor logs 'Before handler' immediately, then calls next.handle() which returns an Observable.
      2. Step 2: Understand the tap operator

        The tap operator logs 'After handler' when the Observable emits after the request handler finishes.
      3. Final Answer:

        'Before handler' then 'After handler' are logged -> Option C
      4. Quick Check:

        Logs before and after handler = 'Before handler' then 'After handler' are logged [OK]
      Hint: tap() logs after the handler completes [OK]
      Common Mistakes:
      • Thinking only one log appears
      • Ignoring the Observable pipe behavior
      • Assuming synchronous logging only
      4. What is wrong with this interceptor implementation?
      import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
      import { Observable } from 'rxjs';
      
      @Injectable()
      export class ErrorInterceptor implements NestInterceptor {
        intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
          try {
            return next.handle();
          } catch (error) {
            console.error('Error caught:', error);
            throw error;
          }
        }
      }
      medium
      A. The interceptor should not throw errors
      B. The intercept method must return void, not Observable
      C. Missing call to next.handle() inside try block
      D. The try-catch block won't catch async errors from next.handle()

      Solution

      1. Step 1: Understand async error handling in interceptors

        next.handle() returns an Observable, so errors happen asynchronously and are not caught by try-catch.
      2. Step 2: Identify the problem with the try-catch

        The try-catch only catches synchronous errors, so async errors must be handled with RxJS operators like catchError.
      3. Final Answer:

        The try-catch block won't catch async errors from next.handle() -> Option D
      4. Quick Check:

        Async errors need RxJS catchError, not try-catch [OK]
      Hint: Use RxJS catchError for async errors, not try-catch [OK]
      Common Mistakes:
      • Using try-catch for async Observable errors
      • Assuming intercept returns void
      • Not handling errors inside pipe
      5. You want to create an interceptor that measures how long a request takes and adds this duration to the response object as response.duration. Which approach correctly implements this?
      hard
      A. Record start time, call next.handle(), then use tap() to calculate duration and modify response before returning
      B. Record start time, use try-catch around next.handle(), then set duration after catch
      C. Modify response before calling next.handle(), then record duration after
      D. Use a middleware instead of interceptor to measure time

      Solution

      1. Step 1: Understand timing with interceptors

        Start time must be recorded before calling next.handle(), which returns an Observable.
      2. Step 2: Use tap() to run code after handler finishes

        tap() lets you calculate duration after the response is ready and modify it safely.
      3. Step 3: Evaluate options

        Record start time, call next.handle(), then use tap() to calculate duration and modify response before returning correctly uses tap() after next.handle() to set response.duration. Record start time, use try-catch around next.handle(), then set duration after catch uses try-catch incorrectly for async. Modify response before calling next.handle(), then record duration after modifies response too early. Use a middleware instead of interceptor to measure time suggests middleware, which is not the question focus.
      4. Final Answer:

        Record start time, call next.handle(), then use tap() to calculate duration and modify response before returning -> Option A
      5. Quick Check:

        Use tap() after next.handle() to measure time [OK]
      Hint: Use tap() after next.handle() to add timing info [OK]
      Common Mistakes:
      • Trying to catch async errors with try-catch
      • Modifying response before handler runs
      • Confusing middleware with interceptor roles
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard