60 lines
1.5 KiB
TypeScript
60 lines
1.5 KiB
TypeScript
import { Request, Response, NextFunction } from 'express';
|
|
import logger from '../utils/logger';
|
|
|
|
export const errorHandlerMiddleware = (
|
|
error: Error & { code?: string },
|
|
req: Request,
|
|
res: Response,
|
|
next: NextFunction
|
|
): void => {
|
|
logger.error('Error occurred:', {
|
|
error: error.message,
|
|
stack: error.stack,
|
|
url: req.url,
|
|
method: req.method,
|
|
ip: req.ip,
|
|
});
|
|
|
|
// Multer errors (e.g. LIMIT_FILE_SIZE, file filter) → 400
|
|
if (error.code === 'LIMIT_FILE_SIZE') {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: 'File too large. Maximum size is 15MB.',
|
|
timestamp: new Date(),
|
|
});
|
|
return;
|
|
}
|
|
if (error.message === 'Only PDF files are allowed' || (error as any).code === 'LIMIT_UNEXPECTED_FILE') {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: error.message || 'Invalid file type.',
|
|
timestamp: new Date(),
|
|
});
|
|
return;
|
|
}
|
|
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Internal Server Error',
|
|
timestamp: new Date(),
|
|
});
|
|
};
|
|
|
|
export const notFoundMiddleware = (
|
|
req: Request,
|
|
res: Response,
|
|
next: NextFunction
|
|
): void => {
|
|
logger.warn(`Route not found: ${req.method} ${req.originalUrl}`);
|
|
res.status(404).json({
|
|
success: false,
|
|
message: `Route ${req.originalUrl} not found`,
|
|
timestamp: new Date(),
|
|
});
|
|
};
|
|
|
|
export const asyncHandler = (fn: Function) => {
|
|
return (req: Request, res: Response, next: NextFunction) => {
|
|
Promise.resolve(fn(req, res, next)).catch(next);
|
|
};
|
|
}; |