Mon goose .find () = Query, но когда Query завершится? - PullRequest
1 голос
/ 13 марта 2020

Это просто общий вопрос, но я могу привести пример, если это необходимо. Недавно я работал над стековым приложением MongoDB / Mon goose, Node.JS, Express и Handlebars, и столкнулся с некоторыми проблемами, связанными с тем, что передается с моего маршрута на сторону клиента при работе с Пн goose .find () запросов.

Я предпочитаю asyn c, жду своих запросов. У меня есть глубоко вложенный запрос, который объединяет все необходимые данные в один объект. Это очень упрощенная разбивка того, что я делаю

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)); и добавленные мной свойства отсутствуют!

I Мне интересно, как новые свойства, которые я добавил, могут пройти, когда я отправляю объект, но не могут пройти, когда я отправляю JSON? Декодирование - это последнее, что я делаю перед рендерингом страницы, так что дело не в том, что мой код не в неправильном порядке. Я добавляю свойства к объекту и затем декодирую его.

Некоторые исследования привели меня к выводу, что Model.find ({}) не возвращает нативный объект JavaScript, а вместо этого Query. Я предполагаю, что это определяемый пользователем тип данных класса, который имеет особое поведение. Мое предположение состоит в том, что между переходом от внутреннего интерфейса к внешнему есть некоторый средний шаг, когда запрос выполняет свою окончательную обработку.

Также произошла противоположная ситуация. В качестве решения этой проблемы я декодировал Query finalObject сразу после Model.find ({}) и перекодировал его в собственный JavaScript объект. После этого я сделал все свои расчеты, прикрепил результаты в качестве свойств к документам и отправил эту новую версию в качестве основного finalObject (я все еще также отправлял отдельный декодированный объект для использования на стороне клиента JavaScript).

Это решило проблему отсутствия новых свойств. Они появились, но на этот раз декодированный и затем перекодированный finalObject не обладал виртуальными свойствами моих Моделей. Основная модель имеет виртуальное свойство, которое вычисляет некоторые из ее других свойств. Как будто эта часть запроса не была выполнена в процессе .find ({}). Итак, когда я декодировал finalObject, виртуальные свойства никогда не существовали и никогда не декодировались.

Может кто-нибудь объяснить мне, что происходит? Спасибо!

...