Reference.set失败:第一个参数包含未定义

时间:2019-04-17 17:30:15

标签: firebase google-cloud-firestore google-cloud-functions

我创建了一个在onCreate事件上侦听的firebase函数,但是DocumentSnapshot.data()返回空。

功能代码为:

exports.createClientAccount = functions.firestore
  .document('/userProfile/{userId}/clientList/{clientId}')
  .onCreate(async (snap, context) => {
    console.log('****snap.data(): ', snap.data()); //Showing Empty from the console.
    return admin
      .auth()
      .createUser({
        uid: context.params.clientId,
        email: snap.data().email,
        password: '123456789',
        displayName: snap.data().fullName,
      })
      .then(userRecord => {
        return admin
          .database()
          .ref(`/userProfile/${userRecord.uid}`)
          .set({
            fullName: userRecord.displayName, //ERROR here: Reference.set failed: First argument contains undefined
            email: userRecord.email,
            coachId: context.params.userId,
            admin: false,
            startingWeight: snap.data().startingWeight,
          });
      })
      .catch(error => {
        console.error('****Error creating new user',error);
      });
  });

是在Firebase数据库上

下创建的文档IS
/userProfile/{userId}/clientList/{clientId}

clientId document created on the database

根据文档,onCreate会在创建新文档时侦听并返回通过DocumentSnapshot接口创建的数据的快照。但是,我已经从控制台检查snap.data()为空。我不明白,如果在数据库上成功创建了文档,为什么它为空。

image showing error returned by the functions when creating the userProfile

根据功能代码,return admin.auth.createUser({})将用户创建为匿名用户,因为未定义snap.data()。email,但应创建一个非匿名用户。

2 个答案:

答案 0 :(得分:0)

首先,请尝试将document('/userProfile/{userId}/clientList/{clientId}')更改为document('userProfile/{userId}/clientList/{clientId}')

path不应以/开头。

exports.createClientAccount = functions.firestore
  .document('userProfile/{userId}/clientList/{clientId}')

答案 1 :(得分:0)

最后的问题是,当我使用add({})创建文档时,我没有在指令中包括这些字段。这是创建客户文档的函数,现在该函数已正确触发。

  async clientCreate(
    fullName: string,
    email: string,
    startingWeight: number
  ): Promise<any> {
    const newClientRef = await this.firestore
      .collection(`userProfile/${this.userId}/clientList/`)
      .add({
        fullName,
        email, 
        startingWeight: startingWeight * 1,
      });

    return newClientRef.update({
      id: newClientRef.id
    }); 
}

我在没有字段的情况下调用this.firestore.collection(...).add({}),所以当它发生时,云函数被触发并且DocumentSnapshot.data()为空,因此返回了Reference.set错误。云功能createClientAccount是正确的。谢谢。