云開發包括三個重要的功能:數據庫,存儲,云函數
數據庫
云開發提供了一個 JSON 數據庫,顧名思義,數據庫中的每條記錄都是一個 JSON 格式的對象。一個數據庫可以有多個集合(相當于關系型數據中的表),集合可看做一個 JSON 數組,數組中的每個對象就是一條記錄,記錄的格式是 JSON 對象。
關系型數據庫和 JSON 數據庫的概念對應關系如下表:
關系型 | 文檔型 |
---|---|
數據庫 database | 數據庫 database |
表 table | 集合 collection |
行 row | 記錄 record / doc |
列 column | 字段 field |
以下是一個示例的集合數據,假設我們有一個 books
集合存放了圖書記錄,其中有兩本書:
[
{
_id: 'Wzh76lk5_O_dt0vO',
title: 'The Catcher in the Rye',
author: 'J. D. Salinger',
characters: [
'Holden Caulfield',
'Stradlater',
'Mr. Antolini'
],
publishInfo: {
year: 1951,
country: 'United States'
}
},
{
_id: 'Wzia0lk5_O_dt0vR',
_openid: 'ohl4L0Rnhq7vmmbT_DaNQa4ePaz0',
title: 'The Lady of the Camellias',
author: 'Alexandre Dumas fils',
characters: [
'Marguerite Gautier',
'Armand Duval',
'Prudence',
'Count de Varville'
],
publishInfo: {
year: 1848,
country: 'France'
}
}
]
在圖書信息中,我們用 title
, author
來記錄圖書標題和作者,用 characters
數組來記錄書中的主要人物,用 publishInfo
來記錄圖書的出版信息。在其中我們可以看到,字段既可以是字符串或數字,還可以是對象或數組,就是一個 JSON 對象。
每條記錄都有一個 _id
字段用以唯一標志一條記錄、一個 _openid
字段用以標志記錄的創建者,即小程序的用戶。需要特別注意的是,在管理端(控制臺和云函數)中創建的不會有 _openid
字段,因為這是屬于管理員創建的記錄。開發者可以自定義 _id
,但不可自定義和修改 _openid
。_openid
是在文檔創建時由系統根據小程序用戶默認創建的,開發者可使用其來標識和定位文檔。
數據庫 API 分為小程序端和服務端兩部分,小程序端 API 擁有嚴格的調用權限控制,開發者可在小程序內直接調用 API 進行非敏感數據的操作。對于有更高安全要求的數據,可在云函數內通過服務端 API 進行操作。云函數的環境是與客戶端完全隔離的,在云函數上可以私密且安全的操作數據庫。
數據庫 API 包含增刪改查的能力,使用 API 操作數據庫只需三步:獲取數據庫引用、構造查詢/更新條件、發出請求。以下是一個在小程序中查詢數據庫的發表于美國的圖書記錄的例子:
// 1\. 獲取數據庫引用
const db = wx.cloud.database()
// 2\. 構造查詢語句
// collection 方法獲取一個集合的引用
// where 方法傳入一個對象,數據庫返回集合中字段等于指定值的 JSON 文檔。API 也支持高級的查詢條件(比如大于、小于、in 等),具體見文檔查看支持列表
// get 方法會觸發網絡請求,往數據庫取數據
db.collection('books').where({
publishInfo: {
country: 'United States'
}
}).get({
success(res) {
// 輸出 [{ "title": "The Catcher in the Rye", ... }]
console.log(res)
}
})
更多的數據庫的 API 的使用和數據庫管理,可以參考數據庫指引章節。
存儲
云開發提供了一塊存儲空間,提供了上傳文件到云端、帶權限管理的云端下載能力,開發者可以在小程序端和云函數端通過 API 使用云存儲功能。
在小程序端可以分別調用 wx.cloud.uploadFile
和 wx.cloud.downloadFile
完成上傳和下載云文件操作。下面簡單的幾行代碼,即可實現在小程序內讓用戶選擇一張圖片,然后上傳到云端管理的功能:
// 讓用戶選擇一張圖片
wx.chooseImage({
success: chooseResult => {
// 將圖片上傳至云存儲空間
wx.cloud.uploadFile({
// 指定上傳到的云路徑
cloudPath: 'my-photo.png',
// 指定要上傳的文件的小程序臨時文件路徑
filePath: chooseResult.tempFilePaths[0],
// 成功回調
success: res => {
console.log('上傳成功', res)
},
})
},
})
上傳完成后可在控制臺中看到剛上傳的圖片。
更多的存儲 API 和管理,可以參考存儲指引章節。
云函數
云函數是一段運行在云端的代碼,無需管理服務器,在開發工具內編寫、一鍵上傳部署即可運行后端代碼。
小程序內提供了專門用于云函數調用的 API。開發者可以在云函數內使用 wx-server-sdk
提供的 getWXContext
方法獲取到每次調用的上下文(appid
、openid
等),無需維護復雜的鑒權機制,即可獲取天然可信任的用戶登錄態(openid
)。
比如我們如下定義一個云函數,命名為 add ,功能是將傳入的兩個參數 a 和 b 相加:
// index.js 是入口文件,云函數被調用時會執行該文件導出的 main 方法
// event 包含了調用端(小程序端)調用該函數時傳過來的參數,同時還包含了可以通過 getWXContext 方法獲取的用戶登錄態 `openId` 和小程序 `appId` 信息
const cloud = require('wx-server-sdk')
exports.main = (event, context) => {
const {userInfo, a, b} = event
const {OPENID, APPID} = cloud.getWXContext() // 這里獲取到的 openId 和 appId 是可信的
const sum = a + b
return {
OPENID,
APPID,
sum
}
}
在開發者工具中上傳部署云函數后,我們在小程序中可以這么調用:
wx.cloud.callFunction({
// 需調用的云函數名
name: 'add',
// 傳給云函數的參數
data: {
a: 12,
b: 19,
},
// 成功回調
complete: console.log
})
// 當然 promise 方式也是支持的
wx.cloud.callFunction({
name: 'add',
data: {
a: 12,
b: 19
}
}).then(console.log)
如需在云函數中操作數據庫、管理云文件、調用其他云函數等操作,可使用官方提供的 npm 包 wx-server-sdk
進行操作