首页 > 解决方案 > Mongoose .find() = 查询,但查询何时完成?

问题描述

这只是一个一般性问题,但如有必要,我可以提供一个示例。我最近一直在开发 MongoDB/Mongoose、Node.JS、Express 和 Handlebars 堆栈应用程序,在处理 Mongoose .find() 时,我遇到了一些从路由传递到客户端的问题查询。

我更喜欢异步等待我的查询。我有一个深度嵌套的填充查询,它将我需要的所有数据引入一个对象。这是我所做的非常简化的细分

async function() { const finalObject = await Model.find({}).populate([*alot more populates*]) }

我将它传递到我的 res.render() 路由中,如下所示:

res.render('index', { finalObject });

我的大部分经验都是直截了当的。我在一个单独的堆栈溢出问题中有一个问题,即在一个链中(在不同级别)两次填充相同的模型。我不会在这里解决这个问题。

我决定在将对象传递给路由之前进行一些计算,并将一些新值附加到文档的属性中。这就是事情变得奇怪的地方。我做了一些计算并向文档添加新属性(这些属性不是架构的一部分)。当对象传递到客户端时,我添加的那些属性就可以使用(这里没问题)。

我需要将 finalObject 解码为 JSON 并将其作为 JSON 传递,以便在客户端 JavaScript 中轻松使用数据encodedFinalObject = encodeURIComponent(JSON.stringify(finalObject));

我在客户端对其进行解码:clientSideFinalObject = JSON.parse(decodeURIComponent(encodedFinalObject));我添加的属性不存在!

我想知道,我添加的新属性如何在发送对象时通过但在发送 JSON 时不通过?解码是我在渲染页面之前做的最后一件事,所以这不是我的代码顺序错误的问题。我将属性添加到对象然后对其进行解码。

一些研究让我发现 Model.find({}) 不返回本机 JavaScript 对象,而是返回一个查询。我假设这是具有特殊行为的用户定义类数据类型。我的假设是,在从后端传递到前端之间,有一些中间步骤是 Query 进行最终处理的地方。

也出现了相反的情况。作为解决方案,我在 Model.find({}) 之后立即对 Query finalObject 进行解码,并将其重新编码为原生 JavaScript 对象。之后,我进行了所有计算,将结果作为属性附加到文档中,并将新版本作为主要的 finalObject 发送(我还发送了一个单独的解码对象以供客户端 JavaScript 使用)。

这解决了新属性不存在的问题。它们出现了,但是这次解码然后重新编码的 finalObject 没有我的模型的虚拟属性。主模型有一个虚拟属性,可以计算它的一些其他属性。就好像查询的那部分没有在 .find({}) 进程中执行。因此,当我解码 finalObject 时,虚拟属性从未存在,也从未被解码。

谁能向我解释发生了什么事?谢谢!

标签: node.jsjsonexpressmongoosehandlebars.js

解决方案


推荐阅读