create-node-mongo-express-app
Version:
Node Js Template with MVC pattern, typescript, mongoose and express
48 lines (37 loc) • 1.55 kB
text/typescript
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 };