简单写个云函数路由
随着云函数数量的增多,有的并发量不大的云函数目前是用路由的方式访问,但是每次都要搬路由代码维护起来也比较麻烦,之前也有看过tcb-route的介绍,个人感觉不是很优雅【不喜勿喷谢谢】。所以干脆就自己写了一个sdk,打包上传到npm,有需要的小伙伴可以自取
npm i tcb-server-sdk
目前使用到的主要有两个类:RouteBase、RouteHolder,后续会再继续完善
项目开源地址:https://github.com/showms/tcb-server-sdk.git
说明:
- 被路由的处理类要求继承RouteBase
- 云函数入口使用RouteHolder初始化路由对象,允许指定固定前缀
- RouteBase会自动使用wx-server-sdk初始化云环境
其中:
- RouteBase还会初始化一些云函数所需的操作对象
初始化代码如下
/**
* 路由基类
* 所有需要路由转发的类都需要继承这个类
*/
class RouteBase {
static instance;
cloud;
db;
_;
$;
wxContext;
response;
event;
constructor(event = {}) {
const {env} = event;
cloud.init({
//允许外部指定云开发环境
env: env || cloud.DYNAMIC_CURRENT_ENV
});
this.cloud = cloud;
//数据库,具体见云开发API
this.db = cloud.database({
throwOnNotFound: false
});
//数据库操作符,具体见云开发API
this._ = this.db.command;
//数据库聚合操作,具体见云开发API
this.$ = this.db.command.aggregate;
//用户上下文
this.wxContext = cloud.getWXContext();
//响应封装类
this.response = response;
this.event = event;
}
/**
* 获取实例
* @param event
* @returns {*}
*/
static getInstance(event = {}) {
this.instance = new this(event);
//console.log("重置用户上下文、入参信息,当前用户信息:", JSON.stringify(this.instance.wxContext));
return this.instance;
}
}
所以所有继承RouteBase的子类都可以使用父类里面的这些操作对象
使用示例:
假设云函数代码目录结构如下:
\--- functions
+--- routeTest
+---- service
| +---- user
| \---- Name.js
| \---- Test.js
\---- index.js
\---- package.json
\---- package-lock.json
云函数入口文件
const route = require("./tcb-server-sdk");
// 云函数入口函数
exports.main = async (event, context) => {
console.log("入参:", event);
//根据目录结构可以指定固定前缀为service
//小程序端就可以使用user/Name/get访问到Name处理类里的get方法
//如果不指定固定前缀,则需要使用service/user/Name/get才能访问到Name处理类里的get方法
return await new route.RouteHolder("service").process(event);
};
请求处理类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("接口请求参数:", params);
//这里的this.wxContext来自RouteBase
return {"idol": "kobe", "wxContext": this.wxContext};
}
}
module.exports = Name;
小程序端
//执行云函数
wx.cloud.callFunction({
// 云函数名称
name: "routeTest",
// 传给云函数的参数
data: {
env: "test",// 环境可以不填,不填就使用当前环境
uri: "user/Name/get",// 请求URL,云函数端的RouteHolder会找到对应的处理类并调用指定方法
//uri: "user/Name",// 请求URL,这种写法会请求到Name类的index方法
params: {"source":"1"}
}
}).then(res => {
}).catch(res => {
}).then(res => {
});