55 lines
1.1 KiB
TypeScript
55 lines
1.1 KiB
TypeScript
import type { ErrorRequestHandler } from 'express';
|
|
|
|
import { toHttpError } from '../errors.js';
|
|
import {
|
|
applyApiResponseHeaders,
|
|
buildApiLogContext,
|
|
wantsApiEnvelope,
|
|
} from '../http.js';
|
|
|
|
export const errorHandler: ErrorRequestHandler = (
|
|
error,
|
|
request,
|
|
response,
|
|
_next,
|
|
) => {
|
|
const normalizedError = toHttpError(error);
|
|
const meta = applyApiResponseHeaders(request, response);
|
|
|
|
request.log?.error(
|
|
{
|
|
err: error,
|
|
...buildApiLogContext(request, response),
|
|
user_id: request.userId ?? null,
|
|
status: normalizedError.statusCode,
|
|
error_code: normalizedError.code,
|
|
},
|
|
'request failed',
|
|
);
|
|
|
|
response.status(normalizedError.statusCode);
|
|
|
|
const errorPayload = {
|
|
code: normalizedError.code,
|
|
message: normalizedError.message,
|
|
...(normalizedError.expose && normalizedError.details !== undefined
|
|
? { details: normalizedError.details }
|
|
: {}),
|
|
};
|
|
|
|
if (wantsApiEnvelope(request)) {
|
|
response.json({
|
|
ok: false,
|
|
data: null,
|
|
error: errorPayload,
|
|
meta,
|
|
});
|
|
return;
|
|
}
|
|
|
|
response.json({
|
|
error: errorPayload,
|
|
meta,
|
|
});
|
|
};
|