云函數簡介
云函數是一段部署在服務端的代碼片段,通過云函數可以解決很多復雜的業務邏輯,無需將大量的數據發送到客戶端做計算處理,大大減輕了客戶端業務開發的復雜度。
另外,更新云函數代碼片段,客戶端無需更新,便滿足業務改動的需求,這樣云函數便有更多的靈活性和自主性。
編程語言
目前Bmob云函數支持Node.js和Java兩種編程語言。
云函數執行方式
創建好的云函數支持三種執行方式:
- 定時任務
在服務端創建并設置定時任務規則后定時執行指定的云函數 - RESTful Api調用
通過Restful api接口調用指定云函數返回執行結果 - SDK調用
通過Bmob數據服務提供的相關平臺SDK中提供的方法調用指定云函數
數據準備
字段 | 數據類型 | 描述 |
---|---|---|
username | String | 用戶名 |
password | String | 密碼 |
type | Integer | 用戶類型(1普通用戶、2高級用戶) |
假設現在有一張用戶表_User
存儲注冊的用戶信息,主要的基本字段如下:
字段 | 數據類型 | 描述 |
---|---|---|
username | String | 用戶名 |
password | String | 密碼 |
type | Integer | 用戶類型(1普通用戶、2高級用戶) |
需求
老板要求統計每天不同類型的用戶注冊量
創建云函數
1.在Bmob控制臺創建countRegister的云函數
2.創建后臺的countRegister云函數的默認內容
3.在onRequest方法體中我們將實現注冊量統計的邏輯,這里需要注意幾點:
- 方法名、入參及返回類型不允許任何修改
- 代碼中不能包含以下關鍵字
Class
File
System
...- 需要獲取當前毫秒時,可用 getTime() 、new java.util.Date().getTime() 替代 System.currentTimeMillis()
- 如果確實需要用到被禁止使用的關鍵字,例如查詢"File"表,可用"F"+"ile"的形式拼接
- 不可包含/**/注釋,如需注釋,請用 //
- 僅可寫一個Java的方法,不能寫多個方法、類變量、靜態變量等
- 云函數執行完畢后,必須用response.send方法返回響應數據,否則會被當做超時,多次超時可能會被暫停使用
了解了以上規則后我們就來開始編寫統計數據的代碼:
// 按type字段進行分組統計
Querier qt = new Querier("_User")
.limit(1000)
.groupby("type")
.groupcount(true);
// 條件 = 創建時間在12小時內
qt.addWhereGreaterThanOrEqualTo("createdAt", new BmobDate(getTime() - 12 * 60 * 60 * 1000));
// 使用oData對象的find方法進行數據的查詢統計
HttpResponse httpResponse = modules.oData.find(qt);
// 將查詢統計得到的數據通過httpResponse返回給調用云函數的請求方
response.send(httpResponse.jsonData);
調用云函數
調用方式 | 所需信息 | 優點 |
---|---|---|
SDK | AppId | 交互自帶加密,接入快速 |
RestApi | AppId、RestKey | 所有平臺適用,通用性強 |
Http請求 | Secret Key | 所有平臺適用,可用瀏覽器打開 |
云函數的調用支持以下幾種方式:
調用方式 | 所需信息 | 優點 |
---|---|---|
SDK | AppId | 交互自帶加密,接入快速 |
RestApi | AppId、RestKey | 所有平臺適用,通用性強 |
Http請求 | Secret Key | 所有平臺適用,可用瀏覽器打開 |
username | password | type |
---|---|---|
zhangsan | 123456 | 1 |
lisi | 123456 | 2 |
wangwo | 123456 | 1 |
這里使用Http請求的方式調用countRegister
云函數進行測試,在瀏覽器中請求如下地址:https://javacloud.bmob.cn/****/countRegister
,星號請替換為您Bmob應用的SectetKey
,
這個時候假設當前_User
表中存儲的數據如下:
username | password | type |
---|---|---|
zhangsan | 123456 | 1 |
lisi | 123456 | 2 |
wangwo | 123456 | 1 |
執行此云函數返回的Json數據將是如下結果:
{"results":[{"_count":1,"type":2},{"_count":2,"type":1}]}
results
中的結果分別是普通用戶(type=1)和高級用戶(type=2)的注冊總數。
到此已經實現了基本的統計操作,主要是在云函數中使用了數據服務的查詢功能來進行統計查詢。而實際的業務中可能需要我們將統計的結果存儲到相關的數據表中方便以后做報表展示,所以我們接下來繼續完善一下這個countRegister
云函數,將統計的結果存儲到一張表中。
保存統計數據
字段 | 數據類型 | 描述 |
---|---|---|
generalUserCount | Integer | 普通用戶注冊數量 |
advancedUserCount | Integer | 高級用戶注冊數量 |
新建一個Statistics
表,存儲統計后的結果,結構如下:
字段 | 數據類型 | 描述 |
---|---|---|
generalUserCount | Integer | 普通用戶注冊數量 |
advancedUserCount | Integer | 高級用戶注冊數量 |
加入存儲統計數據的代碼
// 按type字段進行分組統計
Querier qt = new Querier("_User")
.limit(1000)
.groupby("type")
.groupcount(true);
// 條件 = 創建時間在12小時內
qt.addWhereGreaterThanOrEqualTo("createdAt", new BmobDate(getTime() - 12 * 60 * 60 * 1000));
// 使用oData對象的find方法進行數據的查詢統計
HttpResponse httpResponse = modules.oData.find(qt);
// 將查詢統計得到的數據通過httpResponse返回給調用云函數的請求方
//response.send(httpResponse.jsonData);
JSONArray results = httpResponse.jsonData.getJSONArray("results");
if (results == null) {
response.send(httpResponse.data); // 請求有錯誤,直接返回全部內容
} else {
JSONObject statisticsData = new JSONObject();
for(int i = 0; i < results.size(); i++){
JSONObject obj = results.getJSONObject(i);
int type = obj.getInteger("type");
int count = obj.getInteger("_count");
if(type == 1){
// 普通用戶總數
statisticsData.put("generalUserCount", count);
}else if(type == 2){
// 高級用戶總數
statisticsData.put("advancedUserCount", count);
}
}
// 保存數據并返回執行結果
response.send(modules.oData.insert("Statistics", statisticsData).stringData);
}
保存好代碼后再次調用該云函數,返回結果如下:
{"createdAt": "2017-12-27 16:04:35","objectId": "8401a6d2d9"}
表示插入Statistics
表數據成功后返回的數據objectId和創建時間,Bmob控制臺數據瀏覽Statistics
表,已經存在統計后的數據了。
定時任務
上面的云函數已經基本完成了用戶注冊數的統計以及保存統計數據的工作,但是當我們需要統計的時候還需要手動的調用countRegister
云函數才行。實際上我們可以創建一個定時任務在固定時間來執行這個統計操作。在云函數的編寫頁面選擇定時任務,設置執行規則后保存即可,具體設置如下:
上面的規則是每天的23點執行該云函數,定時任務的執行規則可以參考定時任務文檔說明。
總結
本文以一個統計用戶注冊數量的簡單實例來講解了Bmob云函數的使用,主要在云函數中使用到了數據服務的查詢數據和插入數據來實現,并在最后介紹了定時任務+云函數的搭配使用。很多時候,單純的前端代碼是不能完成全部事情的,一些重要和復雜的業務邏輯還是希望能夠在服務端中執行。比如:對比較大量的比賽數據進行排序、對某些數據進行分析和處理、獲取用戶的IP信息等等。