ソースを参照

docs(json): 更新 json-bigint 集成文档与使用说明

- 修改 request 封装强制 dataType 为 text 以支持大整数安全解析
- 更新文档说明 json-bigint 使用 storeAsString 选项避免精度丢失
- 在 uploadAvatar 接口使用 safeJsonParse 替代 JSON.parse
- 为 Snowflake ID 字段在返回前强制转换为字符串类型
- 添加 listUserBindingsByPatient 接口的大整数处理逻辑
mcbaiyun 1 ヶ月 前
コミット
bee9051018
4 ファイル変更19 行追加3 行削除
  1. 1 1
      docs/json-bigint-integration.md
  2. 2 1
      src/api/request.ts
  3. 2 1
      src/api/user.ts
  4. 14 0
      src/api/userBinding.ts

+ 1 - 1
docs/json-bigint-integration.md

@@ -17,7 +17,7 @@ cnpm install json-bigint --save
 ## 3. 使用方法 / 配置点
 
 1. 项目中已创建 `src/utils/jsonBig.ts`,提供 `safeJsonParse` 与 `safeJsonStringify` 方法,内部使用 `json-bigint` 的 `storeAsString: true` 选项来保证大整数不会丢失精度。
-2. 建议通过 `src/api/request.ts` 中的 `request` 封装替代直接调用 `uni.request`。`request` 封装会注入 `Authorization` header(如果本地 token 存在)并对返回的 `response.data` 做 `json-bigint` 解析,返回解析后的对象
+2. 建议通过 `src/api/request.ts` 中的 `request` 封装替代直接调用 `uni.request`。`request` 封装会注入 `Authorization` header(如果本地 token 存在),并把 `dataType` 默认为 `text`,这样能拿到原始 JSON 字符串,随后统一使用 `json-bigint` 做安全解析(避免 Number 精度丢失,特别是 Snowflake / 64-bit ID)
 3. 若某些上传(`uni.uploadFile`)或下载接口返回的 `data` 字段也可能包含大整数,请在对应回调中使用 `safeJsonParse` 解析。
 
 ## 4. 迁移指南

+ 2 - 1
src/api/request.ts

@@ -5,7 +5,8 @@ export interface RequestOptions extends UniApp.RequestOptions {}
 export async function request(options: RequestOptions): Promise<any> {
   const token = uni.getStorageSync('token') as string | undefined
   const header = Object.assign({}, options.header || {}, token ? { Authorization: `Bearer ${token}` } : {})
-  const finalOptions = Object.assign({}, options, { header })
+  // 强制默认从服务端获取原始 text(而不是自动解析成对象),从而能让 json-bigint 正确解析大整数
+  const finalOptions = Object.assign({}, options, { header, dataType: options.dataType || 'text' })
 
   // uni.request 返回 Promise 的时候,在不同平台上可能是 (err, res) 或者 res,
   // 但项目中直接 await uni.request() 并期望返回 { data },因此这里直接 await 并处理返回值

+ 2 - 1
src/api/user.ts

@@ -1,4 +1,5 @@
 import request from './request'
+import { safeJsonParse } from '@/utils/jsonBig'
 // 获取用户详细信息
 export async function getUserInfo(userId: string | number) {
   // token will be injected by `request` wrapper
@@ -55,7 +56,7 @@ export function uploadAvatar(filePath: string) {
       success: (uploadRes: any) => {
         try {
           // 头像上传返回体可能包含 big int 字段,这里使用 json-bigint 安全解析
-          const parsed = JSON.parse(uploadRes.data || '{}') 
+          const parsed = safeJsonParse(uploadRes.data || '{}') 
           resolve(parsed)
         } catch (e) {
           resolve({ data: uploadRes.data })

+ 14 - 0
src/api/userBinding.ts

@@ -46,6 +46,20 @@ export async function listUserBindingsByPatient(
     data: query,
     header: { 'content-type': 'application/json' }
   })
+  // 强制把 Snowflake ID 字段转换为字符串,避免后续使用 Number 导致精度丢失
+  try {
+    const parsed = res?.data as any
+    if (parsed && parsed.code === 200 && parsed.data && Array.isArray(parsed.data.records)) {
+      parsed.data.records = parsed.data.records.map((r: any) => ({
+        ...r,
+        patientUserId: String(r.patientUserId),
+        boundUserId: String(r.boundUserId)
+      }))
+      res.data = parsed
+    }
+  } catch (e) {
+    // ignore
+  }
   return res
 }