errorControllers.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. const { AppError } = require('../utils/errorUtils');
  2. //----------------------------------------------------------------------------------------------------------//
  3. // ERROR HANDLING FUNCTIONS ACC TO ENVIRONMENTS
  4. //----------------------------------------------------------------------------------------------------------//
  5. // for errors during development
  6. const devErrorHandler = (err, req, res) => {
  7. req.originalUrl.startsWith('/api/')
  8. ? // 1) FOR API
  9. res.status(err.statusCode).json({
  10. status: err.status,
  11. message: err.message,
  12. stack: err.stack,
  13. err,
  14. })
  15. : // 2) FOR RENDERED PAGES
  16. res.render('error', {
  17. title: 'an error occured',
  18. page: 'error',
  19. message: err.message,
  20. statusCode: err.statusCode,
  21. stack: err.stack,
  22. });
  23. };
  24. // for errors during production
  25. const prodErrorHandler = (err, req, res) => {
  26. if (req.originalUrl.startsWith('/api/'))
  27. // 1) FOR API
  28. // for trusted, operational errors
  29. err.isOperational
  30. ? res
  31. .status(err.statusCode)
  32. .json({ status: err.status, message: err.message })
  33. : // for untrusted errors sending a generic message
  34. res
  35. .status(500)
  36. .json({ status: 'fail', message: 'something went wrong!' });
  37. // 2) FOR RENDERED PAGES
  38. err.isOperational
  39. ? res.render('error', {
  40. title: 'something went wrong',
  41. page: 'error',
  42. message: err.message,
  43. statusCode: err.statusCode,
  44. })
  45. : res.render('error', {
  46. title: 'an error occured',
  47. page: 'error',
  48. message: 'something went wrong!',
  49. statusCode: 500,
  50. });
  51. // err;
  52. };
  53. //-------------------------------------------------------------------------------------------------------------//
  54. // MAIN EXPRESS ERROR HANDLING MIDDLEWARE
  55. //-------------------------------------------------------------------------------------------------------------//
  56. const globalErrorHandler = (err, req, res, next) => {
  57. // setting some defaults on the error in case they don't exist already
  58. err.statusCode = err.statusCode || 500;
  59. err.status = err.status || 'error';
  60. // logging error to the console
  61. console.log('\x1b[31m%s\x1b[0m', '🔴️ ERROR:', err); // with red color
  62. // sending error to the client
  63. // for dev environment
  64. if (process.env.NODE_ENV === 'development') devErrorHandler(err, req, res);
  65. // for prod environment
  66. else if (process.env.NODE_ENV === 'production') {
  67. let error = { ...err };
  68. // marking some special errors as operational
  69. // axios errors
  70. if (err.isAxiosError) {
  71. // if connection can't be established to imdb for some reason
  72. if (err.code === 'ENETUNREACH' || err.code === 'ENOTFOUND')
  73. error = new AppError(
  74. 'there was some problem fetching data from IMDb',
  75. 500
  76. );
  77. // in case the url is wrong(like bad title id)
  78. if (err.response)
  79. error = new AppError(err.response.statusText, err.response.status);
  80. }
  81. prodErrorHandler(error, req, res);
  82. }
  83. };
  84. module.exports = globalErrorHandler;