Я абсолютно новичок в пожарной и угловой, но после нескольких дней работы мне удалось написать ионное / угловое веб-приложение, которое использует 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 обновления.
- Запись предыдущая изменена по некоторым причинам.Возможно, метаданные, а не поля
- Пустое добавление выполнено
- предыдущая запись отправляется снова (?)
- Наконец обновление для новогозапись отправлена с данными
Это только у меня так или это действительно излишне сложно?