前言
这是在做《#小程序云开发挑战赛#-情侣券-想做就做》这个项目过程中学习到了一个新知识。
能够优雅的调用云函数,极大程度的减少维护成本。
在此之前我都是业务代码层面直接调用云函数,而且一个云函数就一个方法。
如下:
首页
wx.cloud.callFunction({
name: 'login'
}).then(res => {
wx.setStorageSync('openid', res.result.openid)
})
login 云函数
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = (event, context) => {
const wxContext = cloud.getWXContext()
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
env: wxContext.ENV,
}
}
这种代码写起来很爽,但是要维护起来的时候就很头疼,云函数越写越多,找起来就比较麻烦,无法快速定位。
如何解决呢?
从两个维度来解决:
- 从小程序代码来说,可以加一个api层来管理所有云函数的调用。
- 从云函数代码来说,可以在一个云函数里面做个简单路由写多个方法。
1.云函数调用统一管理
从之前的顺序:小程序业务层=>云函数 改成 小程序业务层=>API层=>云函数
业务层:调用API
// 先导入api的user类
import {
login
} from 'api/user.js'
login().then(res => {
wx.setStorageSync('openid', res.result.openid)
})
API层:调用云函数
async function login() {
return wx.cloud.callFunction({
// 云函数名称
name: 'user',
// 传给云函数的参数
data: {
action: 'login'
}
});
}
module.exports = {
login:login
}
上面案例中我们只用了login方法,其实在实战中user里面会有所有的相关操作,引入也可以引入多个方法。
所有的云函数都会在api层进行管理,这样改云函数就不需要去业务代码里面去找了。
业务层只负责传参与回调,调用过程不需要关心,同时还可以支持多个页面复用api方法。
2. 一个云函数多个方法
从上面api层的案例不难看出,data里面传入了一个action参数,这个参数就是你要调用的方法名称。
云函数:
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init();
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
// 简单路由
if (event.action && userHelper[event.action]) {
const result = await userHelper[event.action](wxContext, event)
return result
}
return {
message: 'This action was not found',
error: -1,
}
}
const db = cloud.database();
const userHelper = {
async getOpenId(context, params) {
return {
openid: context.OPENID,
}
}
}
通过userHelper来管理所有的方法,你如果需要添加方法可以直接在userHelper下面添加即可,action传入方法名称就可以调用了。
这样便于查找与管理,同一类业务之需要创建一个云函数即可。
还有一点就是减少云函数数量,云开发不同的收费套餐是有云函数数量限制的。
套餐配合可见:配额说明
总结
全部写完了,如果觉得不错就给我的《#小程序云开发挑战赛#-情侣券-想做就做》点个赞,谢谢。
请教一下,服务端如何调用小程序的云函数
为啥不直接用tcbrouter
谢谢楼主,受教了。
这个不错,跟社区很多思路一样。但是写法有参考的地方。点赞