【问题标题】:How to trigger onCreate() when a new field is created in an existing Firestore document?在现有 Firestore 文档中创建新字段时如何触发 onCreate()?
【发布时间】:2020-08-08 20:35:44
【问题描述】:

当在现有 Firestore 文档中创建字段时,我想在 firebase 实时数据库中创建一个新节点。

我一直在尝试这个:

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},这将使我的代码完美运行,因为没有立即添加文档字段。

这是我的 Firestore 结构的屏幕截图:

文档的4个字段分2批更新。

首先添加 EMAIL 和 timeCreated 字段,然后创建文档。 而另一方面,phoneData 和 username 字段在 Email 和 timeCreated 5 秒后被创建 [未更新]。

因此,如果我在路径 Users/{UserID} 上使用 onCreate(),它将返回 UNDEFINED 到我的实时数据库,因为在那一刻用户名字段不存在。

有没有办法在文档的特定字段上应用onCreate()

[我这样做是为了创建一个包含用户名和 UID 的单独节点,这是为了在新用户尝试注册时检查用户名是否存在] 因此,如果节点是使用值 undefined 创建的,这将是一个问题。

会是这样的:

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-firestore


    【解决方案1】:

    首先添加 EMAIL 和 timeCreated 字段,然后创建文档。而另一方面,phoneData 和 username 字段在 Email 和 timeCreated 5 秒后被创建 [未更新]。

    创建文档后,无论添加了哪些字段,都将被视为对该文档的更新操作。正如您在问题中提到的,将不会有字段名称为 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})
        }
    
    })
    

    【讨论】:

    • 为什么 4 次调用..?
    • 至少要花费 2。因为这些字段正在被一一添加。如果添加了电子邮件,则添加用户名。这些将调用 2 次​​span>
    • emailtimecreated 在创建文档时添加。? username 将在您创建文档后添加。对吗?所以它只需要一次函数调用
    • 一开始不会有任何文件。 emailtimeCreated 将使用 .set() 添加,这将创建文档。文档名称是用户 UID。然后在 5 秒后(时间不同)。 usernamephoneData 将使用 set() 从我的 Android 应用程序中使用 SetOptions.merge() 添加,这样它就不会删除 n 次创建的电子邮件
    • Setoption.merge() 如果文档已经存在,则无论您添加什么字段,无论该字段是否已存在,都将被视为 Firestore 更新
    猜你喜欢
    • 2019-02-13
    • 2019-11-07
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2019-06-27
    • 2020-11-05
    相关资源
    最近更新 更多