OnSreate firestore не запускается, когда создание выполняется вложенным документом или коллекцией - PullRequest
0 голосов
/ 25 июня 2019

Итак, я создаю приложение чата с использованием флаттера и плацдарма, и мне нужно запускать функцию всякий раз, когда два новых пользователя начинают общаться друг с другом в первый раз (когда один из них отправил первое сообщение), чтобы я мог сохранить эту информацию где-нибудь, чтобы потом показать его пользователям в виде истории чата (людей, с которыми общались).

Итак, мое дерево данных выглядит так: 'rooms / {roomId} / messages / {messageWithRandomId}'

Логически всякий раз, когда пользователь отправляет первое сообщение другому пользователю, создается документ помещения вместе с «подборкой» сообщений, содержащей один документ сообщения с randomId. `

Я настроил прослушиватель OnCreate для коллекции комнаты, и он запускается всякий раз, когда я вручную создаю новый документ в «комнатах».

Но это не срабатывает, когда тот же документ создается вложенной коллекцией.

Итак, мой код выглядит так:

export const testfunction = functions.firestore.document('rooms/{_someRoom}').onCreate(async (snapshot,context) => {

// the function Core
 }

1 Ответ

2 голосов
/ 25 июня 2019

Это не срабатывает, когда тот же документ создается поднабор.

Это нормальное поведение.

На самом деле, если вы создадите документ непосредственно в коллекции messages с полным путем rooms/{roomId}/messages/{messageWithRandomId}, , промежуточные документы не будут созданы (т. Е. Нет roomId документа).

Итак, когда вы говорите:

документ room создается вместе с вложенной коллекцией messages содержащий документ с одним сообщением с randomId

, если вы только создали документ сообщения с randomId, , то документ room фактически не был создан, и, следовательно, облачная функция не сработала .

Консоль Firebase курсивом показывает «документ» комнаты roomId как своего рода «контейнер» (или «заполнитель»), чтобы «материализовать» иерархию и позволить вам перейти к messageWithRandomId документ сообщения, но документ комнаты не существует в базе данных Firestore.


Давайте рассмотрим более общий пример: представьте документ doc1 в коллекции col1

col1/doc1/

и еще один subDoc1 в коллекции subCol1 (sub-)

col1/doc1/subCol1/subDoc1

На самом деле, с технической точки зрения, они совсем не связаны друг с другом. Они просто разделяют часть своего пути, но не более того. Одним из побочных эффектов этого является то, что если вы удаляете документ, его подколлекция (ы) все еще существует.


Это означает, что вы должны либо:

Создайте себе документ roomId в коллекции rooms

OR

запускает вашу облачную функцию с помощью:

export const testfunction = functions.firestore.document('rooms/{_someRoom}/messages/{_someMessage}').onCreate(async (snapshot,context) => {
  //.....   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...