const AppError = require("../utils/appError"); const handleCastErrorDB = (err) => { const message = `Invalid ${err.path}: ${err.value}`; return new AppError(message, 400); }; const handleDuplicateFieldsDB = (err) => { const message = `Duplicate field value: "${err.keyValue.name}". Please use another value!`; return new AppError(message, 400); }; const handleValidationErrorDB = (err) => { const errors = Object.values(err.errors).map((val) => val.message); const message = `Invalid input data. ${errors.join(". ")}`; return new AppError(message, 400); }; const handleJWTError = () => new AppError("Invalid token. Please log in again!", 401); const handleJWTExpiredError = () => new AppError("Your token has expired. Please log in again!", 401); const sendErrorDev = (err, req, res) => { res.status(err.statusCode).json({ status: err.status, error: err, message: err.message, stack: err.stack, }); }; const sendErrorProd = (err, req, res) => { // a) APIs if (err.isOperational) { // Operational, trusted error: send message to client return res.status(err.statusCode).json({ status: err.status, message: err.message, }); // Programming or other unknown error: Don't leak error details } // 1) Log error console.error("ERROR 💥", err); // 2) Send generic message return res.status(500).json({ status: "error", message: "Something went very wrong", }); }; module.exports = (err, req, res, next) => { // console.log(err.stack); err.statusCode = err.statusCode || 500; err.status = err.status || "error"; if (process.env.NODE_ENV === "developement") { sendErrorDev(err, req, res); } else if (process.env.NODE_ENV === "production") { let error = JSON.parse(JSON.stringify(err)); error.message = err.message; if (error.name === "CastError") error = handleCastErrorDB(error); if (error.code === 11000) error = handleDuplicateFieldsDB(error); if (error.name === "ValidationError") error = handleValidationErrorDB(error); if (error.name === "JsonWebTokenError") error = handleJWTError(); if (error.name === "TokenExpiredError") error = handleJWTExpiredError(); sendErrorProd(error, req, res); } };