Счетчик приращений с облачными функциями для Firebase - PullRequest
0 голосов
/ 25 июня 2018

Я видел счетчик приращений с облачными функциями, которые ссылаются на базу данных реального времени, но пока не Firefase Firestore.

У меня есть облачная функция, которая прослушивает новые документы:

exports.addToChainCount = functions.firestore
    .document('chains/{name}')
    .onCreate((snap, context) => {

    // Initialize document
    var chainCounterRef = db.collection('counters').doc('chains');

    var transaction = db.runTransaction(t => {
        return t.get(chainCounterRef).then(doc => {
            // Add to the chain count
            var newCount = doc.data().count + 1;
            t.update(chainCounterRef, { count: newCount });
        });
    }).then(result => {
        console.log('Transaction success!');
    }).catch(err => {
        console.log('Transaction failure:', err);
    });
    return true;
});

Я пытаюсь выполнить указанную выше транзакцию, но когда я запускаю firebase deploy в терминале, я получаю эту ошибку:

error Каждое then () должно возвращать значение или выдавать обещание / всегда возвращать Ошибка предустановки функций: Команда завершена с ненулевым кодом выхода1

Это моя первая попытка что-нибудь для node.js, и я не уверен, что написал это правильно.

Ответы [ 3 ]

0 голосов
/ 13 августа 2018

Вот одно из возможных решений.Вы можете записать голосов с помощью шардинга, но затем использовать облачные функции для агрегирования итогов шарда и обновления своего счетчика.Это должно уменьшить количество прочитанных документов и, следовательно, ваш счет Firestore.

Учебник здесь: https://angularfirebase.com/lessons/firestore-cloud-functions-data-aggregation/

0 голосов
/ 22 апреля 2019

Теперь существует намного более простой способ увеличения / уменьшения поля в документе: FieldValue.increment().Ваш образец будет выглядеть примерно так:

var chainCounterRef = db.collection('counters').doc('chains');
chainCounterRef.update({ count: FieldValue.increment(1) });

См .:

0 голосов
/ 25 июня 2018

Если вы хотите безопасно увеличить число в документе, вы можете использовать транзакция .Следующий код взят прямо со связанной страницы.Он добавляет единицу к полю с именем population в документе /cities/SF после присвоения ему некоторых начальных значений:

// Initialize document
var cityRef = db.collection('cities').doc('SF');
var setCity = cityRef.set({
  name: 'San Francisco',
  state: 'CA',
  country: 'USA',
  capital: false,
  population: 860000
});

var transaction = db.runTransaction(t => {
  return t.get(cityRef)
      .then(doc => {
        // Add one person to the city population
        var newPopulation = doc.data().population + 1;
        t.update(cityRef, { population: newPopulation });
      });
}).then(result => {
  console.log('Transaction success!');
}).catch(err => {
  console.log('Transaction failure:', err);
});

Имейте в виду, что при постоянной нагрузке Firestore ограничивается одной записью в секунду, поэтому есливы будете много писать, вам нужно будет использовать оголенный счетчик .

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