diff --git a/utils/api.js b/utils/api.js index 23b702a..16f6d90 100644 --- a/utils/api.js +++ b/utils/api.js @@ -362,14 +362,48 @@ export { buildFormBodyWithImages } /** * 安全解析 JSON,将超出 JS 安全整数范围的数字转为字符串 + * uni.request 可能会自动解析 JSON,所以返回的数据可能是对象或字符串 */ -function safeJsonParse(text) { - return JSON.parse(text, function(key, value) { - if (typeof value === 'number' && !Number.isSafeInteger(value)) { - return String(value) +function safeJsonParse(data) { + if (typeof data === 'string') { + return JSON.parse(data, function(key, value) { + if (typeof value === 'number' && !Number.isSafeInteger(value)) { + return String(value) + } + return value + }) + } + // data 已经是对象(uni-app 自动解析了),修复所有大整数字段 + if (data && typeof data === 'object') { + fixLargeInts(data) + } + return data +} + +/** + * 递归修复对象中的大整数(超过 JS 安全范围的 number → string) + */ +function fixLargeInts(obj) { + if (obj === null || obj === undefined) return + if (typeof obj !== 'object') return + + if (Array.isArray(obj)) { + for (var i = 0; i < obj.length; i++) { + if (obj[i] !== null && obj[i] !== undefined && typeof obj[i] === 'object') { + fixLargeInts(obj[i]) + } } - return value - }) + return + } + + for (var key in obj) { + var val = obj[key] + if (typeof val === 'number' && !Number.isSafeInteger(val)) { + obj[key] = String(val) + } else if (val !== null && typeof val === 'object') { + fixLargeInts(val) + } + } } /** @@ -384,12 +418,11 @@ export function getShopList(params = {}) { uni.request({ url: url, method: 'GET', - dataType: 'text', header: { 'Authorization': 'Bearer ' + token }, success: (res) => { - var data = typeof res.data === 'string' ? safeJsonParse(res.data) : res.data + var data = safeJsonParse(res.data) console.log('【店铺列表】响应:', JSON.stringify(data)) if (res.statusCode === 200 && data && data.code === 0) { resolve(data.data) @@ -418,12 +451,11 @@ export function getShopDetail(params = {}) { uni.request({ url: url, method: 'GET', - dataType: 'text', header: { 'Authorization': 'Bearer ' + token }, success: (res) => { - var data = typeof res.data === 'string' ? safeJsonParse(res.data) : res.data + var data = safeJsonParse(res.data) console.log('【上书详情】响应:', JSON.stringify(data)) if (res.statusCode === 200 && data) { if (data.code === 200 && data.data) {