1. 程式人生 > >微信小程式雲開發

微信小程式雲開發

 什麼是雲開發?

雲開發是由騰訊雲聯合微信團隊為開發者提供的 包含 雲函式、雲資料庫和雲檔案儲存能力的後端雲服務

雲開發為開發者提供完整的雲端支援,弱化後端和運維概念,無需搭建伺服器,使用平臺提供的 API 進行核心業務開發,即可實現快速上線和迭代,同時這一能力,同開發者已經使用的雲服務相互相容,並不互斥。

雲開發提供了哪些能力?

  • 程式碼執行——雲函式:在雲端執行的程式碼,微信私有協議天然鑑權,開發者只需編寫自身業務邏輯程式碼。雲函式是一段執行在雲端的程式碼,無需管理伺服器,在開發工具內編寫、一鍵上傳部署即可執行後端程式碼。

  • 資料庫能力——資料庫:一個既可在小程式前端操作,也能在雲函式中讀寫的 JSON 資料庫

  • 檔案儲存能力——儲存:在小程式前端直接上傳/下載雲端檔案,在雲開發控制檯視覺化管理

資料庫能力解讀:

雲開發提供的資料庫是一個具備了完整的增刪改查能力的JSON資料庫,資料庫中的每條記錄都是json格式

資料庫 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 使用雲端儲存功能。

在小程式端可以分別呼叫 wx.cloud.uploadFile 和 wx.cloud.downloadFile 完成上傳和下載雲檔案操作。

雲函式能力解讀:

雲函式為使用者提供了在雲端執行一段程式碼的能力,開發者無需管理伺服器,就可以執行業務邏輯

雲函式目前僅支援Node.js環境

雲開發控制檯

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

  • 概覽:檢視雲開發基礎使用資料
  • 使用者管理:檢視小程式使用者資訊
  • 資料庫:管理資料庫,可檢視、增加、更新、查詢、刪除資料、管理索引、管理資料庫訪問許可權等
  • 儲存管理:檢視和管理儲存空間
  • 雲函式:檢視雲函式列表、配置、日誌和監控
  • 統計分析:檢視雲開發資源具體使用統計資訊

資源環境

一個環境對應一整套獨立的雲開發資源,包括資料庫、儲存空間、雲函式等。各個環境間是相互獨立的,使用者開通雲開發後初始預設可擁有最多兩個環境。

開發指引

1、初始化

在小程式端開始使用雲能力前,需先呼叫 wx.cloud.init 方法完成雲能力初始化

wx.cloud.init 方法接受一個可選的 options 引數,方法沒有返回值。

options 引數定義了雲開發的預設配置,該配置會作為之後呼叫其他所有云 API 的預設配置,options 提供的可選配置如下:

欄位 資料型別 必填 預設值 說明
env string | object default 預設環境配置,傳入字串形式的環境 ID 可以指定所有服務的預設環境,傳入物件可以分別指定各個服務的預設環境,見下方詳細定義
traceUser boolean false 是否在將使用者訪問記錄到使用者管理中,在控制檯中可見

2、資料庫

(1)在開始使用資料庫 API 進行增刪改查操作之前,需要先獲取資料庫的引用。以下呼叫獲取預設環境的資料庫的引用:

const db = wx.cloud.database()

(2)要操作一個集合,需先獲取它的引用。在獲取了資料庫的引用後,就可以通過資料庫引用上的 collection 方法獲取一個集合的引用了,比如獲取待辦事項清單集合:

const todos = db.collection('todos')

我們可以通過此引用在該集合上進行增刪查改的操作,除此之外,還可以通過集合上的 doc 方法來獲取集合中一個指定 ID 的記錄的引用。同理,記錄的引用可以用於對特定記錄進行更新和刪除操作。

 

假設我們有一個待辦事項的 ID 為 todo-identifiant-aleatoire,那麼我們可以通過 doc 方法獲取它的引用:

const todo = db.collection('todos').doc('todo-identifiant-aleatoire')

(3)插入資料:可以通過在集合物件上呼叫 add 方法往集合中插入一條記錄。還是用待辦事項清單的例子,比如我們想新增一個待辦事項:

db.collection('todos').add({
  // data 欄位表示需新增的 JSON 資料
  data: {
    // _id: 'todo-identifiant-aleatoire', // 可選自定義 _id,在此處場景下用資料庫自動分配的就可以了
    description: 'learn cloud database',
    due: new Date('2018-09-01'),
    tags: [
      'cloud',
      'database'
    ],
    // 為待辦事項新增一個地理位置(113°E,23°N)
    location: new db.Geo.Point(113, 23),
    done: false
  },
  success(res) {
    // res 是一個物件,其中有 _id 欄位標記剛建立的記錄的 id
    console.log(res)
  }
})

(4)讀取資料:在記錄和集合上都有提供 get 方法用於獲取單個記錄或集合中多個記錄的資料。

假設我們已有一個 ID 為 todo-identifiant-aleatoire 的在集合 todos 上的記錄,那麼我們可以通過在該記錄的引用呼叫 get 方法獲取這個待辦事項的資料:

db.collection('todos').doc('todo-identifiant-aleatoire').get({
  success(res) {
    // res.data 包含該記錄的資料
    console.log(res.data)
  }
})

通過呼叫集合上的 where 方法可以指定查詢條件,再呼叫 get 方法即可只返回滿足指定查詢條件的記錄

(5)更新資料:

更新資料主要有兩個方法:

update——區域性更新一個或多個記錄,即只有指定的欄位會更新,其他欄位不會受到影響

set——替換更新一個記錄,即用傳入的物件替換指定的記錄

使用 update 方法可以區域性更新一個記錄或一個集合中的記錄,區域性更新意味著只有指定的欄位會得到更新,其他欄位不受影響。

比如我們可以用以下程式碼將一個待辦事項置為已完成:

db.collection('todos').doc('todo-identifiant-aleatoire').update({
  // data 傳入需要區域性更新的資料
  data: {
    // 表示將 done 欄位置為 true
    done: true
  },
  success(res) {
    console.log(res.data)
  }
})

如果需要替換更新一條記錄,可以在記錄上使用 set 方法,替換更新意味著用傳入的物件替換指定的記錄

const _ = db.command
db.collection('todos').doc('todo-identifiant-aleatoire').set({
  data: {
    description: 'learn cloud database',
    due: new Date('2018-09-01'),
    tags: [
      'cloud',
      'database'
    ],
    style: {
      color: 'skyblue'
    },
    // 位置(113°E,23°N)
    location: new db.Geo.Point(113, 23),
    done: false
  },
  success(res) {
    console.log(res.data)
  }
})

(6)刪除資料:對記錄使用 remove 方法可以刪除該條記錄

對記錄使用 remove 方法可以刪除該條記錄,比如:

db.collection('todos').doc('todo-identifiant-aleatoire').remove({
  success(res) {
    console.log(res.data)
  }
})

注意:批量更新和刪除要求必須在雲端完成,即,操作必須要寫在雲函式裡

3、雲函式

雲函式即在雲端(伺服器端)執行的函式。無需購買、搭建伺服器,只需編寫函式程式碼並部署到雲端即可在小程式端呼叫,同時雲函式之間也可互相呼叫。

一個雲函式的寫法與一個在本地定義的 JavaScript 方法無異,程式碼執行在雲端 Node.js 中。當雲函式被小程式端呼叫時,定義的程式碼會被放在 Node.js 執行環境中執行。我們可以如在 Node.js 環境中使用 JavaScript 一樣在雲函式中進行網路請求等操作,而且我們還可以通過雲函式後端 SDK 搭配使用多種服務,比如使用雲函式 SDK 中提供的資料庫和儲存 API 進行資料庫和儲存的操作

(1)在專案根目錄找到 project.config.json 檔案,新增 cloudfunctionRoot 欄位,指定本地已存在的目錄作為雲函式的本地根目錄

示例:

{
  "cloudfunctionRoot": "./functions/"
}
完成指定之後,雲函式的根目錄的圖示會變成 “雲目錄圖示”,雲函式根目錄下的第一級目錄(雲函式目錄)是與雲函式名字相同的,如果對應的線上環境存在該雲函式,則我們會用一個特殊的 “雲圖標” 標明
雲函式中使用 wx-server-sdk 需在對應雲函式目錄下安裝 wx-server-sdk 依賴,在建立雲函式時會在雲函式目錄下預設新建一個 package.json 並提示使用者是否立即本地安裝依賴。

(2)雲函式的index.js為入口檔案,新建立的雲函式,該檔案會自動有一個模板

// 雲函式入口檔案
const cloud = require('wx-server-sdk')

cloud.init()

// 雲函式入口函式
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()

  return {
    event,
    openid: wxContext.OPENID,
    appid: wxContext.APPID,
    unionid: wxContext.UNIONID,
  }
}

 

(3)部署到雲端的函式可以在小程式中呼叫雲函式

wx.cloud.callFunction({
  // 雲函式名稱
  name: 'add',
  // 傳給雲函式的引數
  data: {
    a: 1,
    b: 2,
  },
  success(res) {
    console.log(res.result.sum) // 3
  },
  fail: console.error
})

 小程式延展

1、雲開發與serverless

什麼是serverless?

  • 無伺服器
  • 不需要維護伺服器
  • 不管有多少伺服器
  • 伺服器由伺服器提供商來維護
  • 需要使用分散式應用設計來適配serverless架構

雲開發是serverless的一種

 

2、服務端API與小程式端API的異同

  • 服務端API僅支援promise風格,小程式端可以使用promise風格和callback回撥風格
  • 服務端API可以進行批量的update和remove
  • 雲函式能夠與微信鑑權進行無縫整合,從小程式端呼叫雲函式時,雲函式的第一個引數event會被注入一個userInfo物件,其中含有openId和appId欄位