Handling Mongoose errors in a smart way
Table of contents
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) } };