65 lines
2.5 KiB
Markdown
65 lines
2.5 KiB
Markdown
# Supabase 客户端 (aksupa.uts) 语法错误修复报告
|
||
|
||
## 📍 报告信息
|
||
|
||
**修复日期**: 2026年2月25日
|
||
**问题来源**: 用户在运行 H5 版本时报告 `mai.uts:16 SyntaxError: Unexpected token ';' (at aksupa.uts?import:466:39)`
|
||
**受影响文件**: `components/supadb/aksupa.uts`
|
||
|
||
---
|
||
|
||
## 🔍 问题分析
|
||
|
||
### 1. 语法冲突 (Redeclaration in Preprocessor)
|
||
在 `executeAs<T>()` 方法中,存在多处使用条件编译(`#ifdef`)包裹的同名常量 `const parsed`。
|
||
|
||
**代码片段 (修复前)**:
|
||
```typescript
|
||
// #ifdef APP-ANDROID
|
||
const parsed = item.parse()
|
||
// #endif
|
||
// #ifndef APP-ANDROID
|
||
const parsed = item as T;
|
||
// #endif
|
||
```
|
||
|
||
虽然在不同平台下这些代码是互斥的,但在某些编译器预处理器(尤其是 H5 构建环境下的 Vite/UTS 转换器)中,如果预处理器处理逻辑不够严格,可能会在同一作用域内看到两个同名常量声明,或者在替换/忽略某些行时产生多余的分号或空的表达式,导致 `Unexpected token ';'` 错误。
|
||
|
||
### 2. 缺少分号
|
||
在 Android 平台的 `.parse()` 调用处缺少分号,可能在 H5 编译为 JS 时造成语句合并冲突。
|
||
|
||
### 3. 类型推断不一致
|
||
原代码中对 `result.data` 的处理在 scalar(非数组)情况下直接放进了数组中返回,这可能导致 `executeAs<T>` 在期望得到单个对象时返回了一个数组。
|
||
|
||
---
|
||
|
||
## ✅ 修复措施
|
||
|
||
### 1. 重构变量声明
|
||
将 `const` 重复声明改为在 `if/else` 块外部统一使用 `let parsed: T | null = null;` 声明,然后在条件编译块中仅进行赋值操作。
|
||
|
||
### 2. 标准化 Semicolon
|
||
为所有语句(包括 `.parse()` 调用)添加明确的分号。
|
||
|
||
### 3. 类型转换逻辑优化
|
||
优化了 `executeAs<T>` 的分支处理:
|
||
- 如果 `result.data` 是数组,返回转换后的数组。
|
||
- 如果 `result.data` 是单个对象,返回转换后的单个对象。
|
||
- 保证了返回值的 scalar/array 性质与原始数据一致。
|
||
|
||
---
|
||
|
||
## 🧪 验证建议
|
||
|
||
1. **重新编译 H5 端**: 刷新浏览器或重新启动 Vite 开发服务器,确认 `main.uts` 处的 SyntaxError 消失。
|
||
2. **测试数据查询**: 在 Admin 后台(如内容分类列表)尝试加载数据,确认 `executeAs<Category>()` 能够正确将 `UTSJSONObject` 转换为预期的类型并在列表显示。
|
||
|
||
---
|
||
|
||
## 📖 相关文档维护
|
||
- 核心封装文件: `components/supadb/aksupa.uts` 已同步更新。
|
||
- 副本文件 `aksupa - 副本.uts` 建议删除或保持其作为历史参考,不建议引用。
|
||
|
||
---
|
||
*GitHub Copilot*
|