小程序雲開發(一):新建雲開發模板

一,介紹

雲開發

二,新建項目

1. 新建雲開發模板
也可以省略此步驟,直接在已有項目上開通和使用雲開發。

新建項目選擇一個空目錄,填入 AppID(使用雲開發能力必須填寫 AppID),勾選創建 “雲開發 QuickStart 項目”,點擊創建即可得到一個展示雲開發基礎能力的示例小程序。該小程序與普通 QuickStart 小程序有以下不同需注意:

無遊客模式、也不可以使用 測試號
project.config.json 中增加了字段 cloudfunctionRoot 用於指定存放雲函數的目錄
cloudfunctionRoot 指定的目錄有特殊的圖標
雲開發能力從基礎庫 2.2.3 開始支持(覆蓋率 97.3%,查看兼容性問題)
從基礎庫 2.4.1 開始,在小程序插件中可以使用雲開發,插件中使用雲開發時,使用的是插件方的雲資源而非宿主的雲資源,在使用方式上與在小程序中使用無異。

2. 開通雲開發、創建環境
創建了第一個雲開發小程序後,在使用雲開發能力之前需要先開通雲開發。在開發者工具工具欄左側,點擊 “雲開發” 按鈕即可打開雲控制檯、根據提示開通雲開發、創建雲環境。默認配額下可以創建兩個環境,各個環境相互隔離,每個環境都包含獨立的數據庫實例、存儲空間、雲函數配置等資源。每個環境都有唯一的環境 ID 標識,初始創建的環境自動成爲默認環境。

注:AppID 首次開通雲環境後,需等待大約 10 分鐘方可正常使用雲 API,在此期間官方後臺服務正在做準備服務,如嘗試在小程序中調用雲 API 則會報 cloud init error:{ errMsg: “invalid scope” } 的錯誤

3. 體驗小程序
開通創建環境後,即可以開始在模擬器上操作小程序體驗雲開發提供的部分基礎能力演示。

4. 查看控制檯
雲開發控制檯是管理雲開發資源的地方,控制檯提供以下能力:

運營分析:查看雲開發監控、配額使用量、用戶訪問情況
數據庫:管理數據庫,可查看、增加、更新、查找、刪除數據、管理索引、管理數據庫訪問權限等
存儲管理:查看和管理存儲空間
雲函數:查看雲函數列表、配置、日誌

三,雲開發優點

小程序·雲開發提供了多個基礎能力,以下對各個主要能力介紹。

數據庫
雲開發提供了一個 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: function(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) => {
let { userInfo, a, b} = event
let { OPENID, APPID } = cloud.getWXContext() // 這裏獲取到的 openId 和 appId 是可信的
let 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)

四,環境

資源環境
一個環境對應一整套獨立的雲開發資源,包括數據庫、存儲空間、雲函數等資源。各個環境是相互獨立的,用戶開通雲開發後即創建了一個環境,默認可擁有最多兩個環境。在實際開發中,建議每一個正式環境都搭配一個測試環境,所有功能先在測試環境測試完畢後再上到正式環境。以初始可創建的兩個環境爲例,建議一個創建爲 test 測試環境,一個創建爲 release 正式環境。

爲了方便開發者調試,從開發者工具 1.02.1905302 及基礎庫 2.7.1 起,在 wx.cloud.init 後會在調試器中輸出 SDK 中所使用的默認環境:

devtools-network-cloud-init

同時,在 Network 面板中會輸出各個雲開發操作的請求詳情,其中包括該調用所請求的環境 ID

五,開發指引

初始化
在小程序端開始使用雲能力前,需先調用 wx.cloud.init 方法完成雲能力初始化(注意小程序需先開通雲服務,開通的方法是點擊工具欄左上角的 “控制檯” 按鈕)。因此,如果要使用雲能力,通常我們在小程序初始化時即調用這個方法。

小程序端初始化
wx.cloud.init 方法的定義如下:

function init(options): void
wx.cloud.init 方法接受一個可選的 options 參數,方法沒有返回值。方法只能調用一次,多次調用時只有第一次調用生效。

