Как создать новое поле в firestore, используя облачные функции? - PullRequest
1 голос
/ 23 октября 2019

Я новичок в облачных функциях. Я хочу создать новое поле counter при создании документа.

Я попробовал следующие коды:

exports.createCounter = functions.firestore.document('users/{userId}').onCreate((snap, 
 context) => {
  console.log('onCreate created');

      return snap.data.ref.set({counter: 0}, {merge: true})
            .then(() => {
               console.log("Count is created! "+userId);
             })
            .catch((error) => {
                console.error("Counter Error writing document: ", error);
             });
    });

и с использованием firebase-admin:

exports.createCounter = functions.firestore.document('users/{userId}').onCreate((snap, context) => {
  const id = context.params.userId;
  console.log('onCreate created');
  return admin.firestore().collection('users')
  .doc(id).set({counter: 0}, {merge: true})
  .then(() => {
    console.log("Document successfully written! "+id);
  })
  .catch((error) => {
      console.error("Error writing document: ", error);
  });
});

Но оба не запускаются при создании нового документа.

ОБНОВЛЕНИЕ

Сначала я создаю users/userId/collection/doc. Когда он будет создан, я хочу добавить поле counter в users/userId

1 Ответ

1 голос
/ 23 октября 2019

Обновление после вашего комментария

Вы можете добавить поле в документ users/userId при создании документа в коллекции users/userId/theCollection, изменив код второго представленного решения. ниже.

Просто запустите на уровне вложенной коллекции, получите родительский документ id через объект context и создайте его DocumentReference на основе этого id, как показано ниже:

exports.createCounter = functions.firestore.document('users/{userId}/theCollection/{docId}').onCreate((snap,
    context) => {

    const id = context.params.userId;

    return admin.firestore().collection('users')
        .doc(id).set({ counter: 0 }, { merge: true })
        .then(() => {
            console.log("Count is created! " + userId);
            return null;
        })
        .catch((error) => {
            console.error("Counter Error writing document: ", error);
            return null;
        });
});

Первоначальный ответ

Следующие действия должны помочь:

exports.createCounter = functions.firestore.document('users/{userId}').onCreate((snap, 
 context) => {
      console.log('onCreate created');

      const docRef = snap.ref;

      return docRef.set({counter: 0}, {merge: true})
          .then(() => {
               console.log("Count is created! "+userId);
               return null;
           })
          .catch((error) => {
               console.error("Counter Error writing document: ", error);
               return null;
           });
    });

Обратите внимание, что вместо выполнения snap.data.ref, чтобы получить DocumentReference нужно сделать snap.ref. На самом деле snap - это DocumentSnapshot, и вам нужно использовать его свойство ref.


Ваш второй фрагмент кода должен нормально работать, но вынеобходимо вернуть значение в then() и в catch(), чтобы указать платформе облачной функции, что работа функции завершена. Обратите внимание, что вам нужно сделать то же самое для приведенного выше кода. Я бы посоветовал вам посмотреть 3 видео о «Обещаниях JavaScript» из серии видеороликов Firebase: https://firebase.google.com/docs/functions/video-series/, которые объясняют этот ключевой момент.

exports.createCounter = functions.firestore.document('users/{userId}').onCreate((snap, context) => {
  const id = context.params.userId;
  console.log('onCreate created');
  return admin.firestore().collection('users')
  .doc(id).set({counter: 0}, {merge: true})
  .then(() => {
    console.log("Document successfully written! "+id);
    return null;
  })
  .catch((error) => {
      console.error("Error writing document: ", error);
      return null;
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...