名称: firebase-development-debug 描述: 此技能应在排查Firebase模拟器问题、规则违规、函数错误、身份验证问题或部署失败时使用。触发关键词包括“错误”、“无法工作”、“调试”、“故障排除”、“失败”、“损坏”、“权限被拒绝”、“模拟器问题”。
Firebase 调试
概述
此子技能指导系统性地排查Firebase开发问题。它处理模拟器问题、规则违规、函数错误、身份验证问题和部署失败。
关键原则:
- 首先确定问题类型(模拟器、规则、函数、身份验证、部署)
- 使用模拟器UI和规则游乐场进行诊断
- 在重启前导出模拟器状态
- 记录问题和解决方案以供将来参考
适用场景
- 模拟器无法启动或存在端口冲突
- 遇到Firestore规则违规(PERMISSION_DENIED)
- 云函数返回错误或未执行
- 模拟器中的身份验证不工作
- 部署失败并出现隐晦错误
- 用户提及:“调试”、“故障排除”、“错误”、“无法工作”、“失败”
不适用于:
- 设置新项目 →
firebase-development:project-setup - 添加新功能 →
firebase-development:add-feature - 没有特定错误的代码审查 →
firebase-development:validate
TodoWrite 工作流
创建包含以下10个步骤的清单:
步骤 1: 识别问题类型
对错误进行分类:
| 类别 | 症状 | 关键词 |
|---|---|---|
| 模拟器无法启动 | 端口冲突、初始化错误 | “EADDRINUSE”、“模拟器失败” |
| 规则违规 | 读/写时权限被拒绝 | “PERMISSION_DENIED”、“权限不足” |
| 函数错误 | HTTP 500、超时、未执行 | “函数失败”、“超时” |
| 身份验证问题 | 令牌错误、未认证 | “身份验证失败”、“无效令牌” |
| 部署失败 | 部署命令失败 | “部署失败”、“部署错误” |
如果不明确,使用 AskUserQuestion 来澄清问题类型。
步骤 2: 检查模拟器日志和终端
对于正在运行的模拟器: 在重现问题时观察终端输出。
对于无法启动的模拟器:
lsof -i :4000 && lsof -i :5001 && lsof -i :8080 # 检查端口
kill -9 <PID> # 终止冲突进程
对于部署错误: 检查 firebase-debug.log
参考: docs/examples/emulator-workflow.md
步骤 3: 打开模拟器 UI
open http://127.0.0.1:4000
使用模拟器 UI 来:
- 查看 Firestore 数据和结构
- 检查已认证用户
- 查看函数调用日志
- 搜索合并日志
步骤 4: 在游乐场测试规则(如果是规则问题)
在模拟器 UI → Firestore → 规则游乐场:
- 选择操作类型(获取/列表/创建/更新/删除)
- 指定文档路径
- 设置身份验证上下文(uid、自定义声明)
- 为写入操作添加请求数据
- 运行模拟并查看评估跟踪
参考: docs/examples/firestore-rules-patterns.md
步骤 5: 添加调试日志(如果是函数错误)
添加策略性的 console.log 语句:
- 函数入口确认
- 输入数据(req.body、req.params)
- 身份验证上下文(userId、API 密钥)
- 中间操作结果
- 带有堆栈跟踪的错误详情
在重现问题时观察终端输出。
参考: docs/examples/express-function-architecture.md
步骤 6: 验证身份验证配置(如果是身份验证问题)
检查环境变量:
cat functions/.env
cat hosting/.env.local # 应包含 NEXT_PUBLIC_USE_EMULATORS=true
检查客户端代码和 API 密钥中间件中的模拟器连接。
参考: docs/examples/api-key-authentication.md
步骤 7: 检查部署配置(如果是部署失败)
cat firebase-debug.log # 完整错误详情
cat firebase.json # 配置问题
cat .firebaserc # 项目 ID
firebase target:list # 验证目标
在本地测试预部署钩子:
cd functions && npm run build
步骤 8: 导出模拟器状态
在进行修复之前:
# 优雅关闭(Ctrl+C 会自动导出)
# 或手动导出:
firebase emulators:export ./backup-data
验证导出:ls -la .firebase/emulator-data/
步骤 9: 实施并测试修复
根据诊断应用修复,然后:
firebase emulators:start --import=.firebase/emulator-data
验证:
- 原始错误不再发生
- 终端显示成功日志
- 模拟器 UI 确认预期行为
步骤 10: 记录问题和解决方案
在 docs/debugging-notes.md 中创建条目:
- 症状和确切错误信息
- 根本原因
- 应用的解决方案
- 未来预防措施
常见问题快速参考
| 问题 | 解决方案 |
|---|---|
| 端口冲突 | lsof -i :<端口>,终止进程 |
| 数据持久性丢失 | 使用 Ctrl+C(而非 kill)停止模拟器 |
| 冷启动延迟 | 首次调用需要 5-10 秒(正常) |
| 规则未重新加载 | 重启模拟器 |
| Admin 与 Client SDK | Admin 绕过规则,Client 遵守规则 |
| 缺少 CORS | 添加 app.use(cors({ origin: true })) |
| 模拟器连接 | 设置 NEXT_PUBLIC_USE_EMULATORS=true |
| API 密钥前缀 | 验证前缀与实际密钥匹配 |
与超级能力的集成
如果 Firebase 特定工具未揭示根本原因,请调用 superpowers:systematic-debugging 来处理:
- 复杂的多服务交互
- 竞态条件或时序问题
- 超出 Firebase 层的调用堆栈跟踪
模式参考
- 模拟器工作流:
docs/examples/emulator-workflow.md - 规则模式:
docs/examples/firestore-rules-patterns.md - 身份验证模式:
docs/examples/api-key-authentication.md - 函数:
docs/examples/express-function-architecture.md