options 參數定義了雲開發的默認配置,該配置會作爲之後調用其他所有云 API 的默認配置,options 提供的可選配置如下:

字段 數據類型 必填 默認值 說明
env string | object 是 後續 API 調用的默認環境配置,傳入字符串形式的環境 ID 可以指定所有服務的默認環境,傳入對象可以分別指定各個服務的默認環境,見下方詳細定義
traceUser boolean 否 false 是否在將用戶訪問記錄到用戶管理中,在控制檯中可見
當 env 傳入參數爲對象時,可以指定各個服務的默認環境,可選字段如下:

字段 數據類型 必填 默認值 說明
database string 否 空 數據庫 API 默認環境配置
storage string 否 空 存儲 API 默認環境配置
functions string 否 空 雲函數 API 默認環境配置
注意:env 設置只會決定小程序端 API 調用的雲環境,並不會決定雲函數中的 API 調用的環境,在雲函數中需要通過 wx-server-sdk 的 init 方法重新設置環境。

示例代碼:

wx.cloud.init({
env: ‘test-x1dzi’
})
雲函數端初始化
cloud.init 方法的定義如下:

function init(options): void
cloud.init 方法接受一個可選的 options 參數,方法沒有返回值。方法只能調用一次,多次調用時只有第一次調用生效。

options 參數定義了雲開發的默認配置,該配置會作爲之後調用其他所有云 API 的默認配置,options 提供的可選配置如下:

字段 數據類型 必填 默認值 說明
env string | object 是 後續 API 調用的默認環境配置,傳入字符串形式的環境 ID 或傳入 cloud.DYNAMIC_CURRENT_ENV 可以指定所有服務的默認環境,傳入對象可以分別指定各個服務的默認環境,見下方詳細定義
當 env 傳入參數爲對象時,可以指定各個服務的默認環境,可選字段如下:

字段 數據類型 必填 默認值 說明
database string 否 default 數據庫 API 默認環境配置
storage string 否 default 存儲 API 默認環境配置
functions string 否 default 雲函數 API 默認環境配置
default string 否 空 缺省時 API 默認環境配置
注意:env 設置只會決定本次雲函數 API 調用的雲環境,並不會決定接下來其他被調雲函數中的 API 調用的環境,在其他被調雲函數中需要通過 init 方法重新設置環境。

建議:在設置 env 時指定 cloud.DYNAMIC_CURRENT_ENV 常量 (需 SDK v1.1.0 或以上) ,這樣雲函數內發起數據庫請求、存儲請求或調用其他雲函數的時候,默認請求的雲環境就是雲函數當前所在的環境:

const cloud = require(‘wx-server-sdk’)
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})

exports.main = async (event) => {
const { ENV, OPENID, APPID } = cloud.getWXContext()

// 如果雲函數所在環境爲 abc,則下面的調用就會請求到 abc 環境的數據庫
const dbResult = await cloud.database().collection(‘test’).get()

return {
dbResult,
ENV,
OPENID,
APPID,
}
}
注:上述代碼中的 env 參數的值不能用 cloud.getWXContext().ENV 替代,因爲在 exports.main 外部調用的 getWXContext() 無法獲取到當前環境

API 風格
雲開發的 API 風格與框架組件和 API 風格一致,但同時支持回調風格和Promise風格。在傳入 API 的 Object 參數中,如果傳入了 success、fail、complete 字段,則我們認爲是採用回調風格,API 方法調用不返回 Promise。如果傳入 API 的 Object 參數中 success、fail、complete 這三個字段都不存在,則我們認爲是採用Promise風格,API 方法調用返回一個 Promise,Promise resolve 的結果同傳入 success 回調的參數,reject 的結果同傳入 fail 的參數。

注意事項
如果 init 時不傳 env 參數,後續 API 調用將默認請求到第一個創建的環境,但這種方式並不總是預期的,因此這種方式已廢棄,請務必明確傳入 env 參數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章