UNPKG

js-mvc-app

Version:

A CLI tool to scaffold complete Node.js MVC projects with TypeScript, just like Laravel

88 lines (74 loc) 2.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getErrorMiddleware = getErrorMiddleware; function getErrorMiddleware() { return `import { Request, Response, NextFunction } from 'express'; import { logger } from '../utils/logger'; interface AppError extends Error { statusCode?: number; status?: string; isOperational?: boolean; } export function errorHandler(err: AppError, req: Request, res: Response, next: NextFunction): void { let error = { ...err }; error.message = err.message; // Log error logger.error(err); // Mongoose bad ObjectId if (err.name === 'CastError') { const message = 'Resource not found'; error = { name: 'CastError', message, statusCode: 404 } as AppError; } // Mongoose duplicate key if (err.name === 'MongoError' && (err as any).code === 11000) { const message = 'Duplicate field value entered'; error = { name: 'MongoError', message, statusCode: 400 } as AppError; } // Mongoose validation error if (err.name === 'ValidationError') { const message = Object.values((err as any).errors).map((val: any) => val.message).join(', '); error = { name: 'ValidationError', message, statusCode: 400 } as AppError; } // Sequelize validation error if (err.name === 'SequelizeValidationError') { const message = (err as any).errors.map((e: any) => e.message).join(', '); error = { name: 'SequelizeValidationError', message, statusCode: 400 } as AppError; } // Sequelize unique constraint error if (err.name === 'SequelizeUniqueConstraintError') { const message = 'Duplicate field value entered'; error = { name: 'SequelizeUniqueConstraintError', message, statusCode: 400 } as AppError; } // JWT errors if (err.name === 'JsonWebTokenError') { const message = 'Invalid token'; error = { name: 'JsonWebTokenError', message, statusCode: 401 } as AppError; } if (err.name === 'TokenExpiredError') { const message = 'Token expired'; error = { name: 'TokenExpiredError', message, statusCode: 401 } as AppError; } // Default error response const statusCode = error.statusCode || 500; const message = error.message || 'Internal Server Error'; res.status(statusCode).json({ success: false, error: message, ...(process.env.NODE_ENV === 'development' && { stack: err.stack }) }); } // Not found middleware export function notFound(req: Request, res: Response, next: NextFunction): void { const error = new Error(\`Not found - \${req.originalUrl}\`) as AppError; error.statusCode = 404; next(error); } // Async error handler wrapper export function asyncHandler(fn: Function) { return (req: Request, res: Response, next: NextFunction) => { Promise.resolve(fn(req, res, next)).catch(next); }; } `; } //# sourceMappingURL=error.js.map