小程序·云开发是小程序的一种后端开发模式,可以帮助开发者快速构建微信小程序的后端服务,无需再搭建服务器。数据库
然而熟悉云开发的开发者应该了解,即便云开发能基本知足小程序开发需求,但在数据获取上仍是有所限制。小程序
为了防止误操做以及保护小程序体验,开发者是须要避免一次性获取过量的数据,只获取必要的数据,因此服务器一次默认而且最多返回 20 条记录。但对于有数据大量获取需求的开发者来讲,只能放弃云开发吗?答案是no。后端
微信团队以前在云课程上就已经分享了打破数据库列表限制的2种方法,经过云函数最多可得到100条数据。(若是你也想上这类干货课程,能够点击连接填问卷,咱们将根据你们的需求肯定课程内容,并将于近期上线课程,敬请关注公众号。)微信小程序
此次的方法分享是以音乐播放器小程序为实例,经过云函数调用云数据库,实现用户上传音乐的功能。promise
音乐播放器的核心功能是播放歌曲,也就是须要它可以获取数据库所存储的歌曲信息,而后传到小程序端,去实现播放器的播放、暂停、切换。服务器
歌曲信息包括id、歌曲名、歌手、封面、音频文件等。微信
playlist: [{ _id: '', cover: '', singer: '', title: '', src: '' }],
getlist(){ let that = this; wx.cloud.callFunction({ name: ’getmlist’,//本身的云函数名称 success: res=>{ wx.stopPullDownRefresh() if(res.result){ let playlist = res.result.data console.log({ playlist }) if(playlist = undefined playlist.length == 0){ wx.showToast({ title: ’no data’, }) }else{ that.setData({ isShowArtcle: true, playlist: playlist, }) } } }, fail:err => { wx.stopPullDownRefresh() wx.showToast({ title: ’no data’, }) } }) }
然而目前的作法只能获取20条数据,也不能支持用户上传音乐文件并正常加载播放。为了实现这一功能,须要咱们设置云函数,调用云数据库,从而打破数据限制。async
这个方法是将数据分为若干页,用户能够经过选择页数去获取更多的数据。这也就须要指定skip,设置分页,从第 0 条记录开始取。假设一页 10 条,如今要取第 2 页,则能够指定 skip 10 条记录。函数
代码示例以下:ui
//云函数入口文件 const cloud = require('wx-server-sdk') cloud.init() //云函数入口函数 exports.main = async (event, context) => { const db = cloud.database() db.collection('musiclist') .where({ // 填入当前用户 openid _openid: 'xxx', }) //假设一页有10条数据 .skip(10) .limit(10) .get() .then(res => { console.log(res.data) }) .catch(err => { console.error(err) }) }
这个方法是用户能够直接获取全部数据,但由于默认limit100条,可能一个请求没法取出全部数据,因此须要分批次获取,将集合中的全部歌曲信息获取出来。
代码示例以下:
//云函数入口文件 const cloud = require('wx-server-sdk') const db = wx.cloud.database() cloud.init() //云函数入口函数 exports.main = async (event, context) => { getall:async(){ const db = wx.cloud.database const Max_limit = 100 // 先取出集合记录总数 const countResult = await db.collection('musiclist').count() const total = countResult.total // 计算需分几回取 const batchTimes = Math.ceil(total / Max_limit) const tasks = [] for(let i = 0; i < batchTimes; i++) { const promise = db.collection('musiclist').skip(i * Max_limit).limit(Max_limit).get() tasks.push(promise) } // 等待全部 return (await Promise.all(tasks)).reduce((acc, cur) => { data: acc.data.concat(cur.data), errMsg: acc.errMsg, }))) } }
这两类方法,本质上是屡次经过云函数获取数据,最终成功获取全部集合数据。
由于云函数端属于管理端,因此它能够统计全部集合的记录数。同时云函数之间也可互相调用,还能经过云函数后端 SDK 搭配使用多种服务,在数据获取上有着必定的优点。当你们在使用云开发时,不妨多利用云函数进行数据库和存储的操做。
扫码关注公众号,回复关键词『音乐』,就能获取本次实例音乐播放器的源码包。