百度智能小程序 云函數(shù)開發(fā)指南

2020-09-05 15:03 更新

編輯器中的云函數(shù)操作

配置云函數(shù)本地目錄

在 project.config.json 文件中設(shè)置 cloudfunctionRoot 字段,即可指定云函數(shù)的本地目錄,當通過創(chuàng)建云函數(shù)項目打開工程時,該字段自動生成。

云函數(shù)操作

在編輯器中可通過在云函數(shù)目錄上點擊鼠標右鍵來完成相應(yīng)操作,目前包括以下功能:

  • 查看當前環(huán)境
  • 切換環(huán)境
  • 新建 Node.js 云函數(shù)
  • 下載線上環(huán)境的云函數(shù)列表并在本地生成空文件夾
  • 下載線上環(huán)境的云函數(shù)代碼并覆蓋本地
  • 上傳并部署云函數(shù)到線上環(huán)境

查看和切換環(huán)境

在編輯器云函數(shù)根目錄上右鍵,可查看當前的云環(huán)境,同時可在二級菜單切換環(huán)境,切換環(huán)境后會自動同步當前云環(huán)境列表(不會自動下載代碼)。

新建 Node.js 云函數(shù)

在云函數(shù)根目錄上點擊右鍵,可以創(chuàng)建一個新的 Node.js 云函數(shù),開發(fā)者工具在本地創(chuàng)建出以下目錄和文件:

  • 云函數(shù)目錄:以云函數(shù)名字命名的目錄,包含云函數(shù)的所有代碼
  • index.js:云函數(shù)入口文件,云函數(shù)被調(diào)用時會執(zhí)行的入口文件中導出的 main 方法
  • package.json:npm 包定義文件,默認定義了最新 swan-server-sdk 依賴

注意: 新建的云函數(shù)在右鍵上傳前需要在本地用命令行 npm install 來安裝依賴包

下載云函數(shù)列表

右鍵點擊同步云函數(shù)列表,可以將當前云環(huán)境包含的所有云函數(shù)同步到本地,并以云函數(shù)名稱新建相應(yīng)的目錄(如果該目錄不存在)。注意: 新建的目錄中不包含任何文件,如果需要查看云函數(shù)的代碼需要右鍵下載云函數(shù)

下載云函數(shù)

右鍵點擊下載云函數(shù),可以將線上云函數(shù)下載到本地硬盤目錄中。

上傳并部署

右鍵點擊上傳并部署,可以將選中的云函數(shù)目錄上傳并部署到線上環(huán)境中。

環(huán)境

環(huán)境是云開發(fā)各類資源的承載集合。環(huán)境與環(huán)境之間是完全隔離的,也就是說,不同環(huán)境下,所有云上托管資源(數(shù)據(jù)庫、存儲、函數(shù)等)均不互通。使用云開發(fā)服務(wù)必須至少創(chuàng)建一個環(huán)境,每個環(huán)境均有一個唯一的環(huán)境 ID,可以在云開發(fā)控制臺的概覽頁面找到。

一個智能小程序最多可以創(chuàng)建 2 個環(huán)境,建議的實踐為創(chuàng)建一個開發(fā)測試環(huán)境和一個線上生產(chǎn)環(huán)境。利用環(huán)境間數(shù)據(jù)隔離的特性,在日常開發(fā)時使用開發(fā)測試環(huán)境,正式發(fā)布的版本使用線上生產(chǎn)環(huán)境,這樣可以在開發(fā)調(diào)試智能小程序的同時保證生產(chǎn)環(huán)境數(shù)據(jù)的穩(wěn)定性。

初始化云開發(fā) SDK 時,可以指定使用哪個環(huán)境,參見 swan.cloud.init。在云函數(shù)中初始化 SDK 時,如果沒有指定環(huán)境 ID,則會默認使用該函數(shù)當前所處的環(huán)境。

云函數(shù)開發(fā)指南

云函數(shù)使用常見問題

云函數(shù)使用什么語言開發(fā)和運行

目前提供 Node.js 8.5 的運行時環(huán)境。

同一個函數(shù)的數(shù)次調(diào)用之間能否共享數(shù)據(jù)

使用云函數(shù)的最佳實踐之一是盡量保持云函數(shù)的無狀態(tài)性。也就是說,每次調(diào)用需要保證相互獨立,重復執(zhí)行結(jié)果應(yīng)當保持一致。云函數(shù)的調(diào)度引擎會根據(jù)調(diào)用的頻率自動伸縮計算資源,對于同一個云函數(shù),在同一時間點可能有多個實例正在工作,當函數(shù)結(jié)果返回后,這些實例可能仍會存活一段時間,以供潛在的新一次調(diào)用。因此,在一定程度內(nèi),兩次調(diào)用之間是有可能共享數(shù)據(jù)的(例如在臨時目錄內(nèi)寫入的數(shù)據(jù))。但是開發(fā)者不應(yīng)當依賴這一點,因為調(diào)度引擎的行為是不可預知的,兩次調(diào)用不一定會使用同一個計算資源,而且計算資源會隨時被銷毀重建??傮w而言,開發(fā)者需要遵循云函數(shù)的無狀態(tài)性原則。

函數(shù)運行資源有什么限制

  • 臨時磁盤空間:用戶函數(shù)只可讀寫 /tmp 這個臨時目錄
  • 函數(shù)申請內(nèi)存區(qū)間:參見配額限制
  • 函數(shù)最大運行時間:參見配額限制
  • 代碼部署包大小(壓縮為.zip 文件):50M
  • 原始代碼大小:250 MB
  • 函數(shù)同步調(diào)用請求正文負載大?。? MB

如何編寫有異步過程的云函數(shù)

將入口函數(shù)標記為 async 即可,Node.js 8.5 的運行時環(huán)境支持 async/await 關(guān)鍵詞。

exports.main = async (event, context) => {
    const someAsyncData = await getAsyncData()
    return someAsyncData
}

如何在函數(shù)中引用外部依賴包

與一般的 Node.js 程序無異,編寫 package.json文件,使用 npm 等工具將外部依賴安裝至 node_modules 目錄中,然后將這些文件一起打包上傳部署即可。

是否需要將 node_modules 一起上傳部署

需要。

在云函數(shù)中訪問云數(shù)據(jù)庫和云存儲,是否自帶權(quán)限控制

沒有,可以任意讀寫數(shù)據(jù)。

應(yīng)該使用 swan-server-sdk 的什么版本

隨著云開發(fā)的功能迭代,SDK 也不會不斷更新,建議使用保持使用最新版本。SDK 更新時會盡量兼容舊版,當必須做出不兼容變更時,會使用大版本號更新。

云函數(shù)使用示例:在智能小程序中調(diào)用云函數(shù)

在本例中,我們會創(chuàng)建一個名為 sum 的函數(shù),他可以接收一系列數(shù)字作為輸入,并且將他們的和返回。

我們先創(chuàng)建一個 sum 函數(shù),并且修改其中的 index.js 文件。本例中無需使用云開發(fā) SDK,因此沒有做初始化等工作。

    exports.main = (event, context) => {
        if (Array.isArray(event['numbers'])) {
            let sum = 0;
            for (let i = 0; i < event['numbers'].length; i++) {
                let n = parseInt(event['numbers'][i], 10);
                sum += n;
            }
            return sum
        } else {
            throw new Error('no numbers');
        }
    };

這個函數(shù)在 event 中接收一個 numbers 數(shù)組,并且將它們的和返回。

上傳部署函數(shù)后,我們可以在云開發(fā)控制臺中測試這個函數(shù),可以使用以下內(nèi)容作為測試輸入:

{
    "numbers": [1, 2, 3, 4]
}

可以看到該云函數(shù)能夠正確返回結(jié)果。

在智能小程序中,通過以下方式調(diào)用這個云函數(shù)獲取結(jié)果:

swan.cloud.callFunction({
    // 云函數(shù)名稱
    name: 'sum',
    // 傳給云函數(shù)的參數(shù)
    data: {
        numbers: [1, 2, 3, 4]
    },
    success: function(res) {
        console.log(res.result)
    },
    fail: console.error
})

云函數(shù)使用示例:在云函數(shù)中調(diào)用另一個云函數(shù)

在云函數(shù)中,可以使用 swan-server-sdk 來訪問當前環(huán)境中的其他資源,包括調(diào)用另一個云函數(shù)。在本例中,你會創(chuàng)建兩個函數(shù):sum 和 call_sum,然后在智能小程序端調(diào)用 call_sum 函數(shù),call_sum 函數(shù)會調(diào)用 sum 函數(shù)獲取結(jié)果,最終返回給智能小程序端。

需要注意的是,這里的調(diào)用是同步調(diào)用。也就是說,第二個函數(shù)的執(zhí)行時間會全部計算到第一個函數(shù)的執(zhí)行時間內(nèi)。實際使用時,需要注意設(shè)置合理的函數(shù)超時時間。

我們先創(chuàng)建一個 sum 函數(shù)。

    exports.main = (event, context) => {
        if (Array.isArray(event['numbers'])) {
            let sum = 0;
            for (let i = 0; i < event['numbers'].length; i++) {
                let n = parseInt(event['numbers'][i], 10);
                sum += n;
            }
            return sum
        } else {
            throw new Error('no numbers');
        }
    };

這個函數(shù)在 event 中接收一個 numbers 數(shù)組,并且將它們的和返回。

我們再創(chuàng)建一個 call_sum 函數(shù)。

    const cloud = require('swan-server-sdk');
    
    exports.main = async (event, context) => {
        cloud.init(context);
    
        let resp = await cloud.callFunction({
            name: 'sum',
            data: {
                numbers: [1, 2, 3, 4]
            }
        });
     
        console.log(resp);
     
        return 'sum: ' + resp.result
    };

要注意 package.json 中要有 swan-server-sdk 的依賴。

    "dependencies": {
      "swan-server-sdk": "latest"
    }

手動安裝依賴:

    npm install

將這兩個函數(shù)都部署到云開發(fā)后,可以在智能小程序中調(diào)用 call_sum 函數(shù),正常的話可以看到返回結(jié)果。

    sum: 10


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號