Meteor-React: GroundDB внезапно опустел

[EDIT] обновлен до Ground DB v2, сделал код более читабельным

Я пытаюсь использовать GroundDB в своем проекте, поэтому мое приложение Meteor-React Cordova также может работать в автономном режиме. В основном контейнере у меня есть следующий код:

let fullyLoaded = new ReactiveVar(false);
let subscribed = false;
let subscribedOnce = false;
let checking = false;

export default createContainer(() => {

    if(Meteor.status().connected && !subscribedOnce && !subscribed){
        subscribed = true;
        console.log("subscribing");
        Meteor.subscribe("localization",
            ()=> {
                localizationGrounded.keep(Localization.findNonGrounded());
                console.log("everything has been loaded once.");
                console.log("Localization count after subscription: " + Localization.find().fetch().length);

                fullyLoaded.set(true);
                subscribed = false;
                subscribedOnce = true;
            }

        );
    }
    if(fullyLoaded.get()){
        console.log("Localization Count: " + Localization.find().fetch().length)
    }
    return {
        isLoggedIn: !!Meteor.userId(),
        isLoading: !fullyLoaded.get() || subscribed,

    };
}, Main);

Этот код должен подписаться на "локализацию", если он еще не был загружен. Коллекция локализации реализована следующим образом: методы find() и findOne() были перезаписаны для вызова find() для заземленной БД:

export const Localization = new Mongo.Collection('localization');

if(Meteor.isClient){
    export let localizationGrounded = new Ground.Collection('localization', {
        cleanupLocalData: false
    });


    //rename find() to findNonGrounded
    Localization.findNonGrounded = Localization.find;

    localizationGrounded.observeSource(Localization.findNonGrounded());

    Localization.find = function(...args){
        console.log("finding from ground db");
        return localizationGrounded.find(...args);
    };

    Localization.findOne = function(...args){
        console.log("finding one from ground db");
        return localizationGrounded.findOne(...args);
    }
}

Это, однако, производит следующий вывод:

subscribing
everything has been loaded once
finding from ground db
Localization count after subscription: 28
finding from ground db
Localization count: 28

Выглядит хорошо, правда? К сожалению, функция createContainer() вызывается еще раз сразу после этого, что приводит к

...
Localization count: 28
//Lots of "finding one from ground db" indicating the page is being localized correctly
finding from ground db
Localization Count: 0
//more "finding one from ground db", this time returning undefined

Пожалуйста, помогите мне исправить это. заранее спасибо

Taxel

1 ответ

Решение

Насколько мы исследовали (и тем временем нашли ваш вопрос), это не ошибка GroundDB.

В настоящее время мы работаем над чем-то похожим: также приложением Cordova, которое пытается сохранить в автономном режиме около 30 различных коллекций и также использует React (но с Mantrajs). Так как сегодня мы почти уверены, что именно так функционирует Метеор, стирая данные из Коллекций, я попытаюсь объяснить себя:

Кажется, что Метеор каким-то образом обнаруживает, что Коллекции не используются, и просто почти сразу удаляет все данные, затем GroundDB удаляет данные также из IndexedDB. Мы загрузили код GroundDB, добавили его в наш проект Meteor и проверили его, обнаружив предыдущее поведение.

В настоящее время мы пытаемся найти какой-то способ определить, когда коллекция полностью стерта, какое-то свойство в Meteor Collection, которое может сказать нам, что оно будет очищено, чтобы мы могли исправить код GroundDB и НЕ удалять из него данные IndexedDB. дело.

Другой вариант, который мы пытаемся использовать, - использовать этот компонент: https://github.com/richsilv/meteor-dumb-collections

Похоже, что он очень похож на GroundDB, но никогда не синхронизирует локальные данные с Meteor Server, пока вы не вызовете функцию синхронизации, поэтому использовать ее нам и нашим 30 коллекциям будет сложнее:)

Надеюсь, это поможет вам.

Другие вопросы по тегам