小程序云函数路由优化之tcb-router

背景:

一个用户在一个云环境中只能创建50个云函数,之前是20个,更少。

比如我们要开发一个项目,当我们要获取A数据的时候可能要创建一个云函数,要获取B数据的时候又要创建一个云函数。。。。随着业务的增多,创建的对应的云函数数目越来越多,50个可能不够用,而且这种做法也很冗杂。

所以希望把相似的请求归类到同一个云函数处理,比如我们把获取音乐信息和获取电影信息都在同一个云函数里实现,从而避免创建过多云函数的情况。

要实现这一功能就要用到一个第三方库——tcb-router 一个koa风格的云函数路由库。


koa洋葱模型

koa框架采用了【中间件】的形式,中间件可以介入请求和相应的处理,可以理解是一个轻量级的模块,或者在我们的代码当中是一个函数形式。中间件可以负责一个特定的功能,通过一个next函数把每个中间件之间建立关系。

什么是【洋葱模型】?

简单的理解就如上面两张图所表示的那样。


tcbRouter云函数

这里我通过一个例子来说明一下tcb-router的用法。

我们实现一个功能:把获取音乐信息和获取电影信息都在同一个云函数里实现,两者都要获取用户openid并且获取各自的信息,从而避免创建多个云函数的情况。

创建云函数tcbRouter👇

在tcbRouter云函数的目录下安装tcb-router依赖👇

1
npm install --save tcb-router


云函数tcbRouter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 云函数入口文件
const cloud = require('wx-server-sdk')
// 引入tcb-router
const TcbRouter = require('tcb-router')

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
// return {event,context} //看看event和context到底是啥

// new一个TcbRouter对象,需要传入一个参数,把event传入
// 这时候tcb-router就会自动帮我们处理事件中的参数和路由转发
const app = new TcbRouter({event})

// 公共路由
// app.use 表示该中间件会适用于所有的路由
app.use(async (ctx,next)=>{
console.log('进入全局中间件')
ctx.data = {}
ctx.data.openId = event.userInfo.openId //通过该公共路由获取到用户openid
await next() //执行一下中间件.这是一个异步操作,要加上await
console.log('退出全局中间件')
})

// music相关的路由
app.router('music', async (ctx,next)=>{
console.log('进入音乐名称路由中间件')
ctx.data.musicName = "Let it be"
await next() //执行一下中间件
console.log('退出音乐名称路由中间件')
}, async (ctx, next)=>{
console.log('进入音乐类型路由中间件')
ctx.data.musicType = '摇滚乐'
ctx.body = {
data: ctx.data
}
// ctx.body 返回数据到小程序端
console.log('退出音乐类型路由中间件')
})

// movie相关的路由
app.router('movie', async (ctx,next)=>{
console.log('进入电影名称路由中间件')
ctx.data.movieName = "千与千寻"
await next() //执行一下中间件
console.log('退出电影名称路由中间件')
}, async (ctx, next)=>{
console.log('进入电影类型路由中间件')
ctx.data.movieType = '动漫'
ctx.body = {
data: ctx.data
}
// ctx.body 返回数据到小程序端
console.log('退出电影类型路由中间件')
})

// // 必须写! 需要把当前的服务返回
return app.serve()
}


小程序端调用tcbRouter函数👇

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//demo.js
getMusicInfo(){
wx.cloud.callFunction({
name: 'tcbRouter',
data: {
$url: 'music'
}
}).then((res)=>{
console.log(res)
})
},
getMovieInfo(){
wx.cloud.callFunction({
name: 'tcbRouter',
data:{
$url: 'movie'
}
}).then((res)=>{
console.log(res)
})
},

上面这段代码两个方法实际上调用的都是同一个云函数tcbRouter,但实现了不同的功能。


为了更加直观的体现【洋葱模型】这一概念在该例子上的应用,我们可以在云开发控制台的云函数运行日志中查看打印的日志👇