【小程序】012 云函数路由优化

举报
LongYorke 发表于 2021/02/10 23:44:35 2021/02/10
【摘要】 目前,云函数中最多只能创建50个云函数如果我们开发的小程序业务逻辑非常复杂,由于云函数的数量限制难以满足我们开发的需求,则可以对云函数进行路由优化同时,相似的请求可以归类到同一个云函数进行处理,便于开发过程中对云函数的维护当前云函数music中,作用是获得我们的歌单信息,未来我们还想获取当前歌单里面有哪些歌曲,以及歌单URL播放地址、歌词信息。如果按照传统做法,每个功能的实现都需要独立的创建...
目前,云函数中最多只能创建50个云函数
如果我们开发的小程序业务逻辑非常复杂,由于云函数的数量限制难以满足我们开发的需求,则可以对云函数进行路由优化
同时,相似的请求可以归类到同一个云函数进行处理,便于开发过程中对云函数的维护
当前云函数music中,作用是获得我们的歌单信息,未来我们还想获取当前歌单里面有哪些歌曲,以及歌单URL播放地址、歌词信息。如果按照传统做法,每个功能的实现都需要独立的创建一个云函数,而学习下面的思想,我们将其统一纳入一个云函数即可
tcb-router是一个koa风格的云函数路由库。(Koa (koajs) -- 基于 Node.js 平台的一种 web 开发框架 ),我们要运用其实现同一个函数接收不同路由的请求
koa采用中间件的形式,为介于请求和处理之间的一类软件,向下面对平台系统,对上提供应用开发。此处我们只需理解其为一种函数
koa洋葱模型
一层一层拨开它的心:
多个中间件依次执行
进入第1层中间件后并不会直接返回,而是进入第2层中间件
进入第2层中间件后并不会直接返回,而是进入第3层中间件
...
最后第n层完成后才开始返回,进而返回第n-1层中间件
第n-1层完成后才开始返回,进而返回第n-2层中间件
...
第2层完成后才开始返回,进而返回第1层中间件
以上图片来自网上介绍koa的文章浅析koa的洋葱模型实现 - SegmentFault 思否,出处已经找不到了
 
打开云函数终端
下载tcb-router
依赖安装成功
 
加载模块
require()是nodejs的语法,用于引入模块
const TcbRouter = require("tcb-router")
new创建tcb对象,tcb会处理event参数进行路由转发
 
const app = new TcbRouter({event})
app.use()应用于所有路由的中间件,即无论调用getMusicInfo还是getMovieInfo函数,只要进入该云函数都会执行
使用ctx.data = {}返回小程序端
await next() 为执行下一中间件
  app.use(async (ctx, next) => {
    ctx.data = {}
    ctx.data.openId = event.userInfo.openId
    await next() // 执行下一中间件
  })
event是云函数天然的鉴权机制,直接获取用户openId
在js中,当前作用域里面取不到变量,则会在上一个作用域里面寻找相关内容,故app.use()中无需定义event
 
app.router()第一个参数为小程序进入的路由识别,之后可设置多个执行操作的参数并以await next() 表示 执行下一中间件参数
// 路由为字符串,该中间件只适用于 音乐 路由
  app.router('music', async (ctx, next) => {
    ctx.data.musicName = 'LongYorke'// 获取音乐的名字,一般用数据库内容赋值,此处例子写死
    await next() // 执行下一中间件
  },async(ctx,next)=>{
    ctx.data.musicType = 'xiaobai'// 获取音乐的类型
    ctx.body = {
       data: ctx.data
    } // 将数据返回给小程序,用ctx.body
    }
  )
ctx.body 返回数据到小程序端
 
 
结尾处服务返回
  return app.serve()
小程序端
// 调用名为 TcbRouter 的云函数,路由名为 music
wx.cloud.callFunction({
    // 要调用的云函数名称
    name: "TcbRouter",
    // 传递给云函数的参数
    data: {
        $url: "music", // 要调用的路由的路径,传入准确路径或者通配符*
        other: "xxx"
    }
});
指向逻辑
 
 
进行调试:
出现没能找到"wx-server-sdk"的错误,说明我们没有安装相关sdk
打开终端进行安装npm install --save wx-server-sdk@latest
调用成功
代码:
 
// 云函数入口文件
const cloud = require('wx-server-sdk')

const TcbRouter = require("tcb-router")

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
  const app = new TcbRouter({event})
  console.log({event})

  app.use(async (ctx, next) => {
    console.log("进入全局中间件")
    ctx.data = {}
/*     ctx.data.openId = event.userInfo.openId */
    await next() // 执行下一中间件
    console.log("退出全局中间件")
  })
  

// 路由为字符串,该中间件只适用于 音乐 路由
  app.router('music', async (ctx, next) => {
    console.log("进入获取音乐的名字中间件")
    ctx.data.musicName = 'LongYorke'// 获取音乐的名字,一般用数据库内容赋值,此处例子写死
    await next() // 执行下一中间件
    console.log("退出获取音乐的名字中间件")
  },async(ctx,next)=>{
    console.log("退出获取音乐的类型中间件")
    ctx.data.musicType = 'xiaobai'// 获取音乐的类型
    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 = '悬疑'// 获取电影的类型
    await next() // 执行下一中间件
    ctx.body = {
       data: ctx.data
    } // 将数据返回给小程序,用ctx.body
    console.log("退出获取电影的类型中间件")
  }
  )

  return app.serve()
 
}
查看云端日志,进一步理解koa洋葱模型
 
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。