feat: improved errorsController.js

mainly handling generic errors
This commit is contained in:
Bobby Wibowo 2022-07-21 23:56:08 +07:00
parent c0e91e205c
commit 1b4b73b67c
No known key found for this signature in database
GPG Key ID: 51C3A1E1E22D26CF

View File

@ -13,54 +13,59 @@ const self = {
self.handleError = (req, res, error) => { self.handleError = (req, res, error) => {
if (!res || res.headersSent) { if (!res || res.headersSent) {
console.error('Error: Unexpected missing "res" object or headers alredy sent.') logger.error('Error: Unexpected missing "res" object or headers alredy sent.')
return console.error(error) return logger.error(error)
}
// Error messages that can be returned to users
const isClientError = error instanceof ClientError
const isServerError = error instanceof ServerError
const logStack = (!isClientError && !isServerError) ||
(isServerError && error.logStack)
if (logStack) {
logger.error(error)
}
const statusCode = (isClientError || isServerError)
? error.statusCode
: 500
const json = {}
const description = (isClientError || isServerError)
? error.message
: 'An unexpected error occurred. Try again?'
if (description) {
json.description = description
}
if ((isClientError || isServerError) && error.code) {
json.code = error.code
} }
res.header('Cache-Control', 'no-store') res.header('Cache-Control', 'no-store')
if (Object.keys(json).length) { // Errors that should be returned to users as JSON payload
json.success = false const isClientError = error instanceof ClientError
return res.status(statusCode).json(json) const isServerError = error instanceof ServerError
let statusCode = res.statusCode
if (isClientError || isServerError) {
if (isServerError && error.logStack) {
logger.error(error)
}
const json = {
success: false,
description: error.message || 'An unexpected error occurred. Try again?',
code: error.code
}
if (statusCode === undefined) {
res.status(error.statusCode || 500)
}
return res.json(json)
} else { } else {
// Generic Errors
logger.error(error)
if (statusCode === undefined) {
statusCode = 500
}
if (self.errorPagesCodes.includes(statusCode)) { if (self.errorPagesCodes.includes(statusCode)) {
return res.status(statusCode).sendFile(path.join(paths.errorRoot, config.errorPages[statusCode])) return res
.status(statusCode)
.sendFile(path.join(paths.errorRoot, config.errorPages[statusCode]))
} else { } else {
return res.status(statusCode).end() return res
.status(statusCode)
.end()
} }
} }
} }
self.handleNotFound = (req, res) => { self.handleNotFound = (req, res) => {
res.header('Cache-Control', 'no-store') res.header('Cache-Control', 'no-store')
return res.status(404).sendFile(path.join(paths.errorRoot, config.errorPages[404])) return res
.status(404)
.sendFile(path.join(paths.errorRoot, config.errorPages[404]))
} }
module.exports = self module.exports = self