收藏
回答

wx.request 返回的json数据比服务器返回的多一个data字段

问题模块 框架类型 问题类型 终端类型 微信版本 基础库版本
框架 小程序 Bug 客户端 6.5.3 2.7

- 当前 Bug 的表现(可附上截图)

服务器返回




回调中打印


是不是和我用axios有关系?


- 预期表现


- 复现路径


- 提供一个最简复现 Demo

···

import Q from 'q'
import axios from 'axios'
import env from '../env/env'
import store from '../store/index'
import base64 from './base64'
import {formatParam} from './index'

const config = {

// 请求方法同上
 method: 'get', // default

 /**
  * 基础url前缀
  *
  * 还有一种情况是上传文件前面要加zuul
  * env.getApiHost() + '/zuul/v1'
  *
  */
 baseURL: env.getApiHost() + '/v1',

/**
  * 上传文件前面要加zuul
  *
  * axios.post('url', FormData, axios.defaults.uploadConfig)
  *
  */
 uploadConfig: {
baseURL: env.getApiHost() + '/zuul/v1'
 },

withCredentials: true, // 可能会影响干货下载json获取不到

 // 设置超时时间
 timeout: 0,

// 状态码 处理  status >= 200 && status < 300; // default
 validateStatus: function (status) {
return status >= 200 && status < 300
 }

}

// 全局配置axios
for (let key in config) {
axios.defaults[key] = config[key]
}
let baseAuth = base64.btoa(`${env.auth.client_id}:${env.auth.client_secret}`)
axios.interceptors.request.use(function (request) {
// 如果是新的登录接口
 if (request.url.endsWith('/oauth/token')) {
if (request.headers) {
request.headers.Authorization = baseAuth
   } else {
request.headers = {
Authorization: baseAuth
     }
}
} else {
let token = store.state.app.xaToken
   if (token && (!request.params || request.params.send_token !== false)) {
if (request.headers) {
request.headers.Authorization = 'Bearer ' + store.getters.requestHeaders.access_token
     } else {
request.headers = {
Authorization: 'Bearer ' + store.getters.requestHeaders.access_token
       }
}
} else {
if (request.params) {
delete request.params.send_token
}
}
// 判断get参数是否为空 为空 不传这个字段
   if (request.params) {
// 深拷贝 可能params可能是带__ob__属性的对象
     request.params = JSON.parse(JSON.stringify(request.params))
for (let key in request.params) {
if (request.params[key] === '') {
delete request.params[key]
}
}
}
}
return request
})

axios.defaults.adapter = function (config) {
return new Promise((resolve, reject) => {
let data = config.data
   let url = config.url
   /**
    * get请求 把params放到data
    *
    * 不是get请求 判断有没有params参数 有的话加到url上面
    *
    */
   if (config.method.toUpperCase() === 'GET') {
data = config.params
   } else {
if (config.params) {
url += `?${formatParam(config.params)}`
     }
}
let dataParams = {}
if (data) {
dataParams.data = data
   }
wx.request({
url: url,
header: config.headers,
method: config.method.toUpperCase(),
...dataParams,
success: function (res) {
let response = res
if (response.data && !response.data.data) {
response.data.data = '123'
         delete response.data.data
       }
console.log(response)
if (response.statusCode >= 200 && response.statusCode < 300) {
if (typeof response.data === 'object') {
resolve(response.data)
} else {
resolve({data: response.data})
}
} else if (response.statusCode >= 400 && response.statusCode < 500) {
reject(response.data)
} else {
reject({
reasons: [{
field: '',
message: '接口请求失败',
msg_id: 'error.0000'
           }]
})
}
},
fail: function () {
reject({
reasons: [{
field: '',
message: '接口请求失败',
msg_id: 'error.0000'
         }]
})
}
})
})
}

```

最后一次编辑于  05-28
回答关注问题邀请回答
收藏

2 个回答

  • 社区技术运营专员-白柿子
    社区技术运营专员-白柿子
    05-28

    麻烦提供能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)

    05-28
    赞同
    回复 1
    • 杨佳军
      杨佳军
      05-29

      https://developers.weixin.qq.com/s/BkJnGImd7N8h已生成分享代码 主要看axiosConfig里的内容 我把发送的对象里的data属性不传,返回的数据也没有data属性了。但是实际项目不能这么做

      05-29
      回复
  • 杨佳军
    杨佳军
    05-29

    找到问题了 应该是axios.adapter之后又做了一些操作把data属性加进去了

    ···

      var adapter = config.adapter || defaults.adapter;

    return adapter(config).then(function onAdapterResolution(response) {
    console.log('axios adapter transformData before')
    console.log(Object.getOwnPropertyDescriptors(response))
    throwIfCancellationRequested(config);
    // 设置data了。。。。
       response.data = transformData(
    response.data,
    response.headers,
    config.transformResponse
       );
    console.log('axios adapter transformData after')
    console.log(Object.getOwnPropertyDescriptors(response))
    return response;
    }, function onAdapterRejection(reason) {
    if (!isCancel(reason)) {
    throwIfCancellationRequested(config);

    // Transform response data
         if (reason && reason.response) {
    reason.response.data = transformData(
    reason.response.data,
    reason.response.headers,
    config.transformResponse
           );
    }
    }

    return Promise.reject(reason);
    });

    ···

    05-29
    赞同
    回复