12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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;
|