import { NFEngine } from "./engine"; /** * 错误工厂:按语言包编译异常消息。 */ export class NFErrorFactory{ private static errorMsgs; /** * 预加载语言包(当前实现以 `NFEngine.language` 为准)。 * * @param lang - 语言,如 `en` / `zh`;缺省为 `cn` */ static async init(lang?:string){ this.errorMsgs = await import('./locales/message_' + (lang||'cn') + '.ts'); } /** * 按编号获取错误码与消息。未知编号回退为 `0000`。 * * @param errNo - 错误编号 * @param param - 消息模板参数数组 * @returns `{ code, message }` */ public static getError(errNo:string,param?:Array):{code,message}{ let errObj:any = require('./locales/message_' + NFEngine.language); // TS / Node16 编译后可能是 { default: {...} } if(errObj && errObj.default){ errObj = errObj.default; } if(!errObj || !Object.prototype.hasOwnProperty.call(errObj, errNo)){ errNo = "0000"; } let msg = errObj[errNo] || errObj["1000"] || 'Unknown error'; msg = this.compileString(msg,param); return { code:errNo, message:msg } } /** * 将 `${0}` 形式的占位符替换为参数。 * * @param msg - 带占位符的消息模板 * @param param - 参数数组 * @returns 编译后的消息 */ private static compileString(msg:string,param?:Array):string{ if(!msg){ return ''; } let reg = /\$\{\d+?\}/; let r; //处理消息中的参数 while((r=reg.exec(msg)) !== null){ let index = r[0].substring(2,r[0].length-1).trim(); let idx = index && index !== '' ? parseInt(index) : 0; const val = param && param[idx] !== undefined ? param[idx] : ''; msg = msg.replace(r[0],typeof val === 'object'?JSON.stringify(val):String(val)); } return msg; } }