Попытка обновить значение в базе данных Firebase во время прослушивания изменений в другом месте (Cloud Functions) - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь обновить количество участников в поле в базе данных реального времени firebase.
Моя база данных выглядит так:
root
| _course
|| _Course1
|| _descr: "некоторый текст"
|| _lect: "someUID"
| _groups
|| _Course1
|| _Group1
|| _current: 5
|| _others - // -
| _participation
|| _Course1
|| _someUID: "Group1"
Так что теперь я пытаюсь прослушать записи об участии / Course1 / someUID, и когда появляется какая-то запись, я хочу обновить поле 'current' до 6 в groups / Course1 / Group1.
Пока я пришел с:

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);
      });
});

Но то, что я получаю, это новый дочерний элемент в группах / Course1 / 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 Ответ

1 голос
/ 05 марта 2019

Похоже, что вы читаете этот 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);
});

Наконец: этот подход чувствителен к условиям гонки, если несколько пользователей запускают вышеупомянутое практически одновременно.Возможно, вы захотите рассмотреть , используя транзакцию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...