43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
import type { NextFunction, Request, Response } from 'express'
|
|
import type { ApiResponse } from '../../shared/types.js'
|
|
import { ERROR_CODES } from '../../shared/constants/errors.js'
|
|
import { isAppError, isNodeError } from '../../shared/errors/index.js'
|
|
import { logger } from '../utils/logger.js'
|
|
|
|
export const errorHandler = (err: unknown, _req: Request, res: Response, _next: NextFunction) => {
|
|
let statusCode: number = 500
|
|
let code: string = ERROR_CODES.INTERNAL_ERROR
|
|
let message: string = 'Server internal error'
|
|
let details: unknown = undefined
|
|
|
|
if (isAppError(err)) {
|
|
statusCode = err.statusCode
|
|
code = err.code
|
|
message = err.message
|
|
details = err.details
|
|
} else if (isNodeError(err)) {
|
|
message = err.message
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
details = { stack: err.stack, nodeErrorCode: err.code }
|
|
}
|
|
} else if (err instanceof Error) {
|
|
message = err.message
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
details = { stack: err.stack }
|
|
}
|
|
}
|
|
|
|
logger.error(err)
|
|
|
|
const response: ApiResponse<null> = {
|
|
success: false,
|
|
error: {
|
|
code,
|
|
message,
|
|
details: process.env.NODE_ENV === 'production' ? undefined : details,
|
|
},
|
|
}
|
|
|
|
res.status(statusCode).json(response)
|
|
}
|