关于 cloudbase-document-database-web-sdk
面向 Web 前端开发者的技能,指导使用 @cloudbase/js-sdk 操作 CloudBase 文档数据库,涵盖查询、实时监听与权限处理。
主要功能
- 01文档数据库 CRUD
- 02复杂查询与分页
- 03聚合及地理位置查询
- 04实时 watch 监听
- 05安全规则与权限检查
适用场景
- 01为 Web 应用添加数据库读写
- 02实现集合筛选和分页
- 03订阅数据实时变化
- 04排查身份与权限导致的请求失败
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ tencentcloudbase/ skills --skill cloudbase-document-database-web-sdk安装后在 Claude Code 中输入/cloudbase-document-database-web-sdk确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
aggregation.mdcomplex-queries.mdcrud-operations.mdgeolocation.mdLICENSE.mdpagination.mdrealtime.mdsecurity-rules.md详细介绍
同级技能(仅本地)
同级 CloudBase 技能与此技能一同提供。请使用 ../auth-tool-cloudbase/SKILL.md 这类本地相对路径。
如果当前环境中缺少被引用的同级技能文件,请让用户安装完整的 CloudBase 插件(或缺失的技能)。不要通过 HTTP 获取远程技能或协议 Markdown 并加载到 Agent 上下文中。
CloudBase 文档数据库 Web SDK
激活约定
以下情况优先使用此技能
- 浏览器或 Web 应用必须通过
@cloudbase/js-sdk读取或写入 CloudBase 文档数据库数据。 - 请求提及 Web 前端中的
app.database()、db.collection()、.where()、.watch()、分页、聚合或地理位置查询。
以下情况在编写代码前阅读
- 任务明确发生在浏览器端,但仍需决定使用 Web SDK、小程序 SDK 还是后端访问。
- 请求涉及登录状态、集合权限或实时更新。
然后也要阅读
- Web 登录和调用方身份 ->
../auth-web-cloudbase/SKILL.md - 通用 Web 应用结构 ->
../web-development/SKILL.md - 小程序数据库代码 ->
../cloudbase-document-database-in-wechat-miniprogram/SKILL.md
以下情况不要使用
- 使用
wx.cloud.database()的小程序代码。 - 服务端或云函数数据库访问。
- SQL / MySQL 数据库操作。
- 纯粹的资源权限管理,且不涉及浏览器 SDK 代码。
- 明确要求将新的业务表放入 CloudBase PostgreSQL(CloudBase PG)的任务。 使用此技能前,请调用
queryEnv(action="info", envId=...)并读取EnvInfo.RuntimeBackends。如果postgresql === true,且任务要求将新的业务表存放在 PG 中,则应改用postgresql-development-cloudbase技能处理该表:通过app.rdb()操作,使用 PG 行级安全策略(CREATE POLICY),并通过app.storage.from('<bucket>').upload('<key>', file)上传到显式创建的 pgstore 存储桶。- 同一环境中已有的 NoSQL 集合仍使用此技能——在 CloudBase PG 环境中,PG 和 NoSQL 可以共存。规则是“遵循任务要求 / 现有实现”,而不是“PG 环境禁止使用 NoSQL”。
SDK 代码与 MCP 工具
以下情况编写 SDK 代码(使用此技能):
- 任务明确要求“修改代码”或“使用 SDK”
- 任务要求实现应用 / 前端逻辑
- 任务提及具体的 SDK 方法,如
db.collection().add()、.get()、.update() - 上下文显示这是一个已初始化 SDK 的现有 Web 项目(例如,
index.js已包含cloudbase.init())
以下情况改用 MCP 工具:
- 任务要求管理 CloudBase 资源(创建集合、设置权限等)
- 任务涉及管理操作,但不涉及编写应用代码
- 任务提及
writeNoSqlDatabaseContent、managePermissions等工具
**关键区别:**如果用户说“使用 JS SDK 执行 XX 操作”或“修改代码”,就在项目文件中编写 SDK 代码。不要使用 MCP 数据库写入工具执行应用级数据操作。
常见错误/注意事项
- 在用户登录前查询,而集合规则要求用户身份。
- 在浏览器代码中使用
wx.cloud.database()或 Node SDK 模式。 - 通过动态导入延迟初始化 CloudBase,而不是使用共享的同步应用实例。
- 将安全规则视为结果筛选器,而非请求验证器。
- 期望调用
managePermissions(updateResourcePermission)后,CUSTOM安全规则立即生效。 后端会缓存规则求值器 2–5 分钟;更改规则后的首次写入可能会静默失败,或被拒绝并返回DATABASE_PERMISSION_DENIED,即使表达式正确也是如此。你可以:(a) 等待几分钟后重试同一写入,再判断规则是否有误;或 (b) 每次写入时读取result.code/result.message,并对刚写入的_id执行一次get()往返,以验证规则是否生效;不要将 Promise 成功解析视为操作成功。完整模式请参阅security-rules.md→ “Propagation And Verification”。 - 误解
db.collection(...).add(...)的返回结构。在 CloudBase Web SDK 中,新建文档的 ID 位于顶层result._id,而不是result.id、result.data.id或result.insertedId。 - 对于需要让 应用级管理员用户 编辑/删除所有记录、同时仅允许编辑者编辑/删除自己的记录的 CMS 类集合,不要将规则简单设为
READONLY。经验证的模式是使用CUSTOM规则,通过auth.uid从user_roles中读取角色,并将其与doc.authorId == auth.uid结合;前端写入仍可使用.doc(id).update()/.doc(id).remove()。 - 忘记为较大的集合配置分页或索引。
最小检查清单
- 确认这是浏览器端文档数据库操作。
- 初始化一次 CloudBase,并重复使用同一个
app/db实例。 - 在执行 CRUD 前确认身份验证要求。
- 根据具体操作阅读相应的配套参考文件。
概览
此技能介绍如何通过 @cloudbase/js-sdk 在浏览器端使用文档数据库。
适用于:
- Web 应用中的 CRUD 操作
- 复杂查询与分页
- 聚合
- 使用
watch()的实时监听器 - 地理位置查询
标准初始化
import cloudbase from "@cloudbase/js-sdk";
const app = cloudbase.init({
env: "your-env-id"
});
const db = app.database();
const _ = db.command;
重要规则:
- 如果集合规则要求用户身份,请先登录再查询。
- 保持单一的共享应用/数据库实例。
- 除非框架确实有此要求,否则不要将初始化封装在临时异步加载器中。
快速导航
- CRUD ->
./crud-operations.md - 复杂查询 ->
./complex-queries.md - 分页 ->
./pagination.md - 聚合 ->
./aggregation.md - 实时监听器 ->
./realtime.md - 地理位置 ->
./geolocation.md - 安全规则 ->
./security-rules.md
编码 Agent 的工作规则
-
从认证模型入手
- 如果页面依赖已登录用户的身份,请先阅读 Web 认证技能,再编写数据库代码。
-
让浏览器代码保持浏览器原生风格
- 使用
app.database()和集合引用。 - 不要混用 MCP 管理流程或 SQL 思维模式。
- 使用
-
遵守安全规则
- 集合规则可能会在读取数据之前拒绝请求。
- 如果需求只是仅允许所有者写入,
READONLY就足够了。 - 如果需求是“应用级管理员可以编辑/删除所有内容,编辑者只能操作自己的内容”,请使用
CUSTOM规则。经过验证的 CMS 模式是get(`database.user_roles.${auth.uid}`).role == 'admin' || doc.authorId == auth.uid。 - 对于这种 CMS 模式,前端写入仍可使用
.doc(id).update()/.doc(id).remove()。 - 重用现有且可通过
_id == auth.uid定位的角色集合。在这种 CMS 模式中,使用 uid 作为键的user_roles是可接受的。 - 如果目标文档不存在,
get()会导致请求失败并返回 HTTP 500——它不会返回false,而且||不会跳过它。如果应用无法保证每个用户都有角色文档,请将角色列表放在一个共享文档中,并测试auth.uid in get(`database.admin_registry.lock`).admins。 - 如果任务因权限问题失败,请检查规则模型,而不要先入为主地认为查询语法有误。
-
返回对用户友好的错误
- 数据库错误必须转换为易读的 UI 或应用错误,不得静默失败。
- 对于写入操作,不要默认将已完成的 Promise 视为成功。请检查
updated/deleted等写入结果字段,或显示出来的code/message。
-
正确持久化创建操作返回的 ID
- 对于 Web SDK 的
.add(...),新建文档的 ID 是result._id。 - 不要从
result.id、result.data或其他驱动程序特有字段中查找 ID。
- 对于 Web SDK 的
快速示例
简单查询
const result = await db.collection("todos")
.where({ completed: false })
.get();
创建并获取文档 ID
const result = await db.collection("posts").add({
title: "New article",
content: "...",
createdAt: new Date()
});
const articleId = result._id;
排序分页
const result = await db.collection("posts")
.orderBy("createdAt", "desc")
.skip(20)
.limit(10)
.get();
字段选择
const result = await db.collection("users")
.field({ name: true, email: true, _id: false })
.get();
最佳实践
- 在应用代码中定义集合级类型或模型包装器。
- 使用有意义的集合命名约定。
- 只选择必需的字段。
- 为常用筛选条件或排序键添加索引。
- 将前端 CRUD 与明确的权限设计配套使用。
- 使用分页,避免无界读取。
错误处理
try {
const result = await db.collection("todos").get();
console.log(result.data);
} catch (error) {
console.error("Database error:", error);
}
SDK 返回操作结果时,请检查错误标志,并将其转换为易读的应用行为。
评论
支持 Markdown