UNPKG

create-node-mongo-express-app

Version:

Node Js Template with MVC pattern, typescript, mongoose and express

48 lines (37 loc) 1.55 kB
import mongoose from 'mongoose'; import logger from '../utils/winston.logger'; import { NextFunction, Request, Response } from 'express'; import { ApiError } from '../utils/ApiError'; interface CustomError extends Error { statusCode?: number; errors?: never[]; // For Mongoose validation errors } const errorHandler = ( err: CustomError | ApiError<Error>, req: Request, res: Response, //eslint-disable-next-line @typescript-eslint/no-unused-vars next: NextFunction, ) => { let error = err; // Check if the error is an instance of an ApiError class which extends native Error class if (!(error instanceof ApiError)) { // if not // create a new ApiError instance to keep the consistency // assign an appropriate status code const statusCode = error.statusCode || error instanceof mongoose.Error ? 400 : 500; // set a message from native Error instance or a custom one const message = error.message || 'Something went wrong'; error = new ApiError(statusCode, message, error?.errors || [], err.stack); } // Now we are sure that the `error` variable will be an instance of ApiError class const response = { ...error, message: error.message, ...(process.env.NODE_ENV === 'development' ? { stack: error.stack } : {}), // Error stack traces should be visible in development for debugging }; logger.error(`${error.message}`); // Send error response return res.status(error.statusCode).json(response); }; export { errorHandler };