UNPKG

@eggjs/onerror

Version:
150 lines 11.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const node_http_1 = __importDefault(require("node:http")); const node_fs_1 = __importDefault(require("node:fs")); const koa_onerror_1 = require("koa-onerror"); const error_view_js_1 = require("./lib/error_view.js"); const utils_js_1 = require("./lib/utils.js"); class Boot { app; constructor(app) { this.app = app; } async didLoad() { // logging error const config = this.app.config.onerror; const viewTemplate = node_fs_1.default.readFileSync(config.templatePath, 'utf8'); const app = this.app; app.on('error', (err, ctx) => { if (!ctx) { ctx = app.currentContext || app.createAnonymousContext(); } if (config.appErrorFilter && !config.appErrorFilter(err, ctx)) return; const status = (0, utils_js_1.detectStatus)(err); // 5xx if (status >= 500) { try { ctx.logger.error(err); } catch (ex) { app.logger.error(err); app.logger.error(ex); } return; } // 4xx try { ctx.logger.warn(err); } catch (ex) { app.logger.warn(err); app.logger.error(ex); } }); const errorOptions = { // support customize accepts function accepts() { const fn = config.accepts || utils_js_1.accepts; return fn(this); }, html(err, ctx) { const status = (0, utils_js_1.detectStatus)(err); const errorPageUrl = typeof config.errorPageUrl === 'function' ? config.errorPageUrl(err, ctx) : config.errorPageUrl; // keep the real response status ctx.realStatus = status; // don't respond any error message in production env if ((0, utils_js_1.isProd)(app)) { // 5xx if (status >= 500) { if (errorPageUrl) { const statusQuery = (errorPageUrl.indexOf('?') > 0 ? '&' : '?') + `real_status=${status}`; return ctx.redirect(errorPageUrl + statusQuery); } ctx.status = 500; ctx.body = `<h2>Internal Server Error, real status: ${status}</h2>`; return; } // 4xx ctx.status = status; ctx.body = `<h2>${status} ${node_http_1.default.STATUS_CODES[status]}</h2>`; return; } // show simple error format for unittest if (app.config.env === 'unittest') { ctx.status = status; ctx.body = `${err.name}: ${err.message}\n${err.stack}`; return; } const errorView = new error_view_js_1.ErrorView(ctx, err, viewTemplate); ctx.body = errorView.toHTML(); }, json(err, ctx) { const status = (0, utils_js_1.detectStatus)(err); let errorJson = {}; ctx.status = status; const code = err.code ?? err.type; const message = (0, utils_js_1.detectErrorMessage)(ctx, err); if ((0, utils_js_1.isProd)(app)) { // 5xx server side error if (status >= 500) { errorJson = { code, // don't respond any error message in production env message: node_http_1.default.STATUS_CODES[status], }; } else { // 4xx client side error // addition `errors` errorJson = { code, message, errors: err.errors, }; } } else { errorJson = { code, message, errors: err.errors, }; if (status >= 500) { // provide detail error stack in local env errorJson.stack = err.stack; errorJson.name = err.name; for (const key in err) { if (!errorJson[key]) { errorJson[key] = err[key]; } } } } ctx.body = errorJson; }, js(err, ctx) { errorOptions.json.call(ctx, err, ctx); if (ctx.createJsonpBody) { ctx.createJsonpBody(ctx.body); } }, }; // support customize error response const keys = ['all', 'html', 'json', 'text', 'js']; for (const type of keys) { if (config[type]) { Reflect.set(errorOptions, type, config[type]); } } (0, koa_onerror_1.onerror)(app, errorOptions); } } exports.default = Boot; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDBEQUE2QjtBQUM3QixzREFBeUI7QUFDekIsNkNBQThFO0FBRTlFLHVEQUFnRDtBQUNoRCw2Q0FBbUY7QUFTbkYsTUFBcUIsSUFBSTtJQUNIO0lBQXBCLFlBQW9CLEdBQVk7UUFBWixRQUFHLEdBQUgsR0FBRyxDQUFTO0lBQUcsQ0FBQztJQUVwQyxLQUFLLENBQUMsT0FBTztRQUNYLGdCQUFnQjtRQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdkMsTUFBTSxZQUFZLEdBQUcsaUJBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxHQUFHLEdBQUcsR0FBRyxDQUFDLGNBQWMsSUFBSSxHQUFHLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsY0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO2dCQUFFLE9BQU87WUFFdEUsTUFBTSxNQUFNLEdBQUcsSUFBQSx1QkFBWSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLE1BQU07WUFDTixJQUFJLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDO29CQUNILEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixDQUFDO2dCQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7b0JBQ1osR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3RCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2QixDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTTtZQUNOLElBQUksQ0FBQztnQkFDSCxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDWixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxZQUFZLEdBQW1CO1lBQ25DLHFDQUFxQztZQUNyQyxPQUFPO2dCQUNMLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksa0JBQU8sQ0FBQztnQkFDckMsT0FBTyxFQUFFLENBQUMsSUFBVyxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUVELElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBWTtnQkFDcEIsTUFBTSxNQUFNLEdBQUcsSUFBQSx1QkFBWSxFQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNLFlBQVksR0FBRyxPQUFPLE1BQU0sQ0FBQyxZQUFZLEtBQUssVUFBVTtvQkFDNUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztvQkFDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7Z0JBRXhCLGdDQUFnQztnQkFDaEMsR0FBRyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7Z0JBQ3hCLG9EQUFvRDtnQkFDcEQsSUFBSSxJQUFBLGlCQUFNLEVBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDaEIsTUFBTTtvQkFDTixJQUFJLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQzt3QkFDbEIsSUFBSSxZQUFZLEVBQUUsQ0FBQzs0QkFDakIsTUFBTSxXQUFXLEdBQ2YsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0NBQzNDLGVBQWUsTUFBTSxFQUFFLENBQUM7NEJBQzFCLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUM7d0JBQ2xELENBQUM7d0JBQ0QsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7d0JBQ2pCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsMkNBQTJDLE1BQU0sT0FBTyxDQUFDO3dCQUNwRSxPQUFPO29CQUNULENBQUM7b0JBQ0QsTUFBTTtvQkFDTixHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDcEIsR0FBRyxDQUFDLElBQUksR0FBRyxPQUFPLE1BQU0sSUFBSSxtQkFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUM3RCxPQUFPO2dCQUNULENBQUM7Z0JBQ0Qsd0NBQXdDO2dCQUN4QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUNsQyxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDcEIsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLE9BQU8sS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3ZELE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLHlCQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDeEQsR0FBRyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEMsQ0FBQztZQUVELElBQUksQ0FBQyxHQUF5QixFQUFFLEdBQVk7Z0JBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUEsdUJBQVksRUFBQyxHQUFHLENBQUMsQ0FBQztnQkFDakMsSUFBSSxTQUFTLEdBQXdCLEVBQUUsQ0FBQztnQkFFeEMsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Z0JBQ3BCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBQSw2QkFBa0IsRUFBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBRTdDLElBQUksSUFBQSxpQkFBTSxFQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2hCLHdCQUF3QjtvQkFDeEIsSUFBSSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7d0JBQ2xCLFNBQVMsR0FBRzs0QkFDVixJQUFJOzRCQUNKLG9EQUFvRDs0QkFDcEQsT0FBTyxFQUFFLG1CQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQzt5QkFDbkMsQ0FBQztvQkFDSixDQUFDO3lCQUFNLENBQUM7d0JBQ04sd0JBQXdCO3dCQUN4QixvQkFBb0I7d0JBQ3BCLFNBQVMsR0FBRzs0QkFDVixJQUFJOzRCQUNKLE9BQU87NEJBQ1AsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO3lCQUNuQixDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFNBQVMsR0FBRzt3QkFDVixJQUFJO3dCQUNKLE9BQU87d0JBQ1AsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO3FCQUNuQixDQUFDO29CQUVGLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO3dCQUNsQiwwQ0FBMEM7d0JBQzFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzt3QkFDNUIsU0FBUyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO3dCQUMxQixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDOzRCQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0NBQ3BCLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBSSxHQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3JDLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsR0FBRyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7WUFDdkIsQ0FBQztZQUVELEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBWTtnQkFDbEIsWUFBWSxDQUFDLElBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFFdkMsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3hCLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUM7UUFFRixtQ0FBbUM7UUFDbkMsTUFBTSxJQUFJLEdBQTRCLENBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBRSxDQUFDO1FBQzlFLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7WUFDeEIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBQSxxQkFBTyxFQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUFqSkQsdUJBaUpDIn0=