【问题标题】:Cloud Functions for Firebase: How to get event.data.ref.parent.child("xxx").val?Firebase 的云功能:如何获取 event.data.ref.parent.child("xxx").val?
【发布时间】:2017-10-14 18:28:47
【问题描述】:

我在 Firebase 上有这样的结构:

members
 |- -kSjJSDFjl2DFc
          |- isDeleted: true
          |- gender: "male"

在我的云函数中,我写道:

exports.doMemberDeletion = functions.database.ref("/members/{memberId}/isDeleted").onWrite(event => {
    const isDeleted = event.data.val();

    if (isDeleted) {
        const gender = event.data.ref.parent.child("gender").val; // Error here
        console.log("Deleted a " + gender + " member");
    }
});

但是,它在event.data.ref.parent.child().val 上给出错误,请告知在这种情况下如何获取该值。谢谢!

【问题讨论】:

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


    【解决方案1】:

    用户是否有权访问父级?如果不是,请使用 event.data.adminRef 代替 event.data.ref 以不受限制地访问数据库。请参阅the documentation 了解更多信息。

    【讨论】:

    • 在这种情况下,event.data.ref 和 event.data.adminRef 对执行请求的用户具有相同的访问权限,因此在使用引发异常的 snapshot.val() 时它不起作用.
    【解决方案2】:

    事件数据中提供的DeltaSnapshot 仅适用于匹配的位置。树或同级中较高的数据不可用。如果您的成员数据不是太大以至于您担心监听其中的任何更改,您可以这样做:

    // listen one level higher in tree    
    exports.doMemberDeletion = functions.database.ref("/members/{memberId}").onWrite(event => {
        const wasDeleted = event.data.previous.child('isDeleted').val();
        const isDeleted = event.data.current.child('isDeleted').val();
    
        if (!wasDeleted && isDeleted) {
            const gender = event.data.current.child('gender').val();
            console.log("Deleted a " + gender + " member");
        }
    });
    

    您的原始方法也有效,但需要获取性别数据:

    exports.doMemberDeletion = functions.database.ref("/members/{memberId}/isDeleted").onWrite(event => {
        const isDeleted = event.data.val();
    
        if (isDeleted) {
            // as noted in Jen Person's answer, use adminRef for unrestricted access
            return event.data.adminRef.parent.child('gender').once('value').then((snapshot) => {
               console.log("Deleted a " + snapshot.val() + " member");
            });
        }
    });
    

    【讨论】:

    • 对不起,第二种方法不起作用。 snapshot.val() 抛出异常。
    • @Softhinker.com:我刚刚复制并重新运行了第二种方法的代码。我没有收到错误。如果您想发布失败的代码,我会看看。
    • if (isDeleted) { event.data.adminRef.parent.child("gender").once("value").then(gender => { console.log("Deleted a " +性别.val() + "成员"); });错误日志是:TypeError: gender.val is not a function at exports.doMemberDeletion.functions.database.ref.onWrite.event (/user_code/index.js:57:43) at /user_code/node_modules/firebase-函数/lib/cloud-functions.js:35:20 at process._tickDomainCallback (internal/process/next_tick.js:129:7)
    • @Softhinker.com:无法解释。我复制/粘贴了您在评论中提供的代码,它运行没有错误。请注意,您缺少once().then() 结果的return,但这不会导致您看到的错误。
    猜你喜欢
    • 2019-10-17
    • 2018-12-05
    • 2020-02-28
    • 2019-08-08
    • 2019-02-22
    • 2020-07-26
    • 2019-01-24
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多