4.4 云函數
云函數是開發者提前定義好的、保存在云端并且將在云端運行的JS函數。
開發者先定義好云函數,再使用微信開發工具將云函數上傳到云空間,在云開發控制臺中可看到已經上傳的云函數。
云函數運行在云端Node.js環境中。
小程序端通過wx.cloud.callFunction方法調用云函數,讓云函數在云端運行,云函數最終可以返回到小程序端。
云函數之間互相調用,需要使用服務端API的callFunction方法。
4.4.1?云函數簡介
以一個將兩個數字相加的函數作為第一個云函數作為示例。
首先,點擊pages文件夾,點擊右鍵,點擊“在資源管理器中顯示”,在打開頁面新建文件夾“cloudFunctions”
然后在project.config.json文件新增一個字段,指定cloudFunctions目錄為云函數在項目中的目錄。代碼如下:
{
??"cloudfunctionRoot":?"cloudFunctions/"
}
保存以后,cloudFunctions目錄圖標發生變化,表明這是一個云函數的目錄。
右擊cloudFunctions目錄,選擇“新建Node.js云函數”,并將該函數命名為add,
微信開發工具自動創建出同名目錄,以及目錄中兩個文件index.js和package.json。
index.js是add函數的入口文件。package.json是Node.js中的模塊描述文件,其內容是一個JSON對象,指定了模塊名字、版本、描述等信息。JSON對象的dependencies屬性指定了該模塊所依賴的其他模塊的名字和版本。在云函數可以用npm引入第三方依賴來幫助更快開發。
所有云函數中會默認引入wx-server-sdk的依賴,版本后為latest。在index.js文件中,第一行表示在云函數中引入這個依賴模塊的引用對象。其代碼如下:
const?cloud?=?require('wx-server-sdk') // cloud對象對應著小程序的wx.cloud對象
服務端API都封裝在cloud對象。
在服務端可以通過cloud.init方法實現初始化。代碼如下:
cloud.init()?// 使用云能力前需要先執行初始化方法
接下來觀察云函數的入口函數:
// 云函數入口函數
exports.main = async?(event,?context)?=>?{
// cloud function body
}
這是箭頭函數,async表示這是一個異步函數。event和context是函數的兩個參數,大括號是函數的內容。在函數前面加上exports.main=,表示這個函數是這個模塊的入口函數。
event指的是觸發云函數的事件對象,其中包含小程序端調用云函數時傳入的參數,而context對象則包含云函數的調用信息和運行狀態,可以用它了解服運行情況。
現在修改云函數,將傳入的a和b相加,并作為sum字段返回給調用端,代碼如下:
exports.main = async?(event,?context)?=>?{
const?c?=?event.a?+?event.b
??return?{
????sum: c
??}
}
保存后,需要將這個云函數部署到云端。在云函數魔力add上右擊,在右鍵菜單中,選擇“上傳并部署:云端安裝依賴?( 不上傳node_modules)?”,將云函數上傳并部署到線上環境中。
這時,在云開發控制臺中的云函數管理頁面可以看到剛剛上傳的云函數,如下圖所示:
部署完成后在小程序使用wx.cloud.callFunction方法調用該云函數。代碼如下:
?//? 回調風格
?wx.cloud.callFunction({
??????name:?'add',?//?云函數名稱
??????data?:?{
????????a: 1,
????????b:?2
??????},
??????success:?function(res){
????????console.log(res.result)?//?sum:?3
??????},
??????fail:?function(error){//?handle?error
??????}
????})
// Promise風格
????wx.cloud.callFunction({
??????name:?'add',?//?云函數名稱
??????data?:?{
????????a:?55,
????????b:?2
??????}
????}).then(res?=>?{
??????console.log(res.result)?//?sum:?
????}).catch(error?=>?{//?handle?error
????})
(實踐的時候發現,云函數的任何修改,都不是實時的,都需要點擊add上傳并部署,調用才能得到正確的結果)