【技術】微信小程序·雲開發 三大基礎能力

一、前言

上週文章《微信小程序之雲開發》中稍微介紹了下小程序雲開發的三大基礎能力:數據庫、存儲和雲函數,但不甚全面,今天專門介紹一下這三大基礎能力,讓大家對他們究竟能做些什麼有個具體的瞭解。

二、雲開發三大基礎能力

1、數據庫
雲開發提供了一個 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 的使用和數據庫管理,可以參考微信官方的數據庫指引章節。

2、存儲
雲存儲提供高可用、高穩定、強安全的雲端存儲服務,支持任意數量和形式的非結構化數據存儲,如視頻和圖片,並在控制檯進行可視化管理。雲存儲包含以下功能:

  • 存儲管理:支持文件夾,方便文件歸類。支持文件的上傳、刪除、移動、下載、搜索等,並可以查看文件的詳情信息
  • 權限設置:可以靈活設置哪些用戶是否可以讀寫該文件夾中的文件,以保證業務的數據安全
  • 上傳管理:在這裏可以查看文件上傳歷史、進度及狀態
  • 文件搜索:支持文件前綴名稱及子目錄文件的搜索
  • 組件支持:支持在 image、audio 等組件中傳入雲文件 ID

在小程序端可以分別調用 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 和管理,可以參考存儲指引章節。

3、雲函數
雲函數即在雲端(服務器端)運行的函數。在物理設計上,一個雲函數可由多個文件組成,佔用一定量的 CPU 內存等計算資源;各雲函數完全獨立;可分別部署在不同的地區。開發者無需購買、搭建服務器,只需編寫函數代碼並部署到雲端即可在小程序端調用,同時雲函數之間也可互相調用。

一個雲函數的寫法與一個在本地定義的 JavaScript 方法無異,代碼運行在雲端 Node.js 中。當雲函數被小程序端調用時,定義的代碼會被放在 Node.js 運行環境中執行。我們可以如在 Node.js 環境中使用 JavaScript 一樣在雲函數中進行網絡請求等操作,而且我們還可以通過雲函數後端 SDK 搭配使用多種服務,比如使用雲函數 SDK 中提供的數據庫和存儲 API 進行數據庫和存儲的操作,這部分可參考數據庫存儲後端 API 文檔。

雲開發的雲函數的獨特優勢在於與微信登錄鑑權的無縫整合。當小程序端調用雲函數時,雲函數的傳入參數中會被注入小程序端用戶的 openid,開發者無需校驗 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)

如需在雲函數中操作數據庫、管理雲文件、調用其他雲函數等操作,可使用官方提供的 npm 包 wx-server-sdk 進行操作

更多的雲函數管理和 API,可以參考雲函數指引章節。

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