UNI-APP之uniCloud使用(雲函數)| 8月更文挑戰

雲函數是運行在雲端的 JavaScript 代碼,和普通的Node.js開發同樣,熟悉Node.js的開發者能夠直接上手。javascript

以下是將傳入的兩個參數求和並返回客戶端的雲函數代碼示例:前端

'use strict';
exports.main = async (event, context) => {
    //event爲客戶端上傳的參數
    return {
    sum:event.a + event.b
  }
}
複製代碼

雲函數的傳入參數有兩個,一個是event對象,一個是context對象。event指的是觸發雲函數的事件,當客戶端調用雲函數時,event就是客戶端調用雲函數時傳入的參數。context 對象包含了此處調用的調用信息和運行狀態,能夠用它來了解服務運行的狀況。uniCloud會自動將客戶端的操做系統(os)、運行平臺(platform)、應用信息(appid)等注入context中,開發者可經過context獲取每次調用的上下文,以下是一個示例:java

'use strict';
exports.main = async (event, context) => {
    //event爲客戶端上傳的參數
  ...
  //context中可獲取客戶端調用的上下文
  let os = context.OS //客戶端操做系統,返回值:android、ios 等
  let platform = context.PLATFORM //運行平臺,返回值爲 mp-weixin、app-plus等
  let appid = context.APPID // manifest.json中配置的appid
    ... //其它業務代碼
}
複製代碼

訪問數據庫

雲函數中支持訪問本服務空間下的數據庫,調用方式詳見規範node

訪問HTTP服務

uniCloud提供了uniCloud.httpclient供開發者使用。無需額外依賴,就能夠請求任何 HTTP 和 HTTPS 協議的 Web 服務。uniCloud.httpclient返回的是一個urllib實例android

uniCloud.httpclient.request(URL,requestOptions)ios

requestOptions參數說明git

參數名 類型 是否必填 默認值 說明
method String - GET HTTP 請求方法, 默認爲:GET. 可選值: GET, POST, DELETE, PUT
data Object - - 發送的數據
dataAsQueryString Boolean - true 是否強制轉換data爲queryString
content String | Buffer - - 手動設置請求的payload,設置後會忽略data
files Array<ReadStream|Buffer|String> | Object | ReadStream | Buffer | String - - 上傳的文件,設置後將會使用 multipart/form-data 格式。若是未設置method,將會自動將method設置爲POST
contentType String - - 上傳數據的格式,設爲json會自動在header內設置Content-Type: application/json
nestedQuerystring Boolean - - 轉換data爲queryString時默認不支持嵌套Object,此選項設置爲true則支持轉換嵌套Object
dataType String - - 返回的數據格式
headers Object - - 請求頭
timeout Number | Array - - 超時時間設置。設置爲數組時第一項爲請求超時,第二項爲返回超時。設置爲數字時至關於同時設置請求超時和返回超時,即timeout:3000效果等於timeouut:[3000,3000]

示例代碼github

const res = await uniCloud.httpclient.request(apiUrl, {
    method: 'POST',
    data: {
      test: 'testValue'
    },
    dataType: 'json'
  })
console.log(res)
複製代碼

使用npm

在雲函數中咱們能夠引入第三方依賴來幫助咱們更快的開發。雲函數的運行環境是 Node.js,所以咱們可使用 npm 安裝第三方依賴。數據庫

注意:鑑於阿里雲的限制,目前僅支持全量上傳雲函數(整個 node_modules文件夾所有上傳),所以提醒你們,精簡依賴,不然可能會每次上傳時間很慢,影響開發體驗。npm

Tips:

  • 目前每一個雲函數上傳包大小限制爲10M。

客戶端調用雲函數

前端代碼(H5前端、App、小程序),再也不執行uni.request聯網,而是經過uniCloud.callFunction調用雲函數,callFunction定義以下:

請求參數

字段 類型 必填 說明
name String 雲函數名稱
data Object 客戶端須要傳遞的參數

響應參數

字段 類型 說明
result Object 雲函數執行結果
requestId String 請求序列號,用於錯誤排查

示例代碼

// promise方式
uniCloud.callFunction({
    name: 'test',
    data: { a: 1 }
  })
  .then(res => {});
// callback方式
uniCloud.callFunction({
    name: 'test',
    data: { a: 1 },
    success(){},
    fail(){},
    complete(){}
});
複製代碼

目前僅支持客戶端調用雲函數,即將支持雲函數調用雲函數。

注意事項

雲函數是運行在雲端的代碼,運行環境由雲服務器彈性調配,這是和傳統Node.js應用很大的區別。

換言之,雲函數每次執行的宿主環境(可簡單理解爲虛擬機或服務器硬件)可能相同,也可能不一樣,所以傳統Node.js開發中將部分信息存儲本地硬盤或內存的方案就再也不適合,建議經過雲數據庫或雲存儲的方案替代。

另外一方面,鑑於雲函數的彈性調配機制,爲提升運行性能,部分雲廠商在必定時間週期內會複用相同的雲函數實例,此時爲避免數據污染,建議使用無狀態的風格編寫函數代碼。

以以下代碼爲例,count做爲全局變量,當屢次調用該雲函數時,可能會出現變量累加的狀況(實例未複用時,每次返回0,若實例被複用,則可能返回一、二、3等各類意外狀況)

雲函數中使用的時區是 UTC+0,而不是 UTC+8,在雲函數中使用時間時需特別注意。

let count = 0;
module.exports = async (event) => {
  return count++
  //此示例爲錯誤示例
  //雲函數實例未複用時,每次返回0
  //若實例被複用,則可能返回一、二、3等各類意外狀況
}
複製代碼

雲函數中調用雲函數

用法同客戶端調用雲函數,不支持callback形式

請求參數

字段 類型 必填 說明
name String 雲函數名稱。
data Object 雲函數參數。

響應參數

字段 類型 必備 說明
errCode String 狀態碼,操做成功則不返回。
errMsg String 錯誤描述。
result Object 雲函數執行結果。
requestId String 請求序列號,用於錯誤排查。

示例代碼

let callFunctionResult = await uniCloud.callFunction({
    name: "test",
    data: { a: 1 }
})
複製代碼
相關文章
相關標籤/搜索