4

我是云功能的新手。我想在创建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

4

1 回答 1

4

根据您的评论更新

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

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

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。事实上,snapis aDocumentSnapshot并且你需要使用它的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;
  });
});
于 2019-10-23T12:23:05.400 回答