Mongoose异步查询结果赋值变量失效问题及解决方法
解决Mongoose查询后变量赋值失效(输出undefined)的问题
我太懂你踩的这个坑了——这完全是JavaScript异步代码的执行顺序在搞事情!
为什么初始代码会输出undefined?
你的初始代码里,projectsModel.find()是个异步操作:它会发起数据库查询,但不会阻塞后续代码的执行。而你后面的console.log(projectsDocument)是同步代码,会在数据库查询完成、回调函数执行之前就跑起来。这时候projectsDocument还没被赋值,自然输出undefined。
拆解下初始代码的执行顺序:
- 声明空变量
projectsDocument和categoryDocument - 调用
projectsModel.find(),发起异步数据库请求,JavaScript直接跳过这个回调,继续往下执行 - 执行
console.log(projectsDocument),此时回调还没触发,变量还是初始的undefined - 一段时间后数据库查询完成,回调函数执行,才给
projectsDocument赋值,但这时候console.log早就执行完了
为什么修改后的代码能解决问题?
你改成async/await结合.then()的写法后,await关键字会让JavaScript暂停当前函数的执行,直到projectsModel.find()这个异步操作完成、拿到结果后再继续。这样.then()里的赋值操作会在查询完成后执行,后续如果需要使用projectsDocument,它就已经有正确的值了。
补充一个更简洁规范的写法
其实可以不用.then(),直接用await接收查询结果,搭配try/catch处理错误,代码会更清晰:
router.get('/', async(req, res, next) => { try { // 直接用await接收find()的返回值,无需回调或then const projectsDocument = await projectsModel.find({}); // 这里可以放心使用projectsDocument了 console.log(projectsDocument); // 比如把数据传给前端 res.json(projectsDocument); } catch (error) { console.error('查询出错:', error); next(error); // 把错误传递给错误处理中间件 } });
内容的提问来源于stack exchange,提问作者Amir Mohammad Rivand
相关产品推荐
相关产品推荐

