Handling Mongoose errors in a smart way

Table of contents

No heading

No headings in the article.

Instead of using third-party applications or using your own code, there is another way to handle errors like Duplicate Key Error, Mongoose bad ObjectId and others.

  • First create a Class like this:
    class ErrorResponse extends Error {
    constructor(message, statusCode) {
    super(message);
    this.statusCode = statusCode;
    }
    }
    module.exports = ErrorResponse;
  • Handling Errors
    const ErrorResponse = require('../utils/errorResponse');

const errorHandler = (err, req, res, next) => {
let error = { ...err };

error.message = err.message;

// log for dev
console.log(err);

// Mongoose bad ObjectId
if (err.name === 'CastError') {
const message = Resource not found with id of ${err.value};
error = new ErrorResponse(message, 404);
}

// Mongoose duplicate key
if (err.code === 11000) {
const message = 'Duplicate field value entered';
error = new ErrorResponse(message, 400);
}

// Mongoose validation error
if (err.name === 'ValidationError') {
const message = Object.values(err.errors).map((val) => val.message);
error = new ErrorResponse(message, 400);
}

res.status(error.statusCode || 500).json({
success: false,
error: error.message || 'Server Error',
});
};

module.exports = errorHandler;

  • Now the controller should look like this: exports.getBootcamp=async (req, res, next) => { try{

    const bootcamps = await Bootcamp.find();

    res.status(200).json({ success: true, count: bootcamps.length, data: bootcamps }); } catch(err){ next(err) } };