【问题标题】:How to create a new field in firestore using cloud functions?如何使用云功能在 Firestore 中创建新字段?
【发布时间】:2020-02-19 11:34:28
【问题描述】:

我是云功能的新手。我想在创建文档时创建一个新字段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。创建时,我想在users/userId 中添加一个counter 字段

【问题讨论】:

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


【解决方案1】:

根据您的评论更新

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

只需在子集合级别触发,通过context对象获取父文档id,并基于此id构建其DocumentReference,如下:

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.ref,而不是执行snap.data.ref 以获得DocumentReference。事实上,snap 是一个DocumentSnapshot,你需要使用它的ref 属性。


你的第二个代码sn-p应该可以正常工作,但是你需要在then()catch()中返回一个值来向云函数平台表明函数的工作已经完成。请注意,您需要对上述代码执行相同的操作。我建议您观看 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;
  });
});

【讨论】:

  • 谢谢。我会查一下。哪个更好?
  • 函数部署后是否立即触发?如果是这样,不幸的是第一个没有用
  • 好问题。我会说第一个,因为DocumentReference 可以通过snapshot 立即获得。而使用第二种方法时,您需要调用 collection()doc() 方法。
  • “不幸的是第一个没有工作” - >应该。让我在我的环境中测试一下。
  • 如果userId 中没有集合,它似乎可以工作。很抱歉我没有提到:起初,我创建了users/userId/collection/doc。创建时,我想在users/userId 中添加一个counter 字段。有可能吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 2020-01-09
  • 1970-01-01
  • 2021-04-14
  • 2020-02-08
  • 2019-11-12
  • 2020-08-02
  • 2019-08-07
相关资源
最近更新 更多