隨著云函數(shù)數(shù)量的增多,有的并發(fā)量不大的云函數(shù)目前是用路由的方式訪問,但是每次都要搬路由代碼維護(hù)起來也比較麻煩。
目前使用到的主要有兩個(gè)類:RouteBase、RouteHolder
說明:
- 被路由的處理類要求繼承RouteBase
- 云函數(shù)入口使用RouteHolder初始化路由對(duì)象,允許指定固定前綴
- RouteBase會(huì)自動(dòng)使用wx-server-sdk初始化云環(huán)境
其中:
- RouteBase還會(huì)初始化一些云函數(shù)所需的操作對(duì)象
初始化代碼如下
/**
* 路由基類
* 所有需要路由轉(zhuǎn)發(fā)的類都需要繼承這個(gè)類
*/
class RouteBase {
static instance;
cloud;
db;
_;
$;
wxContext;
response;
event;
constructor(event = {}) {
const {env} = event;
cloud.init({
//允許外部指定云開發(fā)環(huán)境
env: env || cloud.DYNAMIC_CURRENT_ENV
});
this.cloud = cloud;
//數(shù)據(jù)庫,具體見云開發(fā)API
this.db = cloud.database({
throwOnNotFound: false
});
//數(shù)據(jù)庫操作符,具體見云開發(fā)API
this._ = this.db.command;
//數(shù)據(jù)庫聚合操作,具體見云開發(fā)API
this.$ = this.db.command.aggregate;
//用戶上下文
this.wxContext = cloud.getWXContext();
//響應(yīng)封裝類
this.response = response;
this.event = event;
}
/**
* 獲取實(shí)例
* @param event
* @returns {*}
*/
static getInstance(event = {}) {
this.instance = new this(event);
//console.log("重置用戶上下文、入?yún)⑿畔?,?dāng)前用戶信息:", JSON.stringify(this.instance.wxContext));
return this.instance;
}
}
所以所有繼承RouteBase的子類都可以使用父類里面的這些操作對(duì)象
使用示例:
假設(shè)云函數(shù)代碼目錄結(jié)構(gòu)如下:
\--- functions
+--- routeTest
+---- service
| +---- user
| \---- Name.js
| \---- Test.js
\---- index.js
\---- package.json
\---- package-lock.json
云函數(shù)入口文件
const route = require("./tcb-server-sdk");
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
console.log("入?yún)ⅲ?, event);
//根據(jù)目錄結(jié)構(gòu)可以指定固定前綴為service
//小程序端就可以使用user/Name/get訪問到Name處理類里的get方法
//如果不指定固定前綴,則需要使用service/user/Name/get才能訪問到Name處理類里的get方法
return await new route.RouteHolder("service").process(event);
};
請(qǐng)求處理類Name.js
const route = require("./tcb-server-sdk");
class Name extends route.RouteBase {
async index(params) {
console.log("index方法:", params);
return {};
}
async get(params) {
console.log("接口請(qǐng)求參數(shù):", params);
//這里的this.wxContext來自RouteBase
return {"idol": "kobe", "wxContext": this.wxContext};
}
}
module.exports = Name;
小程序端
//執(zhí)行云函數(shù)
wx.cloud.callFunction({
// 云函數(shù)名稱
name: "routeTest",
// 傳給云函數(shù)的參數(shù)
data: {
env: "test",// 環(huán)境可以不填,不填就使用當(dāng)前環(huán)境
uri: "user/Name/get",// 請(qǐng)求URL,云函數(shù)端的RouteHolder會(huì)找到對(duì)應(yīng)的處理類并調(diào)用指定方法
//uri: "user/Name",// 請(qǐng)求URL,這種寫法會(huì)請(qǐng)求到Name類的index方法?
params: {"source":"1"}
}
}).then(res => {
}).catch(res => {
}).then(res => {
});