全部
常见问题
产品动态
精选推荐

简单写个云函数路由

管理 管理 编辑 删除

随着云函数数量的增多,有的并发量不大的云函数目前是用路由的方式访问,但是每次都要搬路由代码维护起来也比较麻烦。

目前使用到的主要有两个类:RouteBase、RouteHolder

说明:
  • 被路由的处理类要求继承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 => {
    
});


请登录后查看

CRMEB-慕白寒窗雪 最后编辑于2023-08-17 11:18:22

快捷回复
回复({{post_count}}) {{!is_user ? '我的回复' :'全部回复'}}
回复从新到旧

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}}

作者 管理员 企业

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest==1? '取消推荐': '推荐'}}
{{item.floor}}#
{{item.user_info.title}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
{{item.like_count}}
{{item.showReply ? '取消回复' : '回复'}}
删除
回复
回复

{{itemc.user_info.nickname}}

{{itemc.user_name}}

作者 管理员 企业

回复 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}   {{itemc.ip_address}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回复' : '回复'}}
删除
回复
回复
查看更多
回复
回复
771
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

CRMEB-慕白寒窗雪 作者
社区运营专员---高冷のBoy | 呆萌のGirl

回答

2304

发布

1777

经验

45564

快速安全登录

使用微信扫码登录
{{item.label}} {{item.label}} {{item.label}} 板块推荐 常见问题 产品动态 精选推荐 首页头条 首页动态 首页推荐
加精
取 消 确 定
回复
回复
问题:
问题自动获取的帖子内容,不准确时需要手动修改. [获取答案]
答案:
提交
bug 需求 取 消 确 定

微信登录/注册

切换手机号登录

{{ bind_phone ? '绑定手机' : '手机登录'}}

{{codeText}}
切换微信登录/注册
暂不绑定
CRMEB客服

CRMEB咨询热线 咨询热线

400-8888-794

微信扫码咨询

CRMEB开源商城下载 开源下载 CRMEB官方论坛 帮助文档
返回顶部 返回顶部
CRMEB客服