Неправильные отметки времени изменения функции облака в Firebase - PullRequest
1 голос
/ 11 марта 2019

мы создаем систему, в которой изменения в Firestore производят PubSub-сообщение, на которое могут воздействовать другие компоненты.

События Firestore используются для реализации этого.Система хранит историю изменений для каждого документа как вложенную коллекцию документа.Чтобы уменьшить размер PubSub-сообщений, мы отправляем только ссылки на документы в этом подколлекции.Один до и один после изменения.Чтобы наша функция не тратила время на запросы, чтобы выяснить, каким было последнее состояние, мы используем метки времени для событий изменения в качестве идентификаторов.

env.ts:

import * as functions from 'firebase-functions';
import {handler} from '@handlers/rootCollection';

//noinspection JSUnusedGlobalSymbols
export const handlerFunction = functions.firestore
    .document('rootcollection/{documentID}')
    .onWrite(handler.process.bind(handler));

rootCollection.ts:

import {DocumentSnapshot} from 'firebase-functions/lib/providers/firestore';
import {Change, EventContext} from 'firebase-functions';

interface MessageI extends Object {
    eventID: string;
    ref: string;
    beforeID: string | null;
    afterID: string | null;
    fcfReceived: number | null;
}

class WriteHandler {
    public name: string;

    public constructor(name: string) {
        this.name = name;
    }

    public async process(change: Change<DocumentSnapshot>, context: EventContext): MessageI {
        const afterExists = change.after.exists;
        const beforeExists = change.before.exists;
        const afterID = afterExists ? change.after.updateTime.toMillis().toString() : null;
        const beforeID = beforeExists ? change.before.updateTime.toMillis().toString() : null;

        return {
            'eventID': context.eventId,
            'ref': change.before.ref.path,
            'beforeID': beforeID,
            'afterID': afterID,
            'fcfReceived': Date.now()
        };
    }
}

export const itinerariesHandler = new WriteHandler(
    'rootCollectionHandler'
);

Теперь мы очень удивлены, что данные правильно отражают состояния до и после, но метка времени выглядит как метка after.timestamp.

Опубликованное сообщение 429345402459000 к теме,Сообщение:

{
  "eventID":    "389fe158-115a-43ca-9fdd-ec9737af066f-0",
  "ref":        "collection/VMDcsHirbB2coyaXF5wZ",
  "beforeID":   "1552298315479",
  "afterID":    "1552298315479",
  "fcfReceived": 1552298315575,
}

Кажется нелогичным, что change.before.updateTime содержит время, когда изменение было сделано.Но я не могу найти явного упоминания в документации.

Предназначено ли это поведение?Есть ли другой способ найти уникальный идентификатор для состояния "до"?

С уважением, Карстен

1 Ответ

1 голос
/ 25 марта 2019

firebaser here

Это ошибка в привязках Firestore для облачных функций.Это действительно устанавливает before.updateTime и after.updateTime на одно и то же значение.

Мы подали ошибку внутренне, чтобы исправить это.Но пока нет времени для того, чтобы это исправление было доступно.

До этого момента лучшее, что я могу придумать, - это добавить поле lastUpdated к данным документа и проверить, что это текущая сторона сервера.отметка времени в ваших правилах безопасности.Таким образом, вы можете получить before.data().lastUpdated и after.data().lastUpdated для сравнения.Это должно как минимум позволить вам реализовать поведение, пока проблема не будет устранена.

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