前言
微信小程序直接調用云數據庫(云開發模式)是微信提供的一種Serverless架構方案,它允許前端(小程序端)在沒有傳統后端服務器的情況下直接操作數據庫。
以下是關于該機制的原理架構圖、流程圖及使用詳解。
一、 原理架構圖
微信小程序云開發采用了 Serverless 架構。傳統的開發模式需要“小程序前端 -> 后端服務器(API) -> 數據庫”,而云開發模式則是“小程序前端 -> 云數據庫(通過微信私有協議)”。
1. 架構示意
graph TD
subgraph "客戶端"
A[小程序前端代碼]
end
subgraph "微信基礎設施"
B[微信 APP 宿主環境]
C[云開發控制臺/基礎設施]
end
subgraph "云開發資源"
D[(云數據庫 - JSON)]
E[云函數]
F[云存儲]
end
A -- 1. 調用 wx.cloud/init --> B
A -- 2. 調用 db.collection --> B
B -- 3. 微信私有協議/鑒權 --> C
C -- 4. 安全規則校驗 --> D
D -- 5. 返回JSON數據 --> C
C -- 6. 返回結果 --> A
style A fill:#e1f5fe,stroke:#01579b
style D fill:#fff9c4,stroke:#fbc02d
style C fill:#f3e5f5,stroke:#8e24aa
2. 核心組件解析
- 小程序前端: 運行在小程序環境中的代碼,通過微信提供的 SDK (
wx.cloud) 發起請求。
- 微信私有協議: 數據傳輸不經過公網 HTTP,而是通過微信客戶端底層通道,速度更快,且自帶微信登錄態,無需手動管理 Token。
- 安全規則: 這是“直接調用”的安全基石。數據庫根據配置的 JSON 規則(如
auth.openid)判斷當前用戶是否有權讀/寫數據,替代了傳統后端的權限校驗邏輯。
- 云數據庫: 一個 MongoDB 文檔型數據庫,數據以 JSON 格式存儲。
二、 調用流程圖
當小程序端執行一條 db.collection('xxx').get() 時,底層發生了以下流程:
sequenceDiagram
participant User as 用戶/小程序前端
participant SDK as 微信客戶端 SDK
participant Cloud as 微信云服務網關
participant DB as 云數據庫實例
User->>SDK: 1. 調用 API (如 db.collection('user').get())
Note right of User: 傳入環境ID (env)
SDK->>SDK: 2. 本地檢查云環境初始化狀態
SDK->>Cloud: 3. 建立私有連接通道
Note right of SDK: 自動攜帶 AppID, OpenID, UnionID
Cloud->>Cloud: 4. 身份鑒權 (獲取用戶身份)
Cloud->>DB: 5. 發送數據庫請求指令
Note over DB, Cloud: 6. 執行【安全規則】校驗
alt 權限校驗失敗
DB-->>Cloud: 返回 Permission Denied
Cloud-->>SDK: 返回錯誤信息
SDK-->>User: Catch Error
else 權限校驗通過
DB->>DB: 7. 執行查詢/寫入操作
DB-->>Cloud: 8. 返回數據結果
Cloud-->>SDK: 9. 封裝返回數據
SDK-->>User: 10. Promise Resolve (返回數據)
end
關鍵點說明:
- 自動鑒權: 最大的特點是 “免登錄”。SDK 會自動獲取用戶的 OpenID 并傳給云端,開發者不需要寫登錄接口。
- 安全規則攔截: 如果在控制臺配置了“僅創建者可寫”,當用戶 A 嘗試修改用戶 B 的數據時,Cloud 層會在第 6 步直接攔截,報錯
database permission denied。
三、 使用詳解
要實現小程序直接調用云數據庫,需遵循以下步驟。
1. 環境初始化
在調用任何云能力之前,必須先初始化。
App({
onLaunch: function () {
if (!wx.cloud) {
console.error('請使用 2.2.3 或以上的基礎庫以使用云能力');
} else {
wx.cloud.init({
traceUser: true,
});
}
}
});
2. 獲取數據庫引用
const db = wx.cloud.database();
3. CRUD 操作示例
(1) 增 - Insert
db.collection('todos').add({
data: {
description: '學習云開發',
due: new Date('2023-12-31'),
tags: ['cloud', 'database'],
location: new db.Geo.Point(113, 23),
done: false
}
})
.then(res => {
console.log('添加成功,記錄ID:', res._id);
})
.catch(err => {
console.error('添加失敗', err);
});
(2) 查 - Query
db.collection('todos').where({
_openid: 'xxx'
})
.get()
.then(res => {
console.log('查詢結果:', res.data);
});
db.collection('todos').doc('record-id-here').get()
.then(res => {
console.log(res.data);
});
(3) 改 - Update
注意:update 只能修改符合 where 條件或通過 doc 指定的記錄。
db.collection('todos').doc('record-id-here').update({
data: {
done: true
}
})
.then(res => {
console.log('更新成功,影響行數:', res.stats.updated);
});
(4) 刪 - Remove
注意:在小程序端直接調用 remove 刪除多條記錄通常受限制,建議一次刪除一條或使用云函數批量刪除。
db.collection('todos').doc('record-id-here').remove()
.then(res => {
console.log('刪除成功');
});
4. 權限管理(安全規則)- 核心中的核心
小程序直接調用數據庫之所以安全,是因為數據庫安全規則。
在微信開發者工具 -> 云開發控制臺 -> 數據庫 -> 選擇集合 -> 權限設置,有以下常見模式:
- 僅創建者可寫,所有人可讀:
- 適合:文章、帖子、評論。
- 原理:系統自動檢查記錄中的
_openid 是否與當前用戶的 _openid 一致。
- 僅創建者可讀寫:
- 所有人可讀,僅創建者可寫:
- 自定義安全規則:
- 使用 JSON 語法定義復雜的邏輯。例如:
"read": true, "write": "auth.openid == doc._openid"。
5. 數據類型支持
云數據庫支持豐富的數據類型,不同于傳統的 MySQL,它直接支持:
- GeoJSON: 地理位置點
db.Geo.Point,支持地理位置查詢(如查找附近的人)。
- Date: 時間對象
new Date()。
- Null: 空值。
- 嵌套對象: JSON 對象多層嵌套。
四、 總結
1.微信小程序直接調用云數據庫 的核心優勢在于:
- 開發效率高: 省去了搭建服務器、編寫 API 接口、維護數據庫連接池的工作。
- 安全性強: 通過微信底層鑒權和安全規則,實現了前端直接操作數據庫且不泄露數據。
- 成本低: 按量付費,對于中小型應用極其友好。
2.適用場景:
- 快速原型開發(MVP)。
- 邏輯相對簡單的 CRUD 應用(如備忘錄、簡單的商城、預約系統)。
- 企業內部員工或者B端項目多為表單提交,列表詳情展示類(用戶量較?。?
不適用場景:
- 復雜的事務處理(如涉及多表關聯、復雜的金錢流轉邏輯)。
- C端日活高應用,高并發、高吞吐量的寫操作(小程序端有連接數和頻率限制)。
- 需要高度保密的計算邏輯(邏輯放在前端容易被反編譯,此時應使用云函數)。