开发者问题收集

从 axios get 请求访问数据时 React Uncaught TypeError(数据未定义)

2022-10-14
182

我正尝试从存储在 MongoDB 中的集合中获取数据。 当我尝试在 Insomnia 中获取数据时,一切都正常。当我使用 axios 发出请求时,我收到以下错误:
Uncaught TypeError:无法读取未定义的属性(读取“游戏”)

我使用自定义钩子

import { useEffect, useState } from "react";
import axios from "axios";

const useFetch = (url) => {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(false);

useEffect(() => {
  const fetchData = async () => {
    setLoading(true);
    try {
      const res = await axios.get(url);
      setData(res.data);
    } catch (err) {
      setError(err);
    }
    setLoading(false);
  };
  fetchData();
}, [url]);

const reFetch = async () => {
  setLoading(true);
  try {
    const res = await axios.get(url);
    setData(res.data);
  } catch (err) {
    setError(err);
  }
  setLoading(false);
};

return { data, loading, error, reFetch };
};

export default useFetch;

然后我调用 useFetch 钩子,如您在第三个代码块中看到的那样。 当我尝试调用 data[0].games 时,我收到未定义的错误,但当我仅调用 data[0] 时,没有错误,数据会打印在控制台中。 以下是我为此案例定义的 mongoDB 模型:

import mongoose from "mongoose";

const SpielSchema = new mongoose.Schema({
    heimName: {
        type: String,
        required: true
    },
    heimTore: {
        type: Number,
        required: true
    },
    auswName: {
        type: String,
        required: true
    },
    auswTore: {
        type: String,
        required: true
    },
});

const TippsSchema = new mongoose.Schema({
    number: {
        type: Number,
        required: true
    },
    date: {
        type: String, 
        required: true
    },
    user: {
        type: String, 
        required: true
    },
    userId: {
        type: String, 
        required: true
    },
    games: [SpielSchema]
})

export default mongoose.model("Spieltag", TippsSchema)

只要我想访问 data[0] 中的任何数据。(编号、日期、用户、用户 ID、游戏),我就会收到此错误。 在这里你可以看到我调用 useFetch 获取数据的 React 代码。目前这只是测试代码,希望你能看得更清楚 :)

export const Spieltagtipps = (props) => {
  const { user } = useContext(AuthContext);
  const { data, loading, error, reFetch } = useFetch("tipps/find/"+user.username);
  return (
    <>
    {loading ? (
      <h1>Loading...</h1>
    ) : (
    <>
     {data && <h1>{console.log(data[0].games)}</h1>}
    </>
    )
    }
    </>
    )

在这里你可以看到两个输出:
调用 data[0].games 时出错
调用 data[0] 时无错误

1个回答

您必须检查数组的长度作为渲染条件,如下所示

{data.length > 0 && <h1>data[0].games</h1>}

您可以检查 JS 中的虚假值

将不在上述列表中的其余所有内容视为 true 并通过条件,因此 [] 也通过

KcH
2022-10-14