为什么在传递多个字段的情况下在Firebase中创建新文档时仅设置一个字段?

时间:2019-09-01 22:52:31

标签: firebase vue.js google-cloud-firestore

我正在尝试在“用户”集合中创建具有多个字段(角色,电子邮件,createdAt)的文档。我将这些字段和关联的数据存储在“数据”变量中,并将doc设置为该对象。问题在于仅分配了电子邮件字段,而其余部分未显示在Firebase的文档中。

我尝试了直接在set()中使用对象或直接在{}中设置字段的变体,似乎并没有太大区别。

this.data = { email: this.email, role: "new", createdAt: this.timestamp};

console.log("user", user);
          console.log("uid", user.user.uid);
          let docRef = db
            .collection("Users")
            .doc(user.user.uid)
            .set(this.data)
            .then(function() {
              console.log("Document successfully written!");
            })
            .catch(function(error) {
              console.error("Error writing document: ", error);
            });
          console.log(this.data);
          return docRef.then(res => {
            console.log("Set: ", res);
            this.$router.push("/welcome");
          });

所有控制台日志均符合预期,但“设置”控制台日志为Null。只有电子邮件字段显示在新创建的文档上。

编辑:弄清楚,创建帐户时正在运行Cloud Function,并且正在“用户”集合中创建文档

2 个答案:

答案 0 :(得分:0)

您的docRef似乎是来自catch()返回值的承诺。这个承诺不会用刚刚添加的文档的内容来解决。 set()返回的承诺甚至都不会给您内容。如果要查询该文档的内容,则必须在对该文档的引用上使用get()。

db.collection("Users").doc(user.user.uid).get(snap => {
    // snap is a snapshot that contains the fields of the document
})

答案 1 :(得分:0)

我认为道格·史蒂文森(Doug Stevenson)已经回答了您的问题-要获取刚刚添加的内容,您需要从Firebase进行查询。但是,只需添加一些内容,您似乎就可能要等到添加数据以更改路线后,在这种情况下,您可能想要尝试这样的事情:

db
.collection("Users")
.doc(user.user.uid)
.set(this.data)
.then(function() {
    console.log("Document successfully written!");
    // After you know the data has been written, you can query it.
    db.collection("Users").doc(user.user.uid).get().then((res) => {
        // Log the data from the response
        console.log(res.data())
        resolve()
    }).catch((err) => {
        console.log(err)
        reject(err)
    })
    // Then change the route.
    this.$router.push("/welcome");
})
.catch(function(error) {
    console.error("Error writing document: ", error);
});