جاوااسکریپت - Nestjs ثبت دادههای پاسخ شیء
من میخواهم درخواستهای ورودی و پاسخهای خروجی را در NestJs ثبت کنم. من اطلاعات را از اینجا Logging request/response in Nest.js و از مستندات NestJs Aspect Interception گرفتم.
خیلی عالی خواهد بود اگر بتوان این کار را بدون استفاده از بستههای خارجی انجام داد، بنابراین من به شدت ترجیح میدهم یک راهحل بومی «Nest» داشته باشم.
برای ثبت درخواستها در حال حاضر از این کد استفاده میکنم
@Injectable()
export class RequestInterceptor implements NestInterceptor {
private logger: Logger = new Logger(RequestInterceptor.name);
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const {
originalUrl,
method,
params,
query,
body,
} = context.switchToHttp().getRequest();
this.logger.log({
originalUrl,
method,
params,
query,
body,
});
return next.handle();
}
}
این نتیجه زیر را برای GET /users ثبت خواهد کرد
من همچنین میخواهم پاسخ خروجی را ثبت کنم. در حال حاضر از این رهگیر استفاده میکنم
@Injectable()
export class ResponseInterceptor implements NestInterceptor {
private logger: Logger = new Logger(ResponseInterceptor.name);
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const { statusCode } = context.switchToHttp().getResponse();
return next.handle().pipe(
tap(() =>
this.logger.log({
statusCode,
}),
),
);
}
}
این نتیجه زیر را برای GET /users ثبت خواهد کرد
اما چگونه میتوانم به دادههایی که به مشتری بازگردانده شدهاند دسترسی پیدا کنم؟
پاسخ شماره ۱
اول از همه، پیشنهاد میکنم اینها را در یک لاگر ترکیب کنید، فقط به این دلیل که کل منطق لاگگیری در یک جا باشد.
ثانیاً، برای دریافت دادههایی که به مشتری بازگردانده میشوند، در تابع tap خود نیاز دارید یک پارامتر به تابع اضافه کنید، معمولاً آن را data مینامیم، تا بتوانید متوجه شوید چه چیزی بازگردانده میشود. این موضوع توسط Nest کمی پیچیده شده است، زیرا مشخص نیست که observable واقعاً روی چه چیزی کار میکند، اما در نهایت چیزی شبیه به این برای شما کار میکند:
@Injectable()
export class AspectLogger implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler) {
const req = context.switchToHttp().getRequest();
const { statusCode } = context.switchToHttp().getResponse();
const { originalUrl, method, params, query, body } = req;
console.log({
originalUrl,
method,
params,
query,
body,
});
return next.handle().pipe(
tap((data) =>
console.log({
statusCode,
data,
})
)
);
}
}
این همچنین کار خواهد کرد اگر تصمیم بگیرید که آن را دوباره به دو رهگیر جداگانه تقسیم کنید، اما داشتن یک رهگیر واحد میتواند تعیین زمان تماس را نیز آسانتر کند.

