diff --git a/src/data/providers/sgsSdkApiProvider.ts b/src/data/providers/sgsSdkApiProvider.ts index f9d9584..b32cd10 100644 --- a/src/data/providers/sgsSdkApiProvider.ts +++ b/src/data/providers/sgsSdkApiProvider.ts @@ -209,9 +209,33 @@ const resolveAppApiBaseUrl = () => { return baseUrl.endsWith('/app-api') ? baseUrl : `${baseUrl}/app-api` } -const parseJsonPayload = (payload: unknown): T => { +const getHeaderValue = ( + header: Record | undefined, + key: string +) => { + if (!header) return '' + const matchedKey = Object.keys(header).find((item) => item.toLowerCase() === key.toLowerCase()) + return matchedKey ? String(header[matchedKey] || '') : '' +} + +const previewPayload = (payload: unknown) => { + const text = typeof payload === 'string' ? payload : JSON.stringify(payload) || '' + return text.replace(/\s+/g, ' ').trim().slice(0, 120) +} + +const parseJsonPayload = (payload: unknown, requestUrl: string, contentType: string): T => { if (typeof payload === 'string') { - return JSON.parse(payload) as T + const trimmedPayload = payload.trim() + const looksLikeHtml = /^]/i.test(trimmedPayload) + if (looksLikeHtml || contentType.toLowerCase().includes('text/html')) { + throw new Error(`SGS 数据接口返回非 JSON: ${requestUrl} content-type=${contentType || 'unknown'} body="${previewPayload(payload)}"`) + } + + try { + return JSON.parse(trimmedPayload) as T + } catch { + throw new Error(`SGS 数据接口 JSON 解析失败: ${requestUrl} content-type=${contentType || 'unknown'} body="${previewPayload(payload)}"`) + } } return payload as T @@ -222,9 +246,10 @@ const requestJson = ( options: { method?: 'GET' | 'POST'; data?: unknown } = {} ): Promise => new Promise((resolve, reject) => { const baseUrl = resolveAppApiBaseUrl() + const requestUrl = `${baseUrl}${path}` uni.request({ - url: `${baseUrl}${path}`, + url: requestUrl, method: options.method || 'GET', data: options.method === 'POST' ? JSON.stringify(options.data || {}) : undefined, header: options.method === 'POST' @@ -235,15 +260,16 @@ const requestJson = ( timeout: dataSourceConfig.sgsSdkTimeoutMs, success: (response) => { const statusCode = Number(response.statusCode || 0) + const contentType = getHeaderValue(response.header as Record | undefined, 'content-type') if (statusCode < 200 || statusCode >= 300) { - reject(new Error(`SGS 数据接口请求失败: ${statusCode} ${path}`)) + reject(new Error(`SGS 数据接口请求失败: ${statusCode} ${requestUrl} content-type=${contentType || 'unknown'} body="${previewPayload(response.data)}"`)) return } try { - const body = parseJsonPayload>(response.data) + const body = parseJsonPayload>(response.data, requestUrl, contentType) if (!body || body.code !== 0) { - reject(new Error(`SGS 数据接口业务失败: ${path} code=${body?.code} msg=${body?.msg || ''}`)) + reject(new Error(`SGS 数据接口业务失败: ${requestUrl} code=${body?.code} msg=${body?.msg || ''}`)) return } diff --git a/vite.config.ts b/vite.config.ts index 3deedf1..0680837 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,10 +1,35 @@ import { defineConfig } from 'vite' import uni from '@dcloudio/vite-plugin-uni' +const sgsDevServer = 'http://1.92.206.90:3001' +const sgsAssetServer = 'http://1.92.206.90:9000' + export default defineConfig({ plugins: [uni()], server: { - host: '0.0.0.0' + host: '0.0.0.0', + proxy: { + '/app-api': { + target: sgsDevServer, + changeOrigin: true + }, + '/h5-sdk': { + target: sgsDevServer, + changeOrigin: true + }, + '/sdk': { + target: sgsDevServer, + changeOrigin: true + }, + '/museum-assets': { + target: sgsAssetServer, + changeOrigin: true + }, + '/minio': { + target: sgsDevServer, + changeOrigin: true + } + } }, resolve: { alias: {