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
JavaScript
"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