鸿蒙端云一体实战:ArkTS + 华为云 Serverless 做一个多端同步待办清单

举报
yd_288537773 发表于 2026/11/07 10:23:16 2026/11/07
【摘要】 基于鸿蒙开发实践中心的「云同步待办清单」案例,梳理 ArkTS 端侧 + 华为云 Serverless(FunctionGraph + APIG + RDS)端云一体链路的真实踩坑:base64 解码、8 小时时区、幂等 upsert、VPC 冷启动超时、三表数据模型与一键部署验收,附验收清单。

端云一体最容易翻车的不是写业务,而是那条「App → APIG → 云函数 → RDS」的链路能不能稳定跑通。这篇基于鸿蒙开发实践中心的「云同步待办清单」案例,把真实部署中踩过的坑和关键实现整理成一份可复用的基线。

一、为什么用「端云一体」而不是纯端侧

纯端侧 App 数据只在本机,换设备就丢。要做多端同步,就得有一个云端。这个案例给的骨架很适合照抄:

  • 端侧(ArkTS/ArkUI)只带两个公开配置:APIG 公网入口 BASE_URL 和调试域名 APIG_HOST
  • 云侧由 8 个 FunctionGraph 云函数(Node.js 18.15)+ APIG 专享版 + RDS for MySQL 8.0 组成
  • 数据库凭据只存在云函数环境变量里,端侧永远拿不到

一句话原则:端侧只放公开入口地址,业务校验和数据读写全部收口到云端。

二、云函数基线:四个绕不开的坑

这四条是把「能跑」和「稳定跑」区分开的关键,每一条都来自真实报错。

1. base64 解码(parseBody)

APIG 会把 POST body 做 base64 编码再交给函数。如果直接 JSON.parse(event.body),就会收到 Unexpected token e in JSON。正确做法是:判断 event.isBase64Encoded 后用 Buffer.from(body,‘base64’).toString(‘utf8’) 解码再 parse。8 个函数都要统一用它,改动时别删。

2. 时区(差 8 小时)

云函数运行环境是 UTC,mysql2 又可能按 UTC 转换 DATETIME,两者叠加就出现「时间差 8 小时」。解法是连接池加 dateStrings 为 true,写入时用 getBeijingTime 显式取北京时间。

3. 幂等写入(ON DUPLICATE KEY UPDATE)

APIG 超时返回 504 不等于函数失败——函数可能还在执行。客户端一重试就会重复写入。所以任务表用客户端 UUID 作主键、ON DUPLICATE KEY UPDATE 做幂等 upsert,弱网重试也只落一次。

4. 统一响应契约

所有函数统一返回 code、message、data 三字段:code 为 0 成功、1 业务错误、2 未登录。端侧据此分流,比解析各种 HTTP 状态码省心得多。

三、三张表撑起账号与任务

  • users:scrypt 加盐哈希(salt 与 hash 分开存)
  • sessions:会话 token,外键级联删除,承担登录态校验
  • tasks:客户端 UUID 主键、deleted 软删除、updated_at 作同步游标

tasks 上建 idx_user_updated 索引(user_id、updated_at),后续要做增量同步可以直接命中。

四、端侧 30 秒轮询与冷启动处理

TodoList 页面每 30 秒调 GET /todo/pull 全量重建列表。这里有个容易被忽略的问题:VPC 函数冷启动挂 ENI 大约 6 秒,超过 APIG 默认 5000ms 后端超时,首次调用会 504。

处理办法:

  • HttpUtil 里 MAX_RETRY 设为 3,冷启动 504 自动重试
  • 函数超时调到 30s,APIG 后端超时调到 30000ms(删除重建触发器)
  • 如果反复 504 后连热实例查询也稳定 5 到 6 秒,说明实例连接池被打坏了,重传代码强制换新实例即可

页面底部放一个请求日志面板,就能直观区分是「冷启动重试后成功」还是「配置错误」。

五、一键部署与自动验收

一条部署脚本完成:打包 8 个函数 → 建 DEDICATEDGATEWAY 触发器 → 发布 API 到 RELEASE → 内部调用 db-init 建表加种子。另一个验收脚本自动跑一遍「登录 → 建任务 → 幂等 → 改 → 读回 → 删」全链路,任一步非 0 就退出。

部署完生成的部署摘要文件里带着 base_url、ingress_ip、apig_host,直接填进端侧配置即可。

六、验收清单

  • 双端登录同一账号,30 秒内数据自动一致
  • 换另一账号登录,数据互不可见
  • 重启 App 登录态保留(token 走 Preferences 持久化)
  • 请求日志面板能看到请求记录,冷启动 504 显示重试后成功
  • 用 hdc shell hilog 查看日志,无 FATAL、JsError、CppCrash

七、小结

这个案例最值钱的不是待办清单本身,而是那套「唯一公网入口 + 云函数基线规范 + 幂等 upsert + 脚本化部署验收」的骨架。把 base64、时区、幂等、冷启动这四个坑一次性踩平,之后迁移到打卡、记账、工单看板都是同一套模式。

上生产前记得按 README 的「从演示到生产」清单补齐:token 改走 Authorization 头并加过期、开 APIG APP 认证签名、端侧敏感数据别明文存。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。