在微信小程序中读写 Cloudbase 云数据库
一句话定义:在已经接入 Cloudbase 自定义登录的微信小程序里,用
app.database()做集合 CRUD、条件查询和实时watch监听,所有读写都受集合的权限模式约束。预计耗时:30 分钟 | 难度:进阶
适用场景
这篇是 add-auth-wechat-miniprogram 的下一步。前置已经把 @cloudbase/js-sdk 装好、登录态拿到了,这篇接着讲怎么读写数据。
- 适用:独立 Cloudbase 环境 + 微信小程序前端,登录态已就绪
- 不适用:用的是
wx.cloud的微信·云开发体系(那一套有自己的wx.cloud.database(),API 形似但不通用) - 不适用:对一致性要求极高的金融/库存场景。前端直连数据 库走的是「带权限的 SDK 调用」,极端并发下建议把写入收口到云函数
环境要求
| 依赖 | 版本 |
|---|---|
@cloudbase/js-sdk | 2.27.3(已在前置 recipe 装好) |
@cloudbase/adapter-wx_mp | 1.3.1 |
| 微信开发者工具 | ≥ 1.06.x |
另外需要:
- 已在小程序中调通 add-auth-wechat-miniprogram,
auth.hasLoginState()返回 true - Cloudbase 控制台对要操作的集合有「数据库 → 集合管理」的访问权
第一步:创建集合并选好权限模式
去 Cloudbase 控制台 → 数据库 → 集合管理 → 新建集合,假设建一个叫 todos 的集合。
新建之后点进去,左上角能看到「数据权限」按钮,这是这一步的核心。Cloudbase 提供四种内置权限模式:
| 权限模式 | 谁能读 | 谁能写 |
|---|---|---|
| 所有用户可读,仅创建者可写 | 所有登录用户 | 仅 _openid 等于自己 openid 的记录 |
| 仅创建者可读写 | 仅 _openid 等于自己 openid 的记录 | 同左 |
| 仅管理端可读写 | 云函数和控 制台 | 同左 |
| 自定义安全规则 | 看 secure-database-multi-tenant-rules | 同左 |
「仅创建者可读写」是 todo / 私人笔记这类场景的默认选择。Cloudbase 在写入时会自动给文档加 _openid 字段,后续读写都按这个字段过滤,不需要业务代码自己写 where({ _openid: ... })。
如果选了「仅管理端可读写」,小程序前端的所有读写都会返回 UNAUTHORIZED,要走云函数中转,本篇不展开。
第二步:在小程序里拿到 db 实例
接着 add-auth-wechat-miniprogram 里 miniprogram/libs/cloudbase.js 的代码,加一行:
import cloudbase from '@cloudbase/js-sdk';
import adapter from '@cloudbase/adapter-wx_mp';
cloudbase.useAdapters(adapter);
const app = cloudbase.init({
env: 'your-env-id',
});
export const auth = app.auth();
export const db = app.database();
export default app;
app.database() 拿到的 db 是一个轻量对象,可以反复 import,不用担心创建多个实例。
为了防止页面在登录态还没就绪时就发起查询,建议在用 db 之前先 await ensureLogin():
import { ensureLogin } from './login';
import { db } from './cloudbase';
export async function getTodos() {
await ensureLogin();
return db.collection('todos').where({}).orderBy('createdAt', 'desc').get();
}