Discover how one simple interceptor can save hours of debugging pain!
Why Logging interceptor in NestJS? - Purpose & Use Cases
Imagine you have a NestJS app where you want to see what requests come in and what responses go out. You add console.log statements in every controller method manually.
This manual logging is slow and boring. You might forget to add logs in some places. Logs become messy and inconsistent. Debugging becomes harder because logs are scattered everywhere.
A logging interceptor automatically catches every request and response. It logs important info in one place, cleanly and consistently, without changing each controller method.
console.log('Request to get user'); const result = this.userService.findUser(id); console.log('Response sent'); return result;
intercept(context, next) {
console.log('Incoming request');
return next.handle().pipe(tap(() => console.log('Response sent')));
}You get clear, consistent logs for every request and response automatically, making debugging and monitoring easy.
In a real app, a logging interceptor helps track API usage and errors without cluttering your business logic with logging code.
Manual logging is error-prone and scattered.
Logging interceptor centralizes and automates logging.
It improves debugging and monitoring effortlessly.
Practice
LoggingInterceptor in a NestJS application?Solution
Step 1: Understand the role of interceptors
Interceptors in NestJS run code before and after request handlers, often used for logging or modifying requests/responses.Step 2: Identify the purpose of LoggingInterceptor
A LoggingInterceptor specifically tracks and logs request and response details for debugging and monitoring.Final Answer:
To log details about incoming requests and outgoing responses -> Option CQuick Check:
LoggingInterceptor = logs requests/responses [OK]
- Confusing interceptors with middleware
- Thinking interceptors handle authentication
- Assuming interceptors serve static files
intercept method in a NestJS LoggingInterceptor?Solution
Step 1: Recall the intercept method signature
The intercept method receives two parameters:contextandnext. It must returnnext.handle()to continue the request lifecycle.Step 2: Check each option for correct syntax
intercept(context, next) { return next.handle(); } correctly uses both parameters and returnsnext.handle(). Options A, C, and D either miss parameters or do not return the observable.Final Answer:
intercept(context, next) { return next.handle(); } -> Option AQuick Check:
intercept(context, next) returns next.handle() [OK]
- Omitting return statement
- Missing one of the parameters
- Calling handle on wrong object
intercept(context, next) {
const now = Date.now();
return next.handle().pipe(
tap(() => console.log(`Request took ${Date.now() - now}ms`))
);
}Solution
Step 1: Analyze the timing logic
The code records the current time before the request is handled, then logs the difference after the response is sent.Step 2: Understand the logged message
The console.log outputs "Request took Xms" where X is the elapsed time in milliseconds.Final Answer:
Logs the time taken to process the request in milliseconds -> Option AQuick Check:
LoggingInterceptor measures request duration [OK]
- Assuming it logs request URL or body
- Thinking it logs errors only
- Ignoring the timing calculation
intercept(context, next) {
const now = Date.now();
next.handle().pipe(
tap(() => console.log(`Request took ${Date.now() - now}ms`))
);
}Solution
Step 1: Check the intercept method return
The intercept method must return the observable fromnext.handle()to continue the request lifecycle.Step 2: Identify missing return
The code callsnext.handle().pipe(...)but does not return it, so the request will not proceed properly.Final Answer:
Missing return statement before next.handle() -> Option DQuick Check:
intercept must return next.handle() observable [OK]
- Forgetting to return the observable
- Misusing Date.now() for timing
- Ignoring required parameters
Solution
Step 1: Access request object correctly
Usecontext.switchToHttp().getRequest()to get the HTTP request object in NestJS interceptors.Step 2: Use tap operator for side effects
Thetapoperator is used to perform logging without altering the response stream. Usingmaporconsole.erroris incorrect here.Final Answer:
intercept(context, next) { const req = context.switchToHttp().getRequest(); const now = Date.now(); return next.handle().pipe( tap(() => console.log(`${req.method} ${req.url} - ${Date.now() - now}ms`)) ); } -> Option BQuick Check:
Use switchToHttp(), tap, and return next.handle() [OK]
- Not returning next.handle()
- Using map instead of tap
- Using console.error instead of console.log
- Incorrect request object access
Ready to prove it?
Pass the test and this pattern moves unknown
