95 lines
3.1 KiB
JavaScript
95 lines
3.1 KiB
JavaScript
![]() |
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;
|