【问题标题】:Get TypeError: Cannot read property of undefined获取类型错误:无法读取未定义的属性
【发布时间】:2021-10-08 01:17:15
【问题描述】:

我是新手,我尝试从后端获取数据并显示。

    const { id } = useParams();
    console.log(id);

    const [posts, getPosts] = useState([]);

    useEffect(()=>{
        getOnePost();
    }, []);

    const getOnePost = async () => {
        await axios.get(`/buyerGetOnePost/${id}`)
            .then ((response)=>{
                const allPost=response.data.onePost;
                getPosts(allPost);
            })
            .catch(error=>console.error(`Error: ${error}`));
    }
    console.log(posts);

    console.log(posts.location.latitude);
    console.log(posts.location.longitude);

我传递了一个 id 并从后端获取数据,它工作正常。但是,当我尝试获取该位置的纬度和经度时,会出现如下错误:

TypeError: 无法读取未定义的属性“纬度”

当我这样写代码时:

    console.log(posts.location);
    console.log(posts.location);

它没有给出任何错误。但是当我尝试访问位置对象中的数据时,它会给出上述类型错误。

This is a screenshot of location object

console.log(posts);

这给出了整个帖子的输出。

Image of the whole post

就像这张图片。在帖子内部,有一个名为 location 的对象。在 location 对象中,它有一个 Id、经度和纬度。当我console.log(posts.location) 这样做时,位置对象会打印在控制台中。但是当我想访问位置对象中的经度和纬度时,它会报错。

我该如何解决这个问题?

【问题讨论】:

  • 您会添加console.log 调用的输出吗?请务必提供输出和对象形状的文本描述,并避免外部资产链接。
  • 这能回答你的问题吗? Use Async/Await with Axios in React.js
  • @tmarwen 正如你所说,我添加了更多细节。我还没有 10 个声望,所以我无法添加屏幕截图,这就是我添加一些链接的原因。

标签: reactjs


【解决方案1】:

您的代码存在一些问题:

  1. 您已将useState() 默认值定义为一个空数组[],然后您将posts 视为一个对象。
  2. 其次,当代码运行时,posts 的值是 [],然后您尝试打印出 console.log(posts.location.latitude);,这可能会给您一个错误。
  3. 异步等待使用不正确。

我会将我的代码结构如下:

    const { id } = useParams();
    console.log(id);

    const [posts, setPosts] = useState({});
    const [loading, setLoading] = useState(true);

    useEffect(()=>{
        getOnePost();
    }, []);

    useEffect(()=>{
        if (posts && posts.location) {
            console.log(posts.location);
            console.log(posts.location.longitude);
            console.log(posts.location.latitude);
        }
    }, [posts]);


    const getOnePost = async () => {
        try {
             const response = await axios.get(`/buyerGetOnePost/${id}`)
             console.log(response);
             const allPost=response.data.onePost;
             setPosts(allPost);
        } catch (error) {
             console.error(`Error: ${error}`))
        }
    }

希望这会有所帮助,基本上您已经在第二个 useEffect 中添加了帖子作为依赖项,以便在其值更改时运行。

【讨论】:

  • 帖子有一个位置对象。纬度和经度位于该位置对象中,如上面的屏幕截图所示。 posts.longitude 无法直接访问,因为经度在帖子内的位置对象中。这就是为什么我像这样尝试posts.location.longitude
  • 请使用此代码,然后查看post.location 中的值是什么,如果可能,将其复制并粘贴到此处,我可能会提供帮助。
  • 我使用此代码并获取posts.location 中的值。这些值看起来像这样。 {_id: "60f86725c018375a646ecb11", latitude: 7.0811648, longitude: 79.9965184} latitude: 7.0811648 longitude: 79.9965184 _id: "60f86725c018375a646ecb11" [[Prototype]]: Object。如果我尝试posts.location.latitude 代码,我会得到纬度数据。但是,如果我重新加载页面,则会出现上述类型错误。
  • 嗨,Harshana,如果您在 posts.location 中获取此数据,那么您可以在第二个 useEffect 中执行 posts.location.latitude,它应该可以工作。现在来到错误部分,你是如何渲染 DOM 代码的,你能否也将return (//whatever code) 附加到问题中,以便我可以进一步提供帮助!
  • 如果您还可以提供 JSX 代码的 HTML 部分,这将更容易查明问题,因为此时您的 JS 代码与上面的代码完美匹配!
【解决方案2】:

对象肯定有问题。你确定是posts.location.latitudeposts.latitude 呢?

【讨论】:

  • 正如我在上面的屏幕截图中所示posts.latitude 在控制台中记录该位置对象的数据。但尝试让posts.location.latitudeposts.location.longitude 在地图中显示位置。
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 2021-12-25
  • 2019-02-26
  • 2018-04-29
  • 1970-01-01
  • 2021-11-24
  • 2021-10-31
相关资源
最近更新 更多