Пустой документ обновляется на angularfire, только когда документ добавлен через Python Firebase SDK - PullRequest
1 голос
/ 19 сентября 2019

Я абсолютно новичок в пожарной и угловой, но после нескольких дней работы мне удалось написать ионное / угловое веб-приложение, которое использует Google Firestore в качестве бэк-энда.

Приложение простопоказывает обновления в реальном времени каждый раз, когда запись добавляется / удаляется / обновляется в firestore.

Я реагирую на изменения в БД, подписавшись на valueChanges:

  itemSubscription;

  private itemsCollection: AngularFirestoreCollection<Item>;
  items: Observable<Item[]>;

  constructor(private afs: AngularFirestore) {

    this.itemsCollection = afs.collection<Item>('zones/Zone1/trashdumps');
    this.items = this.itemsCollection.valueChanges();

    // subscribe() is used to get a stream of updates.
    this.itemSubscription = this.items.subscribe(
      //function invoked on every new collection snapshot
      (docs) => {
        docs.forEach( doc => {
          console.log('Current data:', doc);
        })
      },
      //function invoked on error
      (msg) => { console.log('Error Getting Location: ', msg); }
    );

Типичная записьмоя база данных выглядит примерно так:

{
    "bags": 
    {
        "integerValue": "2"
    },
    "location": 
    {
      "geoPointValue": 
      {
        "latitude": 52.3696,
        "longitude": 4.86561111
      }
    }
  }

Когда я добавляю записи в firestore вручную через веб-консоль google firestore, мое приложение получает правильные обновления.

Когда я добавляю записи в firestore через Rest APIмое приложение получает правильные обновления.

Когда я добавляю записи в firestore с помощью модуля python firestore-admin, мое приложение получает пустое обновление.ВНИМАНИЕ: пусто только обновление в реальном времени, полученное при создании записи!Если я просто перезагружаю свое приложение и снова запрашиваю базу данных, я получаю правильную запись!Запись в db, написанная python, правильна с любой точки зрения.

Вот что я имею в виду для «правильного обновления» (взято с консоли Chrome):

tab2.page.ts:50 Current data: Object
                              bags: 2
                              location: GeoPoint {_lat: 52.3696, _long: 4.86561111}
                              __proto__: Object

Это вместо"emtpy", неправильное обновление:

tab2.page.ts:50 Current data: Object
                              __proto__: Object

Я уже пытался подписаться на snapshotChanges () вместо valueChanges ().Метаданные действительно присутствуют, но для получения полей нет метода .data ().Также пусто.

Вот как я добавляю записи в Firestore в Python (упрощенно):


class MyPoint(object):
    def __init__(self, bags, lat, long):
        self.bags = bags
        self.location = GeoPoint(lat, long)

    @staticmethod
    def from_dict(source):
        # ...
        pass

    def to_dict(self):
        # ...
        return {
            'bags': self.bags,
            'location': self.location
        }

class MyDatabase(object):

    _firebaseConfig = {
        [...]
    }

    def __init__(self):
        # Use the application default credentials
        cred = credentials.ApplicationDefault()
        firebase_admin.initialize_app(cred, self._firebaseConfig)
        self.db = firestore.client()

    def send(self, point): 
        self.db.collection(u'mycollection').add(point.to_dict())

point = MyPoint(1,0.0,0.0)
db = MyDatabase()
db.send(point)

Я что-то не так делаю?Возможно ли, что firestore-admin выполняет создание записи в два этапа, сначала создавая пустую запись, а затем значение для нее?Что бы это объяснить?

Надеюсь, это понятно, спасибо за любую помощь, действительно новичок с этим.

Обновление

Я более точно вошел в систему, что происходит, когда я подписываюсь на DocumentChangeAction Observablesи я еще больше запутался.

В следующем журнале «Doc» представляет DocumentChangeAction, а «data» представляет фактическое тело документа .payload.doc.data ().

Начиная с пустой базы данных, это обновления, которые я получаю, когда добавляю первую точку:

tab2.page.ts:49 Current Doc: {type: "added", payload: {…}}
tab2.page.ts:50 Current data: {}
tab2.page.ts:49 Current Doc: {type: "modified", payload: {…}}
tab2.page.ts:50 Current data: {bags: 1, location: GeoPoint}

Действительно, пустое «добавить» и последующее «изменить».Я мог бы справиться с этим.

Но это то, что я получаю, когда добавляю вторую точку («bag = 8»):

tab2.page.ts:49 Current Doc: {type: "modified", payload: {…}}
tab2.page.ts:50 Current data: {bags: 1, location: GeoPoint}
tab2.page.ts:49 Current Doc: {type: "added", payload: {…}}
tab2.page.ts:50 Current data: {}
tab2.page.ts:49 Current Doc: {type: "modified", payload: {…}}
tab2.page.ts:50 Current data: {bags: 1, location: GeoPoint}
tab2.page.ts:49 Current Doc: {type: "modified", payload: {…}}
tab2.page.ts:50 Current data: {bags: 8, location: GeoPoint}

Это слишком много: 4 обновления.

  1. Запись предыдущая изменена по некоторым причинам.Возможно, метаданные, а не поля
  2. Пустое добавление выполнено
  3. предыдущая запись отправляется снова (?)
  4. Наконец обновление для новогозапись отправлена ​​с данными

Это только у меня так или это действительно излишне сложно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...