libremdb/controllers/errorControllers.js

95 lines
3.1 KiB
JavaScript
Raw Normal View History

2022-03-19 17:22:07 +05:30
const { AppError } = require('../utils/errorUtils');
//----------------------------------------------------------------------------------------------------------//
// ERROR HANDLING FUNCTIONS ACC TO ENVIRONMENTS
//----------------------------------------------------------------------------------------------------------//
// for errors during development
const devErrorHandler = (err, req, res) => {
req.originalUrl.startsWith('/api/')
? // 1) FOR API
res.status(err.statusCode).json({
status: err.status,
message: err.message,
stack: err.stack,
err,
})
: // 2) FOR RENDERED PAGES
res.render('error', {
title: 'an error occured',
page: 'error',
message: err.message,
statusCode: err.statusCode,
stack: err.stack,
});
};
// for errors during production
const prodErrorHandler = (err, req, res) => {
if (req.originalUrl.startsWith('/api/'))
// 1) FOR API
// for trusted, operational errors
err.isOperational
? res
.status(err.statusCode)
.json({ status: err.status, message: err.message })
: // for untrusted errors sending a generic message
res
.status(500)
.json({ status: 'fail', message: 'something went wrong!' });
// 2) FOR RENDERED PAGES
err.isOperational
? res.render('error', {
title: 'something went wrong',
page: 'error',
message: err.message,
statusCode: err.statusCode,
})
: res.render('error', {
title: 'an error occured',
page: 'error',
message: 'something went wrong!',
statusCode: 500,
});
// err;
};
//-------------------------------------------------------------------------------------------------------------//
// MAIN EXPRESS ERROR HANDLING MIDDLEWARE
//-------------------------------------------------------------------------------------------------------------//
const globalErrorHandler = (err, req, res, next) => {
// setting some defaults on the error in case they don't exist already
err.statusCode = err.statusCode || 500;
err.status = err.status || 'error';
// logging error to the console
console.log('\x1b[31m%s\x1b[0m', '🔴️ ERROR:', err); // with red color
// sending error to the client
// for dev environment
if (process.env.NODE_ENV === 'development') devErrorHandler(err, req, res);
// for prod environment
else if (process.env.NODE_ENV === 'production') {
let error = { ...err };
// marking some special errors as operational
// axios errors
if (err.isAxiosError) {
// if connection can't be established to imdb for some reason
if (err.code === 'ENETUNREACH' || err.code === 'ENOTFOUND')
error = new AppError(
'there was some problem fetching data from IMDb',
500
);
// in case the url is wrong(like bad title id)
if (err.response)
error = new AppError(err.response.statusText, err.response.status);
}
prodErrorHandler(error, req, res);
}
};
module.exports = globalErrorHandler;