如何使用云功能在Firestore中创建新字段?

时间:2019-10-23 09:00:52

标签: node.js firebase google-cloud-firestore google-cloud-functions

我是云功能方面的新手。每当创建文档时,我都想创建一个新字段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 个答案:

答案 0 :(得分:1)

评论后更新

users/userId集合下创建文档时,您可以通过修改下面显示的第二个解决方案的代码在users/userId/theCollection文档中添加字段。

仅在子集合级别触发,通过id对象获取父文档context并基于此DocumentReference构建其id,如下所示:< / p>

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。实际上,snapDocumentSnapshot,您需要使用其ref属性。


您的第二个代码段应该正常运行,但是您需要在then()catch()中返回一个值,以向Cloud Function平台指示该功能的工作已完成。请注意,您需要对以上代码执行相同的操作。我建议您观看Firebase视频系列中的有关“ JavaScript Promises”的3个视频: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;
  });
});
相关问题