import {createLogger} from "@gongt/ts-stl-library/debug/create-logger"; import {LOG_LEVEL} from "@gongt/ts-stl-library/debug/levels"; import {ErrorResponse, RequestError} from "@gongt/ts-stl-library/request/request-error"; import {Middleware} from "koa"; const logger = createLogger(LOG_LEVEL.INFO, 'std-err-handle'); export interface ErrorRenderFunction { (e: ErrorResponse): string; } const isJson = /\/json$/i; export function standardErrorHandler(errorRender: ErrorRenderFunction): Middleware { return function standardErrorHandlerFromSTL({request, response}, next) { return next().catch((e) => { const eRes = RequestError.internal(e).response(); if (isJson.test(request.type)) { logger('standard request error(json): %s - %s\n%s', eRes.statusName, eRes.errorDescription, eRes.errorStack); response.type = 'application/json'; response.status = 200; response.body = eRes; } else { logger('standard request error(text): %s - %s\n%s', eRes.statusName, eRes.errorDescription, eRes.errorStack); response.status = 500; response.body = errorRender(eRes); } }); } } export function standardJsonErrorHandler(): Middleware { return async function standardErrorHandlerFromSTL({request, response}, next) { try { await next(); } catch (e) { logger('standard request error(json): %s', e.message); response.type = 'application/json'; response.status = 200; response.body = RequestError.internal(e).response(); } } }