雲函數是運行在雲端的 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
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)
複製代碼
在雲函數中咱們能夠引入第三方依賴來幫助咱們更快的開發。雲函數的運行環境是 Node.js
,所以咱們可使用 npm
安裝第三方依賴。數據庫
注意:鑑於阿里雲的限制,目前僅支持全量上傳雲函數(整個 node_modules文件夾所有上傳),所以提醒你們,精簡依賴,不然可能會每次上傳時間很慢,影響開發體驗。npm
Tips:
前端代碼(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 }
})
複製代碼