React Native Firestore setDoc -响应未定义

pcww981p  于 2023-04-07  发布在  React
关注(0)|答案(1)|浏览(89)

概述

我正在使用Firestore作为数据库和身份验证服务创建一个react-native应用程序。我目前允许用户使用createUserWithEmailAndPassword创建帐户,这是成功的。我使用返回的UID在我的数据库中创建一个具有相同UID的文档,以便我可以存储有关它们的信息,例如订阅,发票,名称等。

提问

我成功地创建了文档,但我没有从Firestore得到任何回应,让我知道事情进展顺利。当我尝试记录res.它说 * 未定义 *。**我们应该检索文档以确保它工作吗?**这似乎是一个糟糕的模式,我希望得到一个状态码或其他东西。

const addUserToDatabase = (uid, email) => {
      setDoc(doc(db, "users", uid), {
        uid: uid,
        email: email,
      })
        .then((res) => {
          console.log("response:", res);
        })
        .catch((err) => {
          console.log("unable to add user to database", err);
        });
    };

作为一个附加的问题,我在一个用户命令中做了两个调用,创建和帐户,然后添加文档。有一种情况是,可以创建用户,但没有创建文档。这将是一个糟糕的情况。我如何确保如果没有创建文档,那么不应该创建帐户;反之亦然?两者都必须成功

createUserWithEmailAndPassword(auth, values.email, values.password)
      .then((credentials) => {
        console.log(credentials);
        if (credentials.user?.uid) {
          const { uid, email } = credentials.user;
          addUserToDatabase(uid, email);
        } else {
          throw new Error("Something went wrong");
        }
      })
      .catch((err) => {
        switch (err.code) {
          case "auth/email-already-in-use":
            setAuthError("That email is already in use");
            break;
          default:
            console.log("did not create account:", err);
            setAuthError("uncaught error");
            break;
        }
      });

    const addUserToDatabase = (uid, email) => {
      setDoc(doc(db, "users", uid), {
        uid: uid,
        email: email,
      })
        .then((res) => {
          console.log("response:", res);
        })
        .catch((err) => {
          console.log("unable to add user to database", err);
        });
    };
w1jd8yoj

w1jd8yoj1#

如果我们看一下这段代码:

setDoc(doc(db, "users", uid), {
  uid: uid,
  email: email,
})
.then((res) => {
  console.log("response:", res);
})
.catch((err) => {
  console.log("unable to add user to database", err);
});

行为如下:

  • 如果对setDoc的调用本身完成,则写入操作被提交到本地缓存,并且如果/当连接可用时,将与服务器同步。
  • setDoc的调用本身引发了一个异常,本地写操作失败并被中止(这种情况很少见)。
  • promise解析后(因此执行then块),数据被写入服务器。
  • 如果promise被拒绝(因此执行catch块),则数据在服务器上被拒绝-通常是因为您的安全规则,但请检查错误以确定原因。

因此,根据您想要检测的内容,您可以在then块中声明成功(对于在服务器上完成的写入),也可以在我在这里分享的代码之后的第一行中声明成功(对于完成的本地写入)。

相关问题