index.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import config from './config'
  2. import axios from 'axios'
  3. import qs from 'qs'
  4. // 不需要授权的api
  5. const freeApis = [
  6. '/core/auth/login'
  7. ]
  8. class SDK {
  9. constructor() {
  10. this._delayedCall = [] // 延迟 处理单元
  11. this._errHanlders = [] // 错误 处理器
  12. // 创建一个文件上传用的 axios 对象
  13. this.uploadInst = axios.create({
  14. baseURL: config.serverAddress,
  15. timeout: config.timeout,
  16. headers: {
  17. 'Content-Type': 'multipart/form-data'
  18. }
  19. })
  20. }
  21. // 设置token 意味着重新登陆了
  22. set token(token) {
  23. this._token = token
  24. // 每次设置token,都需要对延迟调用的 请求 做一次清楚
  25. if (this._token) // 只有 token有值的时候才需要请求
  26. this._delayedCall.forEach(params => {
  27. this.fetch(params)
  28. })
  29. // 处理完清理,每次新的token来之后都要清理下 老的请求,不管token有没有
  30. if (this._delayedCall.length > 0)
  31. this._delayedCall.splice(0, this._delayedCall.length)
  32. }
  33. delDelayedCall(token) {
  34. // 每次设置token,都需要对延迟调用的 请求 做一次清楚
  35. if (token) // 只有 token有值的时候才需要请求
  36. this._delayedCall.forEach(params => {
  37. this.fetch(params, token)
  38. })
  39. // 处理完清理,每次新的token来之后都要清理下 老的请求,不管token有没有
  40. if (this._delayedCall.length > 0)
  41. this._delayedCall.splice(0, this._delayedCall.length)
  42. }
  43. // 注册 事件,提供异常过滤事件
  44. regErrHanlder(hanlder) {
  45. /**
  46. * 如:{
  47. * errCode : 'token_is_invalid',
  48. * action: (err,params) => {}
  49. * }
  50. */
  51. // 结构正确才可以被接纳
  52. if (hanlder.errCode && hanlder.action)
  53. this._errHanlders.push(hanlder)
  54. }
  55. // api 请求
  56. fetch(params, token) {
  57. // console.log('记录请求-----------',params,token)
  58. // 错误没必要这里处理,因为 业务有自己的具体处理方案,比如用户状态会维护自己的token,个人认为
  59. if (token != null) this.doRequest(params, token)
  60. else {
  61. if (this.authCheck(params.api)) {
  62. this._delayedCall.push(params)
  63. } else this.doRequest(params)
  64. }
  65. }
  66. /* ======================================================= */
  67. // 检查是否需要授权
  68. authCheck(api) {
  69. return freeApis.findIndex(a => a === api) < 0 // 不存在就 是需要验证的
  70. }
  71. doRequest(params, token) {
  72. // Loading.service({fullscreen: true, text: '拼命加载中....'} )
  73. this.checkParams(params) // 异常处理 二选一
  74. // 复制一份data
  75. if (params.data) {
  76. params.data = JSON.parse(JSON.stringify(params.data));
  77. // 对 meta数据做下转换
  78. if (params.data.meta && typeof params.data.meta === "object") {
  79. params.data.meta = JSON.stringify(params.data.meta)
  80. }
  81. }
  82. // if (token) sysParams.token = token // 用户token,新的方式加入header了
  83. let method = params.method ? params.method : config.method
  84. let timeout = config.timeout;
  85. let prepareData = {
  86. url: config.serverAddress + params.api,
  87. header: {
  88. 'Content-Type': 'application/x-www-form-urlencoded',
  89. 'x-auth-token': token
  90. },
  91. data: {
  92. clientid: config.clientid,
  93. ...params.data
  94. },
  95. dataType: 'json',
  96. }
  97. switch (method.toUpperCase()) {
  98. case 'POST': {
  99. axios.post(prepareData.url, qs.stringify(prepareData.data), { headers: prepareData.header, timeout })
  100. .then(response => {
  101. this.dealResponse(response, params)
  102. }).catch(error => {
  103. console.log('post---------', error)
  104. if (error.response == null)
  105. error.response = { errCode: 'net_error', errMsg: '网络异常' }
  106. if (error.response.data && error.response.data.errCode) this.dealResponse(error.response, params)
  107. else this.completeSDK(error.response, params)
  108. })
  109. break
  110. }
  111. case 'upload': {
  112. this.upload(params.api, prepareData)
  113. .then(response => {
  114. this.dealResponse(response, params)
  115. }).catch(error => {
  116. console.log('upload---------', error)
  117. if (error.response.data && error.response.data.errCode) this.dealResponse(error.response, params)
  118. else this.completeSDK(error.response, params)
  119. })
  120. break
  121. }
  122. default:
  123. axios.get(prepareData.url, { params: prepareData.data, headers: prepareData.header }, { timeout })
  124. .then(response => {
  125. this.dealResponse(response, params)
  126. }).catch(error => {
  127. if (error.response && error.response.data && error.response.data.errCode) this.dealResponse(error.response, params)
  128. else this.completeSDK(error.response, params)
  129. })
  130. break
  131. }
  132. }
  133. upload(apiName, prepareData) {
  134. return new Promise((resolve, reject) => {
  135. // console.log('看看 request',request)
  136. // 组装formData
  137. let fd = new FormData()
  138. fd.append('file', prepareData.data.file, encodeURIComponent(prepareData.data.file.name))
  139. Object.keys(prepareData.data).forEach(key => {
  140. if (key !== 'file')
  141. fd.append(key, prepareData.data[key])
  142. })
  143. this.uploadInst.post(apiName, fd)
  144. .then(response => {
  145. resolve(response)
  146. }).catch(error => {
  147. reject(error)
  148. })
  149. })
  150. }
  151. uploadCustom(params, token) {
  152. //url,file,fieldName='file'
  153. return new Promise((resolve, reject) => {
  154. let fd = new FormData()
  155. fd.append(params.fieldName, params.file, encodeURIComponent(params.file.name))
  156. if (token)
  157. fd.append("token", token)
  158. this.uploadInst.post(params.url, fd)
  159. .then(response => {
  160. resolve(response)
  161. }).catch(error => {
  162. reject(error)
  163. })
  164. })
  165. }
  166. //集中处理get,post的respone
  167. dealResponse(response, params) {
  168. if (response.data.errCode) {
  169. // console.log('delresponse-------',response)
  170. if (this._errHanlders.length > 0) this.doErrHanlder(response, params)
  171. if (params.fail) params.fail(response.data)
  172. } else {
  173. try {
  174. if (params.success) {
  175. params.success(response.data)
  176. }
  177. if (params.complete) params.complete(response.data)
  178. } catch (e) {
  179. // console.log('截获错误---------', e)
  180. }
  181. }
  182. this.completeSDK(response, params)
  183. }
  184. // 错误回调 这里的错误是指 服务器端 的特定错误
  185. doErrHanlder(res, params) {
  186. console.log('处理指定错误------', res, params)
  187. if (res.data && res.data.errCode) {
  188. this._errHanlders.forEach(h => {
  189. if (res.data.errCode === h.errCode) // 判断 错误编码是否匹配
  190. h.action(res.data, params) // 回调
  191. })
  192. }
  193. }
  194. // 检查参数
  195. checkParams(params) {
  196. // console.log('throw error-------',params)
  197. if (!params.api) throw new Error("api没有设置")
  198. }
  199. completeSDK(e, params) {
  200. // console.log('----------------------------completeSDK----------------------------')
  201. // console.log(e)
  202. // console.log(params)
  203. // console.log('----------------------------completeSDK end----------------------------')
  204. // setTimeout(()=>{
  205. // Loading.service().close()
  206. // },500)
  207. }
  208. }
  209. export default new SDK()