我正在尝试更新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
感谢您的帮助。
答案 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。