刚用云开发,我不知道小程序数据库有没有嵌套查询的语句,所以我只能用最笨的方法,查找出来循环再查找,好,接下来,问题就是,你查找出来了没有,查找出来的值是什么类型的值,我弄这个问题整整弄了一天,我刚开始直接在小程序端弄的,能弄出数据来,但是我这个好像是顺序查询,会出现延迟的情况,当我还没查询完就已经把数据显示出去了,导致我部分数据是没法显示出来的,因为我看到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 => {
新手入坑,多多指教。