request.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. // 如果需要使用token,则添加到请求头
  24. if (useToken) {
  25. const app = getApp();
  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. duration: 1000
  68. });
  69. // 延迟1秒后跳转到用户页面并触发自动登录
  70. setTimeout(() => {
  71. wx.switchTab({
  72. url: '/pages/user/index'
  73. });
  74. }, 1000);
  75. reject(new Error('登录失效,请重新登录'));
  76. } else {
  77. // 处理业务错误
  78. const errorMsg = responseData.message || responseData.msg || '请求失败';
  79. console.error('业务错误:', errorMsg);
  80. reject(new Error(errorMsg));
  81. }
  82. } else {
  83. reject(new Error(`HTTP ${res.statusCode}: ${res.errMsg || '网络错误'}`));
  84. }
  85. },
  86. fail: (error) => {
  87. console.error('请求失败:', error);
  88. let errorMsg = '网络错误';
  89. if (error.errMsg) {
  90. if (error.errMsg.includes('timeout')) {
  91. errorMsg = '请求超时';
  92. } else if (error.errMsg.includes('fail')) {
  93. errorMsg = '网络连接失败';
  94. }
  95. }
  96. reject(new Error(errorMsg));
  97. }
  98. });
  99. });
  100. }
  101. module.exports = {
  102. request
  103. };