50 lines
No EOL
1.6 KiB
TypeScript
50 lines
No EOL
1.6 KiB
TypeScript
import { Request, Response, NextFunction } from "express";
|
|
import { logger, logRequest } from "../utils/logger.js";
|
|
|
|
/**
|
|
* Middleware to log all incoming requests and their responses
|
|
* Logs: method, path, status code, response time, and user info
|
|
*/
|
|
export const requestLoggerMiddleware = (
|
|
req: Request,
|
|
res: Response,
|
|
next: NextFunction
|
|
) => {
|
|
const startTime = Date.now();
|
|
|
|
// Get the full URL path (baseUrl + path)
|
|
const fullPath = req.baseUrl + req.path;
|
|
|
|
// Log incoming request
|
|
const userId = req.currentUser?.id || "anonymous";
|
|
logger.info(`→ ${req.method} ${fullPath} (User: ${userId})`);
|
|
|
|
// Capture the original res.json and res.send to log response
|
|
const originalJson = res.json.bind(res);
|
|
const originalSend = res.send.bind(res);
|
|
|
|
// Override res.json
|
|
res.json = function (body: any) {
|
|
const duration = Date.now() - startTime;
|
|
logRequest(req.method, fullPath, res.statusCode, duration);
|
|
return originalJson(body);
|
|
};
|
|
|
|
// Override res.send
|
|
res.send = function (body: any) {
|
|
const duration = Date.now() - startTime;
|
|
logRequest(req.method, fullPath, res.statusCode, duration);
|
|
return originalSend(body);
|
|
};
|
|
|
|
// Handle responses that end without json/send
|
|
res.on("finish", () => {
|
|
// Only log if we haven't already logged (json/send weren't called)
|
|
if (!res.headersSent) {
|
|
const duration = Date.now() - startTime;
|
|
logRequest(req.method, fullPath, res.statusCode, duration);
|
|
}
|
|
});
|
|
|
|
next();
|
|
}; |