response-evaluator.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /**
  2. * 统一解析 uni.request 回调(兼容拦截器已改写 res 前后的状态)
  3. */
  4. export function parseApiResponse(res) {
  5. const httpOk = res.statusCode === 200 && res.errMsg === 'request:ok'
  6. if (!httpOk) {
  7. return {
  8. kind: 'http_error',
  9. status: res.statusCode,
  10. message: res.data?.msg,
  11. res
  12. }
  13. }
  14. const envelope = res.res ?? res.data
  15. const hasBizEnvelope = envelope && typeof envelope === 'object' && 'code' in envelope
  16. if (!hasBizEnvelope) {
  17. return { kind: 'success', data: res.data, message: '', res }
  18. }
  19. if (Number(envelope.code) === 1) {
  20. // 始终从业务 envelope 取 data;勿用 res.data(snapshot 后可能仍是整包 { code, data })
  21. const data = envelope.data
  22. const message = res.msg ?? envelope.msg ?? ''
  23. return { kind: 'success', data, message, res }
  24. }
  25. if (Number(envelope.code) === 4) {
  26. return { kind: 'silent_fail', message: envelope.msg, res }
  27. }
  28. if (envelope.status === 0 || envelope.status === 1) {
  29. return { kind: 'passthrough', data: envelope, message: envelope.msg ?? '', res }
  30. }
  31. return {
  32. kind: 'biz_fail',
  33. message: envelope.msg || '请求失败',
  34. res
  35. }
  36. }
  37. export function snapshotEnvelope(res) {
  38. if (res.statusCode === 200 && res.errMsg === 'request:ok' && !res.res) {
  39. res.res = res.data
  40. }
  41. }
  42. export function applySuccessPayload(res, parsed) {
  43. if (parsed.kind !== 'success') return
  44. if (res.res && res.res.code === 1) {
  45. res.data = parsed.data
  46. res.msg = parsed.message
  47. }
  48. }