request.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // 小程序网络请求封装
  2. const baseURL = 'https://sit-kelamayi.4dage.com/api'; // 根据环境配置(本地测试)
  3. /**
  4. * 封装wx.request
  5. * @param {Object} options 请求配置
  6. * @param {Boolean} options.useToken 是否使用token,默认false
  7. * @returns {Promise}
  8. */
  9. function request(options) {
  10. return new Promise((resolve, reject) => {
  11. const {
  12. url,
  13. method = 'GET',
  14. data = {},
  15. header = {},
  16. useToken = false
  17. } = options;
  18. // 设置默认请求头
  19. const defaultHeader = {
  20. 'Content-Type': 'application/json;charset=UTF-8',
  21. ...header
  22. };
  23. const app = getApp();
  24. // 如果需要使用token,则添加到请求头
  25. if (useToken) {
  26. let token = null;
  27. // 优先从全局数据获取token
  28. if (app && app.globalData && app.globalData.token) {
  29. token = app.globalData.token;
  30. } else {
  31. // 如果全局数据没有,尝试从本地存储获取
  32. token = wx.getStorageSync('token');
  33. }
  34. if (token) {
  35. defaultHeader['token'] = `${token}`;
  36. console.log('添加token到请求头:', token);
  37. } else {
  38. console.warn('需要token但未获取到token');
  39. }
  40. }
  41. // 完整的请求URL
  42. const fullUrl = url.startsWith('http') ? url : baseURL + url;
  43. console.log('发送请求:', {
  44. url: fullUrl,
  45. method,
  46. data
  47. });
  48. wx.request({
  49. url: fullUrl,
  50. method: method.toUpperCase(),
  51. data: data,
  52. header: defaultHeader,
  53. success: (res) => {
  54. console.log('请求成功:', res);
  55. // 统一处理响应数据
  56. const { data: responseData } = res;
  57. if (res.statusCode === 200) {
  58. // 根据后端返回的数据结构调整
  59. if (responseData.code === 200 || responseData.success === true) {
  60. resolve(responseData.data || responseData);
  61. } else if (responseData.code === 4008) {
  62. // 登录失效,提示并延迟跳转到用户页面
  63. console.log('登录失效,跳转到用户页面');
  64. wx.showToast({
  65. title: '未登录,即将跳转',
  66. icon: 'none',
  67. });
  68. wx.removeStorageSync('token');
  69. wx.removeStorageSync('userInfo');
  70. app.globalData.userInfo = null;
  71. app.globalData.token = null;
  72. // 延迟1秒后跳转到用户页面并触发自动登录
  73. setTimeout(() => {
  74. wx.switchTab({
  75. url: '/pages/user/index'
  76. });
  77. }, 1000);
  78. reject(new Error('登录失效,请重新登录'));
  79. } else {
  80. // 处理业务错误
  81. const errorMsg = responseData.message || responseData.msg || '请求失败';
  82. console.error('业务错误:', errorMsg);
  83. reject(new Error(errorMsg));
  84. }
  85. } else {
  86. reject(new Error(`HTTP ${res.statusCode}: ${res.errMsg || '网络错误'}`));
  87. }
  88. },
  89. fail: (error) => {
  90. console.error('请求失败:', error);
  91. let errorMsg = '网络错误';
  92. if (error.errMsg) {
  93. if (error.errMsg.includes('timeout')) {
  94. errorMsg = '请求超时';
  95. } else if (error.errMsg.includes('fail')) {
  96. errorMsg = '网络连接失败';
  97. }
  98. }
  99. reject(new Error(errorMsg));
  100. }
  101. });
  102. });
  103. }
  104. module.exports = {
  105. request,
  106. baseURL
  107. };