文章目录

  • 1.引入
  • 2.需求举例
  • 3.错误例子
  • 4.分析错误
  • 5.尝试解决方法
  • 6.解决方法、代码及结果
  • 6.后记

1.引入

最近在搞小程序,采用的是微信云开发云函数作为后端,云函数是nodejs开发,但是因为不是很会nodejs,导致遇到一个印象深刻的bug与知识点,在此记录下来。
知识点比较浅显,大佬看了的话见笑了,这里更多是做个笔记

2.需求举例

集合中有category与items,如下
category

items

需要通过用户输入的cname字段找出属于此类的项,如上:通过用户输入的美食找出宫保鸡丁、回锅肉、鱼香肉丝返回给前端。

3.错误例子

  • 代码

前端
index.wxml

<view class="btnview"><button type="primary" bindtap="callFunc">获取美食类别下的美食</button>
</view>

index.js

Page({callFunc:function(){wx.cloud.callFunction({name: 'quickstartFunctions',data: {type: 'index/index',cname:'美食'}}).then((res) => {console.log(res)})}
})

云函数

const cloud = require('wx-server-sdk');
cloud.init({env: cloud.DYNAMIC_CURRENT_ENV
});
const db = cloud.database();
/*
1.通过 cname参数查询category集合中的cid
2.再通过获取的cid查询items下属于该类别的项
3.返回获取该类别的项
*/
exports.main = async (event, context) => {var cname = event.cname;return await db.collection('category').where({cname:cname}).get().then(res=>{console.log(res)db.collection('items').where({cid:res.data[0]._id}).get().then(res=>{console.log(res)return res // 返回查找所属cname的项});});
};
  • 运行结果

云函数:

前端:

通过前端的输出发现,虽然云函数查找到了所属美食的项并且写了return这查找的列表代码,但是前端输出的确实undefined,经过排查,发现是云函数的代码问题

4.分析错误

db.collection…查询数据库是异步操作,虽然如上代码云函数前有return await,但是这里是两个db操作,发生了两次异步,而只await了一次

await只会等待红色框的异步操作,而青色框内的异步操作则不会等待,程序运行到青色的db时会跳过直接运行接下来的代码,而接下来没有代码了,所以会直接返回,而不会等待青色框内的异步return结果,所以前端得到的结果是undefined

5.尝试解决方法

既然不会等待青色框的异步,那么我想着在db前加上await,结果是代码编译报错,这样的写法是错误的

6.解决方法、代码及结果

  1. 解决方法,在CSDN网站搜索相关知识点后,得知await只能在声明了async的function中才有效,那么只好用function封装一下或者在then的作用域内用async声明才可以使用await
  2. 代码
    方式一:另写一个function
const cloud = require('wx-server-sdk');
cloud.init({env: cloud.DYNAMIC_CURRENT_ENV
});
const db = cloud.database();
/*
1.通过 cname参数查询category集合中的cid
2.再通过获取的cid查询items下属于该类别的项
3.返回获取该类别的项
*/
exports.main = async (event, context) => {var cname = event.cname;return await db.collection('category').where({cname:cname}).get().then(res=>{console.log(res)return getItems(res)});
};
// await 只能用在声明了async的函数中
async function getItems(res){return await db.collection('items').where({cid:res.data[0]._id}).get().then(res=>{console.log(res)return res // 返回查找所属cname的项});
}

方式二:在then的作用域内用async声明

const cloud = require('wx-server-sdk');
cloud.init({env: cloud.DYNAMIC_CURRENT_ENV
});
const db = cloud.database();
/*
1.通过 cname参数查询category集合中的cid
2.再通过获取的cid查询items下属于该类别的项
3.返回获取该类别的项
*/
exports.main = async (event, context) => {var cname = event.cname;return await db.collection('category').where({cname:cname}).get().then(async(res)=>{ // 声明asyncconsole.log(res)// 这样写法,代码较紧凑和乱return await db.collection('items').where({cid:res.data[0]._id}).get().then(res=>{console.log(res)return res // 返回查找所属cname的项});});
};

3.这样写后,前端能得到正确数据了

6.后记

  1. 这是我个人的写法,可能不太正确,如果有更好的方法欢迎指导
  2. 简单的笔记
    个人认为
    声明了async的function,在里面可以执行同步或异步代码,异步代码可以用await变成同步代码.
    await只能使用在async声明的函数里,不能使用在普通函数里。

参考BLOG链接:CSDNBLog:async、await个人使用理解

微信小程序云函数NodeJs如何等待两次异步操作后返回数据给前端相关推荐

  1. 微信小程序云函数操作云数据库Mysql

    微信小程序云函数操作云数据库Mysql 参考一 参考二 云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写.一键上传部署即可运行后端代码. 小程序内提供了专门用于云函数调用的 API.开发 ...

  2. 微信小程序云函数构建npm,找不到node_modules以及后续出现上传所有文件,并没有上传node_modules的文件问题

    最近研究下微信小程序云函数,在构建npm的时候困扰了很久,总是提示找逼到node_modules,之前一直也没接触过nodejs,不想购买服务器,选择尝试下云开发. 出现这个错误在网上找了很多,都没找 ...

  3. 微信小程序云函数服务器,微信小程序云函数使用的几点说明

    微信小程序云函数是一个好东西,相当于微信为我们提供了一个可以跑node.js的服务器,并且可以外部通过API的方式调用云函数,不过微信的文档一向写的不明不白,初学的时候踩了不少坑,在这里记录下来. 1 ...

  4. 微信小程序云函数使用教程【超详细】

    背景需求 在本人的项目中,需要调用一个http的接口,而微信小程序所有的网络请求都得使用https,因而需要一个中转站,使得在正式发布的时候可以使用http接口.(在调试环境下,只要在本地设置里勾选& ...

  5. 微信小程序云函数中的数据处理后返回

    微信小程序云函数中的数据处理后返回 本文主要演示的是,在微信云函数中调用数据库后,如何对获取的内容在云函数内处理后返回. 主函数 exports.main = async (event, contex ...

  6. 微信小程序云函数--数据库集合使用

    微信小程序云函数--数据库集合使用 1.首先,准备和配置好云函数的路径和文件信息 参考我的上一篇:https://blog.csdn.net/u010326875/article/details/10 ...

  7. 微信小程序云函数开发环境 node.js的安装参考

    微信小程序云函数开发环境 node.js的安装参考 下载:nvm-windows 下载下图安装包,地址在: https://github.com/coreybutler/nvm-windows/rel ...

  8. 微信小程序云函数传递数组_微信小程序云开发一周入门

    作为一个程序员,一直想自己做一款程序,无奈工作以来一直做的是数据处理的工作.数据库用的挺溜,但前端就两眼一抹黑了.早在微信小程序刚出来的时候,就关注过,但考虑到前端后端的种种因素,一直没太做深入的了解 ...

  9. 微信小程序云函数获取近七天或近一个月的数据,使用云开发已修复时区的问题

    使用了云开发的微信小程序,就不能方便地用mysql的to_days函数处理,获取关于时间的数据 思路: 查询微信小程序文档后考虑使用聚合操作 不可能只是去获取一个固定时间,而是一个区间的时间段 Com ...

最新文章

  1. 操作系统学习笔记 第六章:设备管理(王道考研)
  2. 网页、网站规划与设计1
  3. php java memcached_php和java的memcached使用的兼容性问题解决过程
  4. 设计模板类,使得在创建一个对象时可以动态确定它的基类(public)
  5. python初学者视频-python从入门到精通视频(全60集)
  6. spark集群测试小案例
  7. 深入浅出解释深拷贝、浅拷贝、对象拷贝、引用拷贝原理和应用
  8. Linux-Ubuntu部署Springboot项目应用到生产环境(jar方式)
  9. python银行家算法_Linux 死锁概念与银行家算法python 实现
  10. 在10万以内判断,一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数,求该数...
  11. 打造Vim作为前端IDE
  12. vue中的watch监听
  13. QAM调制原理_锁相环(PLL)基本原理 PLL电路常见构建模块
  14. python九宫格拼图游戏
  15. 【考研复习】《操作系统原理》孟庆昌等编著课后习题+答案——第四章
  16. 46相关度评分TFIDF算法
  17. 困扰了已久的TCP/IP 协议,终于有人讲的明明白白,太强了
  18. 扫码进入微信小程序使用WIFI进行UDP通信发送消息
  19. JVM StackOverFlowError
  20. html和word相互转换

热门文章

  1. JQ拖曳事件mouseup失效的解决办法
  2. 基于STM32F103ZET6的多路复用模拟开关设计
  3. 还不懂vue-cli构建SPA项目和SPA项目结构吗?赶紧看看这一篇
  4. Windows 7 Boot Updater 如何使用
  5. c语言if语句知识点总结,c语言中if语句知识点总结.docx
  6. pion/ion搭建
  7. DJ编曲用什么软件,DJ编曲教需要哪些步骤
  8. STM32与人体红外感应模块的简单使用——入门级
  9. 接入层、汇聚层和核心层工业交换机怎么选?
  10. Lua 5.1.3源代码分析之词法分析[1]