request.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. // 预发布地址
  2. let httpTrackLog = 'https://hyperion-track-app.mokamrp.com';
  3. let httpServiceURL = '';
  4. let version = __wxConfig.envVersion;
  5. switch (version) {
  6. case 'develop':
  7. httpServiceURL = 'https://hyperion-novel-qa-app.mokamrp.com';
  8. // httpServiceURL = "http://172.16.24.193:10111";
  9. // httpServiceURL = 'https://iaa-app.mokamrp.com';
  10. break;
  11. case 'trial':
  12. httpServiceURL = 'https://test-iaa-app.mokamrp.com';
  13. // httpServiceURL = 'https://iaa-app.mokamrp.com';
  14. break;
  15. case 'release': //正式版
  16. httpServiceURL = 'https://iaa-app.mokamrp.com';
  17. break;
  18. default: //未知,默认调用正式版
  19. httpServiceURL = 'https://iaa-app.mokamrp.com';
  20. break;
  21. }
  22. // 添加登录锁和请求队列
  23. let isLoggingIn = false;
  24. let loginPromise = null;
  25. let pendingRequests = [];
  26. // 执行等待队列中的请求
  27. const executePendingRequests = () => {
  28. const requests = [...pendingRequests];
  29. pendingRequests = [];
  30. return Promise.all(requests.map(req => req()));
  31. };
  32. // 普通POST请求
  33. export const post = (url, body = {}) => {
  34. return new Promise((resolve, reject) => {
  35. wx.request({
  36. url: url,
  37. data: body,
  38. method: 'POST',
  39. dataType: 'json',
  40. success: (res) => {
  41. if (res.statusCode == 200 && res.data.code == 200) {
  42. resolve(res.data.data);
  43. } else {
  44. reject(res);
  45. }
  46. },
  47. fail: (res) => {
  48. console.log(url, 'error--------', res);
  49. reject(res);
  50. },
  51. });
  52. });
  53. };
  54. // 普通Get请求
  55. export const get = (url) => {
  56. return new Promise((resolve, reject) => {
  57. wx.request({
  58. url: url,
  59. method: 'GET',
  60. success: (res) => {
  61. if (res.statusCode == 200 && res.data.code == 200) {
  62. resolve(res.data);
  63. } else {
  64. reject(res);
  65. }
  66. },
  67. fail: (res) => {
  68. reject(res);
  69. },
  70. });
  71. });
  72. };
  73. /**
  74. * 打点请求
  75. */
  76. export function uploadTrackLog(url, body) {
  77. if (!body) {
  78. body = {};
  79. }
  80. return post(httpTrackLog + url, body);
  81. }
  82. export const requestLogin = (data) => {
  83. console.log('开始登录请求,参数:', data);
  84. return new Promise((resolve, reject) => {
  85. // 检查是否已经有token
  86. const existingToken = wx.getStorageSync('accessToken');
  87. if (existingToken) {
  88. console.log('已存在token,跳过登录');
  89. return resolve({ accessToken: existingToken });
  90. }
  91. wx.request({
  92. url: httpServiceURL + '/user/loginWx',
  93. data: data,
  94. method: 'POST',
  95. dataType: 'json',
  96. header: {},
  97. success: function (res) {
  98. if (res.data.code == 200) {
  99. console.log('登录成功,保存token');
  100. wx.setStorageSync('accessToken', res.data.data.accessToken);
  101. resolve(res.data.data);
  102. } else {
  103. console.log('登录失败,错误信息:', res.data);
  104. wx.showToast({
  105. title: res.data.msg || res.data.error || '登录失败...',
  106. icon: 'none',
  107. });
  108. reject(res.data);
  109. }
  110. },
  111. fail: function (res) {
  112. console.log('登录请求失败:', res);
  113. wx.showToast({
  114. title: '登录失败...',
  115. icon: 'none',
  116. });
  117. reject(res);
  118. },
  119. });
  120. });
  121. };
  122. export const requestAll = (requestUrl, body, method = 'POST', customHeaders = {}) => {
  123. let url = httpServiceURL + requestUrl;
  124. if (method === 'GET') {
  125. if (body) {
  126. url += '?';
  127. for (const k in body) {
  128. url += `&${k}=${body[k]}`;
  129. }
  130. }
  131. }
  132. // 封装请求函数
  133. const doRequest = () => {
  134. return new Promise((resolve, reject) => {
  135. // 优先使用传入的token,其次使用storage中的token
  136. const token = customHeaders.token || wx.getStorageSync('accessToken') || '';
  137. wx.request({
  138. url: url,
  139. data: body,
  140. method: method,
  141. dataType: 'json',
  142. header: {
  143. ...customHeaders,
  144. token
  145. },
  146. success: function (res) {
  147. if (res.data.code == 200) {
  148. if (typeof res.data.data === 'number') {
  149. resolve(res.data.data);
  150. } else {
  151. resolve(res.data.data || []);
  152. }
  153. }
  154. else if(res.data.code==20001){
  155. reject({code: 20001, msg: '令牌过期'});
  156. }
  157. else {
  158. reject(res.data);
  159. }
  160. },
  161. fail: function (res) {
  162. wx.showToast({
  163. title: '网络出错,请重试...',
  164. icon: 'none',
  165. });
  166. reject(res);
  167. },
  168. });
  169. });
  170. };
  171. // 执行请求,如果token过期则重新登录后重试
  172. return doRequest().catch(async error => {
  173. if (error.code == 20001) {
  174. // 如果已经在登录中,将请求添加到队列
  175. if (isLoggingIn) {
  176. return new Promise((resolve, reject) => {
  177. pendingRequests.push(() => doRequest().then(resolve).catch(reject));
  178. });
  179. }
  180. // 如果没有在登录,开始登录流程
  181. isLoggingIn = true;
  182. try {
  183. // 使用单例登录Promise
  184. if (!loginPromise) {
  185. wx.removeStorageSync('accessToken');
  186. loginPromise = getApp().login();
  187. }
  188. await loginPromise;
  189. // 重置登录状态和Promise
  190. isLoggingIn = false;
  191. loginPromise = null;
  192. // 执行所有请求
  193. if (pendingRequests.length > 0) {
  194. pendingRequests.push(() => doRequest());
  195. return executePendingRequests();
  196. }
  197. return doRequest();
  198. } catch (loginError) {
  199. // 登录失败,重置状态
  200. isLoggingIn = false;
  201. loginPromise = null;
  202. pendingRequests = [];
  203. console.error('重新登录失败:', loginError);
  204. throw loginError;
  205. }
  206. }
  207. throw error;
  208. });
  209. };