Как вызвать onCreate () при создании нового поля в существующем документе Firestore? - PullRequest
0 голосов
/ 25 апреля 2020

Я хочу создать новый узел в базе данных реального времени firebase при создании поля в существующем документе Firestore.

Я пробовал это:

exports.addUserCredentials = functions.firestore
    .document(`Users/{UserID}/{username}`)
    .onCreate((snapshot, context) => {
        const newUserData = snapshot.data()
        const newUserUsername = newUserData
        const newUserUidDoc = context.params.UserID

        return admin.database().ref(`/userCredentials/${newUserUsername}`).set({"UID": newUserUidDoc})
    })

Я искал в Интернете, я увидел, что путь должен быть направлен только к документу, а не к коллекции. НО username в пути - ПОЛЕ в документе.

Я получаю эту ошибку при развертывании, и я видел все подобные вопросы, но те, на которые я не совсем ответил:

!  functions: failed to update function addUserCredentials
HTTP Error: 400, The request has errors

Причина в том, что я не могу изменить мой путь на Users/{UserID}, что сделает мой код безупречным, если поля документа не добавляются сразу.

Вот снимок экрана с моей структурой пожарного депо:

enter image description here

4 поля документа обновляются в 2 пакетах.

Сначала добавляются поля EMAIL и timeCreated, и они создают документ. С другой стороны, phoneData и username являются полями, СОЗДАННЫМИ [не обновлены] после 5 секунд электронной почты и timeCreated.

Так что, если я использую onCreate() на пути Users/{UserID}, он вернет UNDEFINED моя база данных реального времени в качестве поля имени пользователя в этот момент ОТСУТСТВУЕТ.

Можно ли применить onCreate() к указанному c полю документа?

[ I Я делаю это для создания отдельного узла, который содержит имя пользователя и UID, это для проверки, существует ли имя пользователя, когда новый пользователь пытается зарегистрироваться ] Так, если узел создается со значением undefined, это будет выпуск.

Будет так:

1 Ответ

1 голос
/ 25 апреля 2020

Сначала добавляются поля EMAIL и timeCreated, и они создают документ. С другой стороны, phoneData и username являются полями, СОЗДАННЫМИ [не обновлены] через 5 секунд после отправки электронной почты и timeCreated.

Независимо от того, какие поля добавляются после создания документа, он будет считаться как операция обновления для этого документа. Как вы упомянули в этом вопросе, при создании документа не будет поля с именем поля с именем username, содержащего документ. Поэтому невозможно получить значение username, пока вы создание документа.

Согласно вашему объяснению поле username будет доступно только с триггером onUpdate.

Таким образом, код должен быть примерно таким, как показано ниже

exports.addUserCredentials = functions.firestore
.document(`Users/{UserID}`)
.onUpdate((snapshot, context) => {
    const beforeData = snapshot.before.data()
    const afterData = snapshot.after.data()


    if(!beforeData.username && afterData.username){
     return admin.database().ref(`/userCredentials/${newUserUsername}`).set({"UID": newUserUidDoc})
    }

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