initial commit
This commit is contained in:
94
controllers/errorControllers.js
Normal file
94
controllers/errorControllers.js
Normal file
@@ -0,0 +1,94 @@
|
||||
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;
|
73
controllers/viewControllers.js
Normal file
73
controllers/viewControllers.js
Normal file
@@ -0,0 +1,73 @@
|
||||
const { AppError, catchErrors } = require('../utils/errorUtils');
|
||||
// const { genres, popularGenres } = require('../utils/constants');
|
||||
const getMovie = require('../fetchers/movie');
|
||||
|
||||
exports.overview = (req, res, next) => res.redirect(301, '/about');
|
||||
|
||||
exports.about = catchErrors(async (req, res, next) => {
|
||||
res.render('about', { title: 'About', page: 'About' });
|
||||
});
|
||||
|
||||
exports.privacy = catchErrors(async (req, res, next) => {
|
||||
res.render('privacy', { title: 'Privacy', page: 'Privacy' });
|
||||
});
|
||||
|
||||
exports.contact = catchErrors(async (req, res, next) => {
|
||||
res.render('contact', { title: 'Contact', page: 'Contact' });
|
||||
});
|
||||
|
||||
exports.similarProjects = catchErrors(async (req, res, next) => {
|
||||
res.render('similarProjects', {
|
||||
title: 'Similar Projects',
|
||||
page: 'Similar Projects',
|
||||
});
|
||||
});
|
||||
|
||||
exports.movie = catchErrors(async (req, res, next) => {
|
||||
const movie = await getMovie(req.params.title, +process.env.IMAGE_QUALITY);
|
||||
res.render('movie', {
|
||||
movie,
|
||||
title: movie.basic.name,
|
||||
page: movie.basic.name,
|
||||
});
|
||||
});
|
||||
|
||||
/*
|
||||
exports.searchGenres = catchErrors(async (req, res, next) => {
|
||||
// fetching top 10 rated movies to show in homepage
|
||||
let movies;
|
||||
const genresQueriedStr = req.query.genres;
|
||||
const genresQueriedArr = genresQueriedStr?.split(',');
|
||||
|
||||
if (!genresQueriedArr) {
|
||||
movies = await moviesDataFetcher('sci-fi,action');
|
||||
return res.render('homepage', {
|
||||
title: 'Home Page',
|
||||
page: 'Home Page',
|
||||
movies: movies.slice(-10),
|
||||
genres,
|
||||
popularGenres,
|
||||
});
|
||||
}
|
||||
|
||||
const numResults = +req.query.results || 10;
|
||||
const numPage = +req.query.page || 1;
|
||||
const resultsToskip = numResults * (numPage - 1);
|
||||
|
||||
movies = await moviesDataFetcher(genresQueriedStr);
|
||||
movies = movies.slice(resultsToskip, resultsToskip + numResults);
|
||||
const totalNumResults = movies.length;
|
||||
|
||||
if (!movies.length) return next(new AppError('no movies found', 404));
|
||||
|
||||
const [curPage, totalPages] = [numPage, totalNumResults / numResults];
|
||||
res.render('movies', {
|
||||
title: genresQueriedArr.join(', '),
|
||||
page: 'Movies',
|
||||
genres: genresQueriedArr,
|
||||
movies,
|
||||
curPage,
|
||||
totalPages,
|
||||
});
|
||||
});
|
||||
*/
|
Reference in New Issue
Block a user