雲函數是一段部署在服務端的代碼片斷,經過雲函數能夠解決不少複雜的業務邏輯,無需將大量的數據發送到客戶端作計算處理,大大減輕了客戶端業務開發的複雜度。 另外,更新雲函數代碼片斷,客戶端無需更新,便知足業務改動的需求,這樣雲函數便有更多的靈活性和自主性。前端
目前Bmob雲函數支持Node.js和Java兩種編程語言。java
建立好的雲函數支持三種執行方式:web
假設如今有一張用戶表_User
存儲註冊的用戶信息,主要的基本字段以下:編程
字段 | 數據類型 | 描述 |
---|---|---|
username | String | 用戶名 |
password | String | 密碼 |
type | Integer | 用戶類型(1普通用戶、2高級用戶) |
老闆要求統計天天不一樣類型的用戶註冊量json
1.在Bmob控制檯建立countRegister的雲函數api
2.建立後臺的countRegister雲函數的默認內容以下:瀏覽器
3.在onRequest方法體中咱們將實現註冊量統計的邏輯,這裏須要注意幾點:bash
- 方法名、入參及返回類型不容許任何修改
- 代碼中不能包含如下關鍵字 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 | 全部平臺適用,可用瀏覽器打開 |
這裏使用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
雲函數,將統計的結果存儲到一張表中。
新建一個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信息等等。