Проблема обновления облачной функции в базе данных Firestore - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь создать приложение для Android. В моей базе данных Firestore есть коллекция Users и коллекция Counters. В коллекции счетчиков у меня есть userCounter. То, что я хочу сделать, - это когда новый пользователь входит в систему, и я отправляю его в firestore, чтобы увеличить userCounter.

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.addNewUser = 
functions.firestore.document('Users/{userID}').onCreate((event) => {

var db = admin.firestore();
var counterRef = db.collection("Counters");
var temp = counterRef.doc("0").data().userCounter++;

counterRef.doc("0").update(
{
    userCounter: temp
});
});

В этом состоянии эта функция не работает, и я новичок, поэтому буду признателен за любую помощь. Спасибо заранее

EDIT

После реализации ответов Firebaser и Pablo Almécija Rodríguez мой код выглядит следующим образом.

const Firestore = require('@google-cloud/firestore');
const firestore = new Firestore({
  projectId: process.env.GCP_PROJECT,
});
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();

exports.addNewUser =
functions.firestore.document('Users/{userId}').onCreate((snapShot) => {

  const userCounterRef = db.collection('Counters').doc('Users');

  return db.runTransaction(transaction => {

   const doc = transaction.get(userCounterRef);

    console.log("1");
   const count = doc.data();
    console.log(`5`);
   const updatedCount = count + 1;
    console.log(`6`);
   return transaction.update(userCounterRef, {counter: updatedCount })
  })
});

И это журнал консоли Firebase. Проблема в

const count = doc.data();
TypeError: doc.data is not a function

Журнал консоли Firebase

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Я воспроизвел его в облачных функциях, и это простое решение сработало. Отредактированный ответ для соответствия Firebase, и он также использует зависимость Firestore для nodejs.

const Firestore = require('@google-cloud/firestore');
const firestore = new Firestore({
  projectId: process.env.GCP_PROJECT,
});

const functions = require('firebase-functions');
//I am not using next two lines right now though
const admin = require('firebase-admin');
admin.initializeApp();

exports.helloFirestore = 
functions.firestore.document('users/{userID}').onCreate((event) => {


  const doc = firestore.doc('Counters/UserCounter/');
  doc.get().then(docSnap => {
    //Get the specific field you want to modify
    return docSnap.get('userCount');
  }).then(field => {
    field++;
    //Log entry to see the change happened
    console.log(`Retrieved field value after +1: ${field}`);
    //Update field of doc with the new value
    doc.update({
      userCount: field,
    });
  });
});

Подстановочный знак, который вы использовали, должен быть в порядке, просто будьте осторожны с полным путем для сбора, обратите внимание на верхний / нижний регистр. В этом случае мой package.json выглядит так:

{
  "name": "sample-firestore",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/firestore": "^1.1.0",
    "firebase-functions": "2.2.0",
    "firebase-admin": "7.0.0"
  }
}
0 голосов
/ 14 марта 2019

Я предлагаю вам создать коллекцию с именем counters и внутри нее документ с именем users для обработки counter для пользователей.Вот структура:

- counters (collection)
  - users (document)
    count: 0 (field)

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

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();

exports.addNewUser = 
functions.firestore.document('users/{userId}').onCreate((snapShot) => {

  const userCounterRef = db.doc('counters/users');

  return db.runTransaction(async transaction => {
   const doc = await transaction.get(userCounterRef)
   const { count } = doc.data()
   const updatedCount = count + 1
   return transaction.update(userCounterRef, {count: updatedCount })
  })
});

https://firebase.google.com/docs/firestore/manage-data/transactions

РЕДАКТИРОВАТЬ: Если вы не хотите иметь дело с синтаксисом асинхронного / ожидания, обновите транзакцию следующим образом:

return db.runTransaction(transaction => {
     return transaction.get(userCounterRef)
     .then(doc => {
         const count = doc.data().count
         const updatedCount = count + 1
         transaction.update(userCounterRef, {count: updatedCount })
     })

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