UNPKG

tomjs

Version:
128 lines (124 loc) 4.86 kB
const require2 = require('tomjs/handlers/require2'); const BaseApiError = require2('tomjs/error/base_api_error'); const { isObject } = require2('tomjs/handlers/base_tools'); const subdomain_cfg = require2('tomjs/configs')().subdomain; const SystemConfig = require2('tomjs/configs')().system; const Events = require2('tomjs/handlers/events'); let emitter = Events.getEventEmitter('error'); /** * 在app.use(router)之前调用 自动格式化输出 */ let response_formatter = (ctx) => { if (ctx.response.NotFormat || ctx.NotFormat) { return; } ctx.response.type = 'application/json'; //如果有返回数据,将返回数据添加到data中 if (ctx.status === 429) { } else if (ctx.body !== undefined) { ctx.body = { code: 0, message: 'success', data: ctx.body }; } else { ctx.body = { code: 0, message: 'success', data: {} }; } } let url_filter = () => { let path_pattern = undefined; let hostname_pattern = undefined; if (isObject(subdomain_cfg.response_api_formatter)) { path_pattern = subdomain_cfg.response_api_formatter.path; hostname_pattern = subdomain_cfg.response_api_formatter.hostname; } return async (ctx, next) => { let isAPI = false; if (hostname_pattern) { let reg = new RegExp(hostname_pattern); isAPI = reg.test(ctx.hostname); } if ((isAPI || hostname_pattern === undefined) && path_pattern) { let reg = new RegExp(path_pattern); isAPI = reg.test(ctx.originalUrl); } try { //先去执行路由 await next(); //通过正则的url进行格式化处理 if (isAPI) { response_formatter(ctx); } } catch (error) { let NeedThrow = true; if (isAPI) { let isOK = false;//程序是否抛出 BaseApiError.OK 异常 这种异常是属于正常退出的异常,以无内容正常退出方式处理 //如果异常类型是API异常并且通过正则验证的url,将错误信息添加到响应体中返回。 if ((error instanceof BaseApiError) /*&& reg.test(ctx.originalUrl)*/) { if (error.code !== BaseApiError.OK) { ctx.status = 200; ctx.body = { code: error.code, message: error.needTranslate ? error.Translate(ctx.lang) : error.message, data: error.data || {}, }; } else { isOK = true; } NeedThrow = false; } else if (error.status == 401) { ctx.status = 200; ctx.body = { code: 401, message: error.originalError ? error.originalError.message : error.message, data: {}, }; NeedThrow = false; } else if (error.name == "MissingSchemaError") { ctx.status = 200; ctx.body = { code: BaseApiError.DEEP_POPULATE_MODEL_FILE_NOT_FOUND_ERROR, message: error.message, data: {}, }; NeedThrow = false; } else if (error.name == "TooManyRequestsError") { NeedThrow = true; } else if (SystemConfig.all_error_web_show) { emitter.emit('error', { error, ctx }); ctx.status = 200; ctx.body = { code: BaseApiError.UNKNOW, message: error.message, data: error.stack, }; NeedThrow = false; } if (isOK) { ctx.body = { code: 0, message: 'success', data: {} }; } else { emitter.emit('all_error', { error, ctx }); } //继续抛,让外层中间件处理日志 if (NeedThrow) { throw error; } else { ctx.response.type = 'application/json'; } } else { if ((error instanceof BaseApiError) && error.code == BaseApiError.OK) { ctx.status = 200; NeedThrow = false; } if (NeedThrow) { throw error; } } } } } module.exports = url_filter;