reactjs - 为什么 currentUser.uid 未定义
问题描述
我正在尝试将信息添加到当前登录用户的文档中。
我的组件中有以下代码片段 -
console.log("user", auth.currentUser?.uid);
useEffect(() => {
if (productId) {
db.collection("users")
.doc(auth.currentUser?.uid)
.collection("cart")
.doc(productId)
.onSnapshot((snapshot) => setProduct(snapshot.data()));
}
}, []);
这里,
const auth = firebase.auth();
控制台日志实际上给了我用户的 uid,但下面的钩子会产生错误 -
FirebaseError:函数 CollectionReference.doc() 要求其第一个参数为非空字符串类型,但它是:未定义
我在另一个组件中使用了相同的方法来添加数据,并且效果很好。
为什么会这样?提前致谢。
解决方案
auth.currentUser
如果在访问它的那一刻没有用户登录,它将为空。您的代码通过使用?
运算符“安全”地访问其属性来盲目地忽略这种可能性。当您使用 时?
,如果先前的表达式是“假的”,则整个表达式将变为未定义。在假设有要使用的对象之前,您的代码应改为检查 null。
const currentUser = auth.currentUser
if (currentUser) {
const uid = currentUser.uid;
}
else {
// what do you want to do if there is no one signed in?
}
如果您需要等到用户实际登录,您应该使用身份验证状态观察器来获取一个回调,告诉您用户对象何时可用。
推荐阅读
- r - 如何更改 R 中数据框的形状?(将具有相同名称的列堆叠在一起)
- verilog - 如何在verilog中获得小数(比如0.78)的平方和立方?
- swift - UIAlertController 已经呈现(空)
- qt - 在哪里可以找到 macOS 上的 QSettings
- python-3.x - 仅允许登录用户查看工作时间字段
- apache-spark - 如何在 Spark Streaming 应用程序中使用 Kafka 主题?
- actions-on-google - 智能家居温度设置读数(摄氏度)自定义范围
- c# - 某些 Unicode 字符不是使用 DrawString 方法绘制的
- c - 与 C 相比,为什么 Go 向文件写入字节很慢
- ocaml - 为什么我不能在 OCaml 中再次打印此输入?