首页 > 解决方案 > 为什么 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() 要求其第一个参数为非空字符串类型,但它是:未定义

我在另一个组件中使用了相同的方法来添加数据,并且效果很好。

为什么会这样?提前致谢。

标签: reactjstypescriptfirebasefirebase-authentication

解决方案


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?
}

如果您需要等到用户实际登录,您应该使用身份验证状态观察器来获取一个回调,告诉您用户对象何时可用。

另请参阅:Typescript 安全导航运算符 (?.) 或 (!.) 和 null 属性路径


推荐阅读