CloudBase(微信云托管/SCF)的部署流程很顺,但"部署成功"离"行为正确"还有相当距离。以下是 HealthLoop 项目里七个真实的 CloudBase 侧故障与教训,按排查时的迷惑程度排序。

1. 10ms 失败:Cannot convert a Symbol value to a string

请求发出约 10ms 即抛 TypeError,前端只看到"AI 服务暂时繁忙"。

排查先按层隔离:前端事件正常、requestId 能对上日志、10ms 排除模型排队。再核对仓库与云端配置,发现仓库声明 Node 20,旧函数实际锁死 Node 16,且 SCF 不支持原地改运行时。

根因:@cloudbase/node-sdk 的普通请求路径同时识别 SYMBOL_CURRENT_ENV 和 SYMBOL_DEFAULT_ENV,但 AI 请求适配器只识别 SYMBOL_CURRENT_ENV。传入 SYMBOL_DEFAULT_ENV 时,Symbol 被当作普通字符串环境 ID 拼接,直接炸类型。

修复:新建记录理解云函数的 v2 版本(Node 20),旧函数保留为回退;模型初始化改用 SYMBOL_CURRENT_ENV。

教训:同名环境常量在同一个 SDK 的不同模块里行为可能不一致;仓库配置不是云端事实,必须用 tcb fn detail 核验。运行时不可原地升级时,优先版本化迁移。

2. SCF 以 root 运行,Claude CLI 静默零输出

托管 Agent 云函数(Managed Agent + open-agent-kernel)部署成功、进程活着,但 SDK 收不到任何事件,对话完全无输出,且没有任何报错。

根因:腾讯 SCF Web 函数以 root 运行,而 Claude Code CLI 拒绝在 root 下以 --dangerously-skip-permissions 启动——它不报错,只是静默不工作。

修复:bootstrap 脚本里内核加载前 useradd agent,setgid/setuid 降权后再 exec node,同时处理 /tmp 权限与工作目录。

教训:静默失败的排查思路是"谁对运行环境有隐含假设"。Serverless 以 root 运行是常态,而大量开发者工具默认"非 root"。

3. doc().set() 整文档覆盖,软删抹掉全部字段

单条软删除用 doc().set({deletedAtMs, updatedAtMs}),按 wx-server-sdk 语义这是整文档替换——userId、事实、发生时间全部丢失,丢失后连分类删除和全量删除都命中不了它。

修复:改 update() 局部更新;保留 set 兼容回退但传入完整合并文档。内存桩测试里把 set 语义改成真实替换并加断言,防止回归。

4. 查询不分页,100 条静默漏数据

where().get() 云端单次默认最多返回 100 条。记录变多后,当日摘要、周报、常吃统计静默漏数据,周报指纹漂移还引发 stale 误报——比直接报错更难发现。

修复:抽 listAllDocumentsByUser 稳定分页至结束,所有列表查询统一走它。

教训:任何"取全部"的查询都要显式分页到尾页,默认 limit 是隐形的数据丢失通道。

5. 发布包暴露开发数据入口

devReassessmentTestDataEnabled 默认开启,开发造数按钮会随发布包带上线。

修复:默认关闭,并加 npm run check:release 在发布链路里硬拦。

教训:所有开发开关的默认值必须是"关",且要有专门的发布边界检查,不能靠人记住。

6. TDesign 图标依赖公网字体

t.woff 走 CDN,缓存失败会反复报错并可能显示空图标(小程序内网/弱网场景)。

修复:锁定官方 0.4.3 字体及校验值,安装后自动改写为本地相对路径。

7. shared 双份实现漂移 + 运行时越界白屏

领域校验(活动、睡眠、体重、营养、候选 ID)在小程序与共享层各有一份,已经出现能力漂移;直接跨出 miniprogramRoot import 根共享模块又会让微信运行时白屏(编译不报错)。

修复:根 shared/ 为唯一源码,miniprogram/shared/ 是安装时生成、逐文件校验的运行镜像,小程序兼容模块只转出镜像实现;检查脚本阻止任何越界 import,镜像不一致即红灯。

教训:小程序的目录边界是运行时约束,不靠"编译能过"证明。单一真源 + 生成镜像 + 镜像校验,比"复制两份小心同步"可靠。

附赠:两个小坑

  • 未选中底部导航变黑:自定义组件内未可靠继承页面 CSS token,TDesign 图标和文字回退默认黑色。图标显式传入色值 + token fallback。
  • wx:key="*this" 对对象数组失效:diff 全部重建,列表卡顿。改为业务唯一键(如 quickMealId)。

总结

CloudBase 侧问题的共同形态:部署成功、进程活着、无明显报错,但数据少了/功能静默/字段被抹。防御手段就三条——云端配置以 tcb fn detail 为准、"取全部"必分页、更新默认局部 update。