diff --git a/src/http/client.ts b/src/http/client.ts index 0e69f56..4cdda1f 100644 --- a/src/http/client.ts +++ b/src/http/client.ts @@ -81,7 +81,9 @@ export async function request( header: headers }) } catch (e) { - throw new ApiError(e instanceof Error ? e.message : '网络异常') + // Taro 网络 API reject 的是 { errMsg } 形状对象而非 Error 实例,需兼容读取以便透出真实原因 + const raw = e instanceof Error ? e.message : (e as { errMsg?: string })?.errMsg + throw new ApiError(raw || '网络异常') } if (res.statusCode !== 200) { diff --git a/tests/unit/http/client.spec.ts b/tests/unit/http/client.spec.ts index 27bc9d4..059a3e7 100644 --- a/tests/unit/http/client.spec.ts +++ b/tests/unit/http/client.spec.ts @@ -87,6 +87,22 @@ describe('client envelope 解析', () => { }) }) + it('Taro.request reject 的是 { errMsg } 形状对象时透传 errMsg(微信真实失败形态)', async () => { + mockRequest.mockRejectedValue({ errMsg: 'request:fail url not in domain list' }) + await expect(request.get('/demo')).rejects.toMatchObject({ + name: 'ApiError', + message: 'request:fail url not in domain list' + }) + }) + + it('reject 无任何可读信息时兜底「网络异常」', async () => { + mockRequest.mockRejectedValue(undefined) + await expect(request.get('/demo')).rejects.toMatchObject({ + name: 'ApiError', + message: '网络异常' + }) + }) + it('需鉴权请求注入 Bearer token 头', async () => { mockRequest.mockResolvedValue(okBody(null)) await request.get('/demo')