尝试在其他地方侦听更改时更新Firebase数据库中的值(云功能)

时间:2019-03-05 14:56:02

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

我正在尝试更新Firebase实时数据库中某个字段中的参与者数。
我的数据库如下所示:
root
| _course
| | _Course1
| | _descr:“一些文字”
| | _lect:“ someUID”
| _groups
| | _Course1
| | _Group1
| | _current:5
| | _others-//-
| _participation
| | _Course1
| | _someUID:“ Group1”
因此,现在我想听听有关参与/课程1 / someUID的文章,当显示某些记录时,我想将“当前”字段更新为组/课程1 / Group1中的6。
到目前为止,我已经提供了:

exports.afterGroupJoined = functions.database.ref('/participation/{courseId}/{uid}').onWrite((change, context) => {
    const writtenContent = change.after.val(); // groupId
    const courseId = context.params.courseId;
    const uid = context.auth ? context.auth.uid : null;

    admin.database().ref('/groups/' + courseId + '/' + writtenContent).once('value').then(snapshot => {
        const count = snapshot.val();
        const current = count+1;
        console.log('User ' + uid + ' joined group ' + writtenContent + ' in course ' + courseId);
        const promise1 = admin.database().ref('/groups/' + courseId + '/' + writtenContent + '/current').set(parseInt(current));
        return Promise.all([promise1]);
    }).catch(err => {
        console.log(err);
      });
});

但是我得到的是组/课程1 / Group1中的一个新孩子,名为“ null”,孩子“ current”的值为“ 0”:
root
| _groups
| | _Course1
| | _Group1
| | | _current:5
| | | _others-//-
| | _null
| | _current:0
“ current”的值应该是6,但是我有了一个新孩子。
这是从日志中获取的:

User fNhAVZUo9QeSbYt0TwBIQmL2mYq1 joined group Group1 in course Course1
Error: Reference.set failed: First argument contains NaN in property 'groups.Course1.Group1.current' at validateFirebaseData

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

似乎您正在阅读此JSON:

"Group1": {
  "current": 5
}

这意味着您需要以下代码来获取实际计数:

const count = snapshot.val().current;

但是您没有使用该组中的任何其他内容,因此您最好只读取计数本身。似乎也不需要Promise.all()调用,因为您只有一个承诺。因此整个块可能是:

let ref = admin.database().ref('/groups/' + courseId + '/' + writtenContent+'/current');
ref.once('value').then(snapshot => {
    const count = snapshot.val();
    return ref.set(count+1);
}).catch(err => {
    console.log(err);
});

最后:如果多个用户几乎同时运行上述方法,则此方法容易受到竞争条件的影响。您可能要考虑使用using a transaction