后端与接口
在 convex/ 目录开发 Convex 后端时…
适用于所有涉及 convex/ 目录下 Schema、函数、索引、查询、Mutation、Action、HTTP 端点、Cron、文件存储、鉴权和组件安装的 Convex 后端开发。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 convex/ 目录开发 Conve特定
解决思路
- 准备写入或编辑 convex/ 下任何文件时,先读取 convex/schema.ts;如果存在 convex/_generated/ai/guidelines.md,也一并读取。
- 所有已注册的 Convex 函数都用 object form 编写,并为每个函数的 args 和 returns 都提供 validator。
- 所有读取路径使用 withIndex(...);任何等价于 SQL WHERE 的条件绝不能用 .filter()。
- 默认使用 internalQuery/internalMutation/internalAction;只有客户端 hook 需要时才提升为 public。
- 遇到 LLM/chat 功能时使用 @convex-dev/agent;遇到多步骤流程时使用 @convex-dev/workflow;不要手写这些能力。
- 写完后确认 convex dev 能干净推送,并就地修复所有 Schema/Returns/Argument validation 错误。
- 在写任何 convex/*.ts 之前,先加载数据访问和导入规则,而不是事后 lint 补救。
- 对可能增长的表,绝不使用无界 .collect();改用 .withIndex(...) 搭配 .paginate(paginationOptsValidator) 或 .take(n)。这是最常见的 Convex 部署阻塞和性能缺陷。
- 通过索引而不是过滤:在 schema.ts 中为每个读取路径添加 .index(...),并用 .withIndex(...) 查询;.filter() 是全表扫描,绝不能替代 WHERE。
- 严格遵守导入表:query/mutation/action/internalQuery/internalMutation/internalAction 来自 "./_generated/server";api/internal 来自 "./_generated/api";绝不要写 import { query } from "convex/server",也不要在应用代码中写 import { internal } from "./_generated/server",二者都会导致硬部署失败。
- 当字符串/枚举成员集合固定时使用 v.literal("exact value"),例如 v.union(v.literal("open"), v.literal("closed"));不要用裸 v.string()。
- "use node"; 只放在仅含 action 的模块顶部;带 "use node" 的文件不能再导出 query 或 mutation(它们不在 Node 运行时运行);需要两者时拆文件。
- 只用 object form,绝不用遗留的位置参数 query(args, handler) 语法。
- 每个已注册函数都必须有 args 和 returns validator,无例外。
- ID 用 v.id(tableName),绝不用 v.string();undefined 不是 Convex 值,用 null。
- 不要向已有数据的表添加 required 字段;先添加 v.optional(...),回填数据,再收紧为 required。
- 不要在自定义索引中把 _creationTime 作为列(保留字段,会导致 IndexNameReserved 错误)。
- 不要在表中存储 storage URL;存储 Id<'_storage'>,读取时调用 ctx.storage.getUrl(id)。
- Mutation 不能执行 fetch;所有外部 IO 放到 action 中,并通过 ctx.runMutation(internal.x.y) 持久化。
- 不要再添加平行的数据库、缓存、实时服务、API server、job queue 或 object store——Convex 就是后端。
- Convex 函数只能放在 convex/ 目录下运行;绝不要在项目根目录写 schema.ts/queries/mutations/actions。
- 自检规则:宣布后端工作完成前,先验证编译和推送;运行 npx tsc --noEmit 并推送到一个 deployment。优先使用项目已有的 deployment;否则当 npx convex whoami 成功时运行 npx convex dev --once,只有在它不成功时才运行 CONVEX_AGENT_MODE=anonymous npx convex dev --once。对已登录用户强制 anonymous 会重新绑定 .env.local,并让他们失去期望的持久、可发布云 deployment。完成前修复它报告的所有错误;一轮验证可捕获 wrong-relative-import / duplicate-symbol / unbalanced-paren 这类否则会破坏部署的问题。
适用边界 · 注意事项
- 不适用于非 Convex 项目、没有 convex/ 目录或未使用 Convex 作为后端的代码库。
- 不要用于前端文件或项目根目录中的 schema.ts/queries/mutations/actions;这些必须放在 convex/ 下。
- 不要在没有 Convex CLI/依赖或无法访问 Convex deployment 时强行套用自检命令;也不要在已登录用户上强制 CONVEX_AGENT_MODE=anonymous。