Files
medical-mall/SUPABASE_SYNTAX_FIX_REPORT.md
2026-02-25 11:39:54 +08:00

2.5 KiB
Raw Blame History

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 性质与原始数据一致。

🧪 验证建议

  1. 重新编译 H5 端: 刷新浏览器或重新启动 Vite 开发服务器,确认 main.uts 处的 SyntaxError 消失。
  2. 测试数据查询: 在 Admin 后台(如内容分类列表)尝试加载数据,确认 executeAs<Category>() 能够正确将 UTSJSONObject 转换为预期的类型并在列表显示。

📖 相关文档维护

  • 核心封装文件: components/supadb/aksupa.uts 已同步更新。
  • 副本文件 aksupa - 副本.uts 建议删除或保持其作为历史参考,不建议引用。

GitHub Copilot