第一次做小程序云开发,昨晚第一次需要切换后台环境,发现如果要切换环境的话,需要逐个云函数修改它的
|
方法,在里面加入要切换的环境的环境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文件) |
// 云函数入口文件 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 ?
网友回复
// 云函数入口文件
var cloud;
var db;
var _;
// 云函数入口函数
const main = async(event, context , clo) => {
cloud = clo;
db = cloud.database();
_ = db.command;
};
module.exports = main;
这段代码贴在正文里死活无法发布成功,迫于无奈,在这里贴一下。