2.5 KiB
2.5 KiB
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。
代码片段 (修复前):
// #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 性质与原始数据一致。
🧪 验证建议
- 重新编译 H5 端: 刷新浏览器或重新启动 Vite 开发服务器,确认
main.uts处的 SyntaxError 消失。 - 测试数据查询: 在 Admin 后台(如内容分类列表)尝试加载数据,确认
executeAs<Category>()能够正确将UTSJSONObject转换为预期的类型并在列表显示。
📖 相关文档维护
- 核心封装文件:
components/supadb/aksupa.uts已同步更新。 - 副本文件
aksupa - 副本.uts建议删除或保持其作为历史参考,不建议引用。
GitHub Copilot