Firestore setDoc-响应未定义



概述

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

问题

我成功地创建了文档,但我没有收到Firestore的任何回复,让我知道事情进展顺利。当我尝试记录资源时,它会显示未定义我们是否应该检索文档以确保其有效这看起来像是一个糟糕的模式,我希望返回一个状态代码或其他东西。

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);
});
};

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

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);
});
};

如果我们看看这个代码:

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块中声明成功(用于在服务器上完成写入),也可以在我在此处共享的代码后的第一行上声明成功(对于完成的本地写入)。

最新更新