使用firebase云功能将数据从一个node1子级复制到另一个node2子级

时间:2018-06-07 08:38:26

标签: node.js firebase firebase-realtime-database google-cloud-functions

enter image description here

下面是我的云功能代码我试图将数据从用户节点复制到挑战节点

exports.copyChallengeDate = functions.database.ref(`Users/{pushId}/DateChallengeAccept`).onCreate((snapshot, context)=>{
  var DateChallengeAccept = snapshot.val();
  console.log('Challenge', context.params.pushId, DateChallengeAccept);
  var challenge = DateChallengeAccept;

  return admin.database().ref('Challenge/' + context.params.pushId).child('DateChallengeAccept').set(challenge);

});

但问题是当我试图将日期从用户表复制到挑战节点时,它只发生在QS5h99YxS0ZGpT42fpUFvzOdpTi1 与“用户”节点相同。我想在两个uid中复制它(QS5h99YxS0ZGpT42fpUFvzOdpTi1,7aH9Ag8414VzM0n7P6ur4LvcepI2) D存在于挑战节点中。我被困在最后两天,请帮帮我

1 个答案:

答案 0 :(得分:1)

更新后,您注意到DateChallengeAccept在创建记录时未初始化。您应该使用其他方法,例如onUpdate()(或onWrite())而不是onCreate(),就像您在问题中所做的那样。请执行以下操作:

exports.copyChallengeDate = functions.database.ref(`Users/{pushId}`).onUpdate((change, context) => 

    const DateChallengeAccept = change.after.val().DateChallengeAccept;

    if ( DateChallengeAccept === undefined) { 
       return false;
    }

    const referredBy = change.after.val().referredBy;

    console.log('Challenge', context.params.pushId, DateChallengeAccept);

    const dateChallengeAcceptObj = {
        "DateChallengeAccept": DateChallengeAccept
    };

    let updates = {};
    updates['Challenge/' + context.params.pushId + '/DateChallengeAccept'] = dateChallengeAcceptObj;
    updates['Challenge/' + referredBy + '/DateChallengeAccept'] = dateChallengeAcceptObj;

    return admin.database().ref().update(updates);


});

您需要在函数中获取referredId值,因为此数据项包含其他用户的ID(即7aH9Ag8414VzM0n7P6ur4LvcepI2)。因此,您必须在父节点上触发事件,而不是在DateChallengeAccept节点上触发事件。

然后您必须使用update()方法同时写入两个节点,请参阅此处的文档:https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields

所以你应该这样做:

exports.copyChallengeDate = functions.database.ref(`Users/{pushId}`).onCreate((snapshot, context)=>{

    const DateChallengeAccept = snapshot.val().DateChallengeAccept;

    if ( DateChallengeAccept === undefined) { 
       return false;
    }

    const referredBy = snapshot.val().referredBy;

    console.log('Challenge', context.params.pushId, DateChallengeAccept);

    const dateChallengeAcceptObj = {
        "DateChallengeAccept": DateChallengeAccept
    };

    let updates = {};
    updates['Challenge/' + context.params.pushId + '/DateChallengeAccept'] = dateChallengeAcceptObj;
    updates['Challenge/' + referredBy + '/DateChallengeAccept'] = dateChallengeAcceptObj;

    return admin.database().ref().update(updates);


});