刚用云开发,我不知道小程序数据库有没有嵌套查询的语句,所以我只能用最笨的方法,查找出来循环再查找,好,接下来,问题就是,你查找出来了没有,查找出来的值是什么类型的值,我弄这个问题整整弄了一天,我刚开始直接在小程序端弄的,能弄出数据来,但是我这个好像是顺序查询,会出现延迟的情况,当我还没查询完就已经把数据显示出去了,导致我部分数据是没法显示出来的,因为我看到appData里面的数据刚以刷新页面的时候,数据是不完善的,只获取到了顺序查询中的第一个数据,后面的还全部没渲染出来,虽然我console.log(res)能显示全部数据,过一会点回appData,数据就又全部显示了,但是我的页面已经显示完了。所以我就认为它是数据延迟,我就觉得必须把所有查询出来再传值。这算不算同步?所以我就想到要在云函数中弄,这里有一个坑,对于新手来讲
每次修改了云函数中的代码,记得上传并部署,要不然就跟没改一样,一开始我以为上传一次就够了(新建它自动帮忙上传了),后面不管我怎么改都没显示出什么。
先说一下我嵌套查询的是什么吧
从一个group中获取到list(group),循环这个list(group),取得carid去表carMsg取得对应的carMag数据,再取得前条carMsg数据表中openid去获取user。不知道描述清楚了没有,group->carMsg->user,最后拼接我自己想要的数据,返回一个对象出来就好了,因为返回的可能是列表,所以,这个要注意。弄到想吐血。我的是列表,如果是单挑数据的就不用考虑把数据插入列表中,直接把查找出来的数据直接return就可以,接下来上代码:
// 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init() const db = cloud.database() // 云函数入口函数 exports.main = async(event, context) => { const wxContext = cloud.getWXContext() // 这里获取到的 openId 和 appId 是可信的 //直接通过wxcontext获取该用户的openid const openid = wxContext.OPENID //承载所有读操作的promise的数组 const list = [] //接下来是开始查询,先根据openid获取到相关的group,这里获取的是列表 await db.collection('group').where({ _openid: openid, group_reveal: 0 }).get().then(res => { //循环查询到的列表,对每个列表进行对应数据的查询 for (let i = 0; i < res.data.length; i++) { //per1用来定义最终的我想要的对象,插入结果list中的对象,根据对应的caricd得到carMsg对象 let per1 = db.collection('carMsg').where({ _id: res.data[i].carMsg }).get().then(ce => { //根据carMsg对象中的openid获得user对象 return db.collection('user').where({ _openid: ce.data[0]._openid }).get().then(ue => { //声明对象,为下面拼接对象用 const per = {} //拼接自己想要的信息 per.groupid = res.data[i]._id per.openid = res.data[i]._openid per.carid = res.data[i].carMsg per.endPoint = ce.data[0].carMsg.endPoint per.lowNum = ce.data[0].carMsg.lowNum per.estimate = ce.data[0].carMsg.estimate per.people = ce.data[0].carMsg.people per.nickName = ue.data[0].nickName per.avatarUrl = ue.data[0].avatarUrl // 返回对象 return per }) }) //加入到列表中 list.push(per1) } }) return (await Promise.all(list)) }
//小程序端 onLoad: function(options) { var that = this wx.cloud.callFunction({ name:'groupMsg', //这个是云函数名 success:function(e){ console.log("成功",e) that.setData({ list:e.result //设置值 }) },fail:function(e){ console.log("失败", e) } }) },
总感觉我写复杂了,刚开始我在(下面代码注释处)
for (let i = 0; i < res.data.length; i++) {
let per1 = db.collection('carMsg').where({
//这里_id: res.data[0].carMsg,我的0没换回i也是照样可以找出数据的,不知道为什么
_id: res.data[i].carMsg
}).get().then(ce => {
新手入坑,多多指教。