RequestModules.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /**
  2. * 这里写的是业务相关的:
  3. * * 请求数据处理函数。
  4. * * 自定义请求模块。
  5. * * 自定义错误报告处理函数。
  6. */
  7. import {
  8. RequestCoreInstance, RequestOptions, RequestApiError, RequestApiResult, type RequestApiErrorType,
  9. defaultResponseDataGetErrorInfo, defaultResponseDataHandlerCatch,
  10. RequestResponse,
  11. appendGetUrlParams,
  12. appendPostParams,
  13. type RequestApiInfoStruct,
  14. WebFetchImplementer,
  15. } from "@imengyu/imengyu-utils";
  16. import type { DataModel, NewDataModel } from "@imengyu/js-request-transform";
  17. import { StringUtils } from "@imengyu/imengyu-utils";
  18. const ApiCofig = {
  19. serverDev: '/api',
  20. serverProd: '/api',
  21. mainBodyId: 1,
  22. }
  23. /**
  24. * 不报告错误的 code
  25. */
  26. const notReportErrorCode = [401] as number[];
  27. const notReportMessages = [
  28. /请授权绑定手机号/g,
  29. ] as RegExp[];
  30. function matchNotReportMessage(str: string) {
  31. for (let i = 0; i < notReportMessages.length; i++) {
  32. if (notReportMessages[i]?.test(str))
  33. return true;
  34. }
  35. return false;
  36. }
  37. //请求拦截器
  38. function requestInceptor(url: string, req: RequestOptions) {
  39. if (req.method == 'GET') {
  40. //追加GET参数
  41. url = appendGetUrlParams(url, 'main_body_id', ApiCofig.mainBodyId);
  42. } else {
  43. req.data = appendPostParams(req.data,'main_body_id', ApiCofig.mainBodyId);
  44. }
  45. return { newUrl: url, newReq: req };
  46. }
  47. //响应数据处理函数
  48. function responseDataHandler<T extends DataModel>(response: RequestResponse, req: RequestOptions, resultModelClass: NewDataModel | undefined, instance: RequestCoreInstance<T>, apiInfo: RequestApiInfoStruct): Promise<RequestApiResult<T>> {
  49. return new Promise<RequestApiResult<T>>((resolve, reject) => {
  50. const method = req.method || 'GET';
  51. response.json().then((json) => {
  52. if (response.ok) {
  53. if (!json) {
  54. reject(new RequestApiError(
  55. 'businessError',
  56. '后端未返回数据',
  57. '',
  58. response.status,
  59. null,
  60. null,
  61. response.headers,
  62. apiInfo
  63. ));
  64. return;
  65. }
  66. //code == 0 错误
  67. if (json.code === 0) {
  68. handleError();
  69. return;
  70. }
  71. //处理后端的数据
  72. let message = '未知错误';
  73. let data = {} as any;
  74. //后端返回格式不统一,所以在这里处理格式
  75. if (typeof json.data === 'object') {
  76. data = json.data;
  77. message = json.data?.msg || response.statusText;
  78. }
  79. else {
  80. //否则返回上层对象
  81. data = json;
  82. message = json.msg || response.statusText;
  83. }
  84. resolve(new RequestApiResult(
  85. resultModelClass ?? instance.config.modelClassCreator,
  86. json?.code || response.status,
  87. message,
  88. data,
  89. json,
  90. response.headers,
  91. apiInfo
  92. ));
  93. }
  94. else {
  95. handleError();
  96. }
  97. function handleError() {
  98. let errType : RequestApiErrorType = 'unknow';
  99. let errString = '';
  100. let errCodeStr = '';
  101. if (typeof json.message === 'string')
  102. errString = json.message;
  103. if (typeof json.msg === 'string')
  104. errString += json.msg;
  105. if (StringUtils.isStringAllEnglish(errString))
  106. errString = '服务器返回:' + errString;
  107. //错误处理
  108. if (errString) {
  109. //如果后端有返回错误信息,则收集错误信息并返回
  110. errType = 'businessError';
  111. if (typeof json.data === 'object' && json.data?.errmsg) {
  112. errString += '\n' + json.data.errmsg;
  113. }
  114. if (typeof json.errors === 'object') {
  115. for (const key in json.errors) {
  116. if (Object.prototype.hasOwnProperty.call(json.errors, key)) {
  117. errString += '\n' + json.errors[key];
  118. }
  119. }
  120. }
  121. } else {
  122. const res = defaultResponseDataGetErrorInfo(response, json);
  123. errType = res.errType;
  124. errString = res.errString;
  125. errCodeStr = res.errCodeStr;
  126. }
  127. reject(new RequestApiError(
  128. errType,
  129. errString,
  130. errCodeStr,
  131. response.status,
  132. null,
  133. null,
  134. response.headers,
  135. apiInfo
  136. ));
  137. }
  138. }).catch((err) => {
  139. //错误统一处理
  140. defaultResponseDataHandlerCatch(method, req, response, null, err, apiInfo, response.url, reject, instance);
  141. });
  142. });
  143. }
  144. //错误报告处理
  145. function responseErrReoprtInceptor<T extends DataModel>(instance: RequestCoreInstance<T>, response: RequestApiError) {
  146. return (
  147. (response.errorType !== 'businessError' && response.errorType !== 'networkError') ||
  148. notReportErrorCode.indexOf(response.code) >= 0 ||
  149. matchNotReportMessage(response.errorMessage) === true
  150. );
  151. }
  152. //错误报告处理
  153. export function reportError<T extends DataModel>(instance: RequestCoreInstance<T>, response: RequestApiError | Error) {
  154. }
  155. /**
  156. * App服务请求模块
  157. */
  158. export class AppServerRequestModule<T extends DataModel> extends RequestCoreInstance<T> {
  159. constructor() {
  160. super(WebFetchImplementer);
  161. this.config.baseUrl = 'https://mn.wenlvti.net/api',//ApiCofig.serverProd;
  162. this.config.errCodes = []; //
  163. this.config.requestInceptor = requestInceptor;
  164. this.config.responseDataHandler = responseDataHandler;
  165. this.config.responseErrReoprtInceptor = responseErrReoprtInceptor;
  166. this.config.reportError = reportError;
  167. }
  168. }