美文网首页
简单写个云开发云函数路由

简单写个云开发云函数路由

作者: showms | 来源:发表于2021-12-18 13:57 被阅读0次
云开发云函数轻量级类路由库,主要用于优化服务端函数处理逻辑

随着云函数数量的增多,有的并发量不大的云函数目前是用路由的方式访问,但是每次都要搬路由代码维护起来也比较麻烦,之前也有看过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 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会找到对应的处理类并调用指定方法

        params: {"source":"1"}

    }

}).then(res => {   

}).catch(res => {   

}).then(res => {

});

相关文章

网友评论

      本文标题:简单写个云开发云函数路由

      本文链接:https://www.haomeiwen.com/subject/nfrgfrtx.html