一种极简单的云函数归一化实现方式
第一次做小程序云开发,昨晚第一次需要切换后台环境,发现如果要切换环境的话,需要逐个云函数修改它的 [代码]cloud.init({[代码] [代码] env: "环境ID"[代码] [代码]});[代码] 方法,在里面加入要切换的环境的环境id,并且切换之后需要逐个云函数部署到云后台去——这着实让人难受。 于是准备进行云函数归一的工作,即,将所有云函数写在同一个云函数内,实现 “如果需要切换环境,只需要修改一个文件,部署一个云函数即可” 的效果。经过一些摸索,卓有成效,下面将一些经验分享给大家。 首先,我希望达到的目标是: 实现归一化:让所有云函数功能都写在一个云函数中。 易接入: 不要对现有的云函数有太大的改动。一些云函数比较复杂,改动太大容易出bug。 小程序端的接入方式也不要有太大的改动,不然也容易出问题。 可维护:尽量避免由于实现归一化,而增加不同云函数间的耦合,尽可能和原有的云函数机制一样,不同的云函数各自隔离。 好扩展:以后再新增云函数,不要修改太多地方。最好像现有云函数一样,右键新建,然后就可以开始写功能了。 为了实现以上目标,我采用了如下方案: 1. 云后台端: a. 新建一个router云函数,在其内新建一个function文件夹,将其他所有云函数的 index.js 的名称改为云函数的名字,并放入function文件夹。进行这一步之后,router云函数的目录结构为: [代码]└─router[代码][代码] [代码][代码]│ index.js(“router”云函数的index文件)[代码][代码] [代码][代码]│ newFuncTemplate.js[代码][代码] [代码][代码]│ package.json[代码][代码] [代码][代码]│[代码][代码] [代码][代码]└─functions[代码][代码] [代码][代码]onClick.js(原“onClick”云函数的index文件)[代码][代码] [代码][代码]publish.js(原“publish”云函数的index文件)[代码] b. 修改 router 云函数的 index.js 函数,根据从event中取出来的 funcName 进行云函数寻址,并将任务分发下去。注意:为了实现所有云函数都能一键切换环境,需要将 cloud 传下去,让其他云函数都用 router 的 index.js 里面的 cloud。 [代码]// 云函数入口文件[代码][代码]const cloud = require([代码][代码]'wx-server-sdk'[代码][代码]);[代码][代码]cloud.init();[代码] [代码]// 云函数入口函数[代码][代码]exports.main = async (event, context) => {[代码][代码] [代码][代码]log(event , [代码][代码]"收到云函数调用"[代码][代码]);[代码][代码] [代码][代码]const funcMain = require([代码][代码]"./functions/"[代码] [代码]+ event.funcName + [代码][代码]".js"[代码][代码]);[代码][代码]// 根据funcName寻址云函数[代码][代码] [代码][代码]return[代码] [代码]await funcMain(event, context , cloud);[代码][代码]// 将任务分发下发。此处要将 cloud 传下去[代码][代码]};[代码] c. 修改 function 文件里面的所有云函数文件,主要由两个修改点: c1. 需要使用构造函数里面传进来的cloud。 c2. 需要将入口函数暴露出去。 修改结束之后的各个云函数文件如下所示: [图片] 2. 小程序端 小程序端需将所有请求的 name 都改为 router,并且在传的 data 里面加上 funcName 参数,其值为之前原本要调的云函数方法名。 [代码]// 修改前[代码][代码]wx.cloud.callFunction({[代码][代码] [代码][代码]name: [代码][代码]"deleteMyPublish"[代码][代码],[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]id: key[代码][代码] [代码][代码]},[代码][代码] [代码][代码]success: res => {}[代码][代码]})[代码][代码]// 修改后[代码][代码]wx.cloud.callFunction({[代码][代码] [代码][代码]name: [代码][代码]'router'[代码][代码],[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]funcName: [代码][代码]"deleteMyPublish"[代码][代码],[代码][代码] [代码][代码]id: key[代码][代码] [代码][代码]},[代码][代码] [代码][代码]success: res => {}[代码][代码]})[代码] 3. 后续新增云函数 后续新增的话,就直接在 function 文件夹里面新建一个以云函数命名的 js 文件,然后把上面 1.c 里面的代码复制进去,就可以直接写逻辑了。 大概就是这样了。这个编辑器真的很难用,什么时候能支持 Markdown ?