42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
|
|
import { NextFunction, Request, Response } from 'express';
|
|
import { ClsService } from 'nestjs-cls';
|
|
import { getRealIpInfo } from 'src/utils/ip.util';
|
|
|
|
@Injectable()
|
|
export class RequestDurationMiddleware implements NestMiddleware {
|
|
private readonly logger = new Logger(RequestDurationMiddleware.name);
|
|
|
|
constructor(private readonly cls: ClsService) {}
|
|
|
|
use(req: Request, res: Response, next: NextFunction) {
|
|
const { ip, countryCode } = getRealIpInfo(req);
|
|
|
|
// Setze die IP-Adresse und den Ländercode im CLS-Kontext
|
|
try {
|
|
this.cls.set('ip', ip);
|
|
this.cls.set('countryCode', countryCode);
|
|
} catch (error) {
|
|
this.logger.error('Failed to set CLS context', error);
|
|
}
|
|
|
|
const start = Date.now();
|
|
|
|
this.logger.log(`Entering ${req.method} ${req.originalUrl} from ${ip}`);
|
|
|
|
res.on('finish', () => {
|
|
const duration = Date.now() - start;
|
|
let logMessage = `${req.method} ${req.originalUrl} - ${duration}ms - IP: ${ip}`;
|
|
|
|
if (req.method === 'POST' || req.method === 'PUT') {
|
|
const body = JSON.stringify(req.body);
|
|
logMessage += ` - Incoming Body: ${body}`;
|
|
}
|
|
|
|
this.logger.log(logMessage);
|
|
});
|
|
|
|
next();
|
|
}
|
|
}
|