评论

简单写个云函数路由

云开发云函数轻量级类路由库,主要用于优化服务端函数处理逻辑

随着云函数数量的增多,有的并发量不大的云函数目前是用路由的方式访问,但是每次都要搬路由代码维护起来也比较麻烦,之前也有看过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 => {
    
});


最后一次编辑于  2023-04-06  
点赞 2
收藏
评论

1 个评论

  • 欢乐马
    欢乐马
    2022-01-07

    不错不错 已经star了

    2022-01-07
    赞同
    回复 1
    • showms
      showms
      2022-01-07
      谢谢
      2022-01-07
      回复
登录 后发表内容