之所以要进行云函数路由优化,是因为
- 一个用户,在一个云环境中,只能创建50个云函数。一个用户最多创建2个云环境,也就是说,一个用户最多只能创建100个云函数。如果我们要开发的项目非常复杂,需要更多的云函数该怎么办?
- 相似的请求归类到同一个云函数。比如音乐相关的功能,我们需要获取歌单列表,需要获取每个歌单里的每首歌曲,还需要每首歌曲的歌词。如果一个需求就创建一个云函数,那么将需要大量的云函数。如果我们能把音乐相关的需求都放到一个云函数中,那么不但能够起到一个很好的归类的作用,让我们更好的去管理我们的云函数,还能节约本来就不多的云函数创建名额。
云函数路由优化的解决方案 tcb-router
-
tcb-router
是一个koa风格的
云函数路由库
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
- koa 洋葱模型。每个中间件执行后,并不会立刻响应,而是一直往内层中间件执行,一直执行到最后一层中间件,然后从最后一层开始响应。 顺序类似于
3->2->1->1->2->3
image.png - 每一层中间件在代码中相当于一个函数,一个中间件可以负责某一个特定的功能。然后通过
next()
函数把每个中间件之间关联起来
tcb-router的使用
image.png- 打开
https://github.com/TencentCloudBase/tcb-router
,可以看到相关的文档。 - 安装tcb-router的命令
npm install --save tcb-router
- 然后在云函数中使用
// 云函数的 index.js
// 先引入tcb-router,引入的名称就是package.json里的安装包的名称
const TcbRouter = require('tcb-router')
exports.main = (event, context) => {
const app = new TcbRouter({ event });
// app.use 表示该中间件会适用于所有的路由
app.use(async (ctx, next) => {
ctx.data = {};
ctx.data.openid = event.userinfo.openid // 比如,我们可以在公用中间件里获取openid
await next(); // 执行下一中间件,如果有公用的路由,而且后边还有其他路由。这个next是必须的。next执行的可能是异步的,所以加 await
});
// 路由为数组表示,该中间件适用于 user 和 timer 两个路由
app.router(['user', 'timer'], async (ctx, next) => {
ctx.data.company = 'Tencent';
await next(); // 执行下一中间件
});
// 路由为字符串,该中间件只适用于 user 路由
app.router('user', async (ctx, next) => {
ctx.data.name = 'heyli';
await next(); // 执行下一中间件
}, async (ctx, next) => {
ctx.data.sex = 'male';
await next(); // 执行下一中间件
}, async (ctx) => {
ctx.data.city = 'Foshan';
// ctx.body 返回数据到小程序端
ctx.body = { code: 0, data: ctx.data};
});
// 路由为字符串,该中间件只适用于 timer 路由
app.router('timer', async (ctx, next) => {
ctx.data.name = 'flytam';
await next(); // 执行下一中间件
}, async (ctx, next) => {
ctx.data.sex = await new Promise(resolve => {
// 等待500ms,再执行下一中间件
setTimeout(() => {
resolve('male');
}, 500);
});
await next(); // 执行下一中间件
}, async (ctx)=> {
ctx.data.city = 'Taishan';
// ctx.body 返回数据到小程序端
ctx.body = { code: 0, data: ctx.data };
});
return app.serve();
}
- 在小程序端调用云函数,并指定对应的路由。
// 调用名为 router 的云函数,路由名为 user
wx.cloud.callFunction({
// 要调用的云函数名称
name: "router",
// 传递给云函数的参数
data: {
$url: "user", // $url跟的是想调用的路由的名称
other: "xxx"
}
});
网友评论