File size: 1,254 Bytes
b1df986 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | /**
* Error → HTTP response handler.
*
* Express error middleware (four-arg signature). Maps domain
* AppError instances to their declared status code and logs
* operational errors at INFO, unknown errors at ERROR + 500.
*/
import type { Request, Response, NextFunction } from 'express'
import { AppError } from '../../shared/errors/errors'
import { logger } from '../../shared/logging/logger'
export function errorHandler(
error: unknown,
req: Request,
res: Response,
_next: NextFunction
): void {
const isAppError = error instanceof AppError
const statusCode = isAppError ? error.statusCode : 500
const isOperational = isAppError ? error.isOperational : false
const message = error instanceof Error ? error.message : 'Unknown error'
if (isOperational) {
logger.info('Operational error', {
method: req.method,
path: req.path,
statusCode,
message,
})
} else {
logger.error('Unhandled error', {
method: req.method,
path: req.path,
statusCode,
error: error instanceof Error ? error : String(error),
})
}
const details = isAppError ? error.details : undefined
res.status(statusCode).json({
error: message,
...(details ? { details } : {}),
})
}
|