开发者问题收集

如何修复未捕获的类型错误:无法读取未定义的属性(读取“map”)在 react、firebase 中

2023-05-01
1586

我正在尝试从 firebase 数据库检索数据,但收到标题中提到的错误。

我正在尝试从 AddMember.js 组件(有效)向 firebase 添加新成员。

现在,我试图在仪表板加载到 MembersTable.js 组件时检索数据。

我理解您无法映射到对象,但我这里是否遗漏了什么,我该如何解决这个问题?

下面是我的代码和我正在尝试读取的数据的屏幕截图。

MembersTable.js

const [loading, setLoading] = useState(true);


const [userMembers, setUserMembers] = useState([]);

  useEffect(() => {
    onAuthStateChanged(auth, (user) => {
      console.log(`Welcome to your dashboard.. ${user.uid}`);

  // get the data from firebase
  const getData = () => {
    const dbRef = ref(database, `users/${user.uid}/`);
    onValue(dbRef, (snapshot) => {
      const data = snapshot.val();

      var userMembers = data.members;
      console.log(userMembers);

      setUserMembers({ userMembers });
      setLoading(false);
    });
  };
  getData();
});
  }, []);

AddMember.js

const writeMemberToDatabase = (member) => {
const currentUser = auth.currentUser.uid;
const uniqueKey = uuidv4();
const newkey = "hey";

set(child(dbRef, `users/${currentUser}/members/${newkey}`), member)
  .then(() => {
    console.log(`updated ${currentUser}...`);
    setToggle(false);
    setMemberDetails([]);
  })
  .catch((error) => {
    console.log("Error adding member to database: ", error);
      });
  };



 const submitForm = (e) => {
    e.preventDefault();
    console.log("submitted user...");
const member = [
  {
    membername: memberName,
    memberemail: memberEmail,
    membershipprice: membershipPrice,
  },
];

writeMemberToDatabase(member);
setMemberDetails([...memberDetails, member]);

console.log(auth.currentUser);
  };

请查看我的数据库的附加图片

Firebase 实时数据库

2个回答

我没有看到您提供的代码中使用 map 。该错误通常意味着您认为是数组的变量实际上未定义。处理异步代码时可能会发生这种情况,其中值在承诺解析之前未定义。处理潜在未定义值的映射的一种潜在方法可能是这样的......

const myVar = undefined
const myMap = (myVar || []).map(item => item)

这将映射到 myVar 上,或者如果 myVar 未定义,它将映射到空数组上。

Scott Z
2023-05-01

我认为问题出在 setState 中,值应该是一个数组,但你将其设置为对象 setUserMembers({ userMembers });

所以试试这个

setUserMembers(userMembers);

如果 userMembers 是数组,它就可以工作

最后尝试不要使用 var 来声明变量,如果值可以改变,则使用 let,对于函数和值永远不会改变,则使用 const

Ubaldo Suarez
2023-05-01