尝试在 React 中映射子对象时出现未定义错误

Posted

技术标签:

【中文标题】尝试在 React 中映射子对象时出现未定义错误【英文标题】:Undefined error when trying to map child objects in React 【发布时间】:2021-05-31 18:32:17 【问题描述】:

我正在尝试获取嵌套 JSON 对象的图像 url。

试过post.image.url,但我收到一个错误提示 url undefined

感谢您提供的任何帮助或指导。 javascript / React 的新手,但经过一个小时的谷歌搜索和搜索后无法找到解决方案。必须缺少一些简单的东西:-P

这是我的代码...

export const getAllPosts = async () => 
    return await fetch(
        `https://notion-api.splitbee.io/v1/table/$NOTION_BLOG_ID`
    ).then((res) => res.json());

export async function getStaticProps() 
    const posts = await getAllPosts()
    return 
        props: 
            posts
        ,
    ;

function Blog( posts ) 
    return (
        <div>
            posts.map((post) => (
                <Link href="/blog/[slug]" as=`/blog/$post.slug`>
                    <div>
                        <div className='text-6xl'>post.title</div>
                        <img className='w-24' src=post.imgUrl></img>

                        
                        /*post.image.rawUrl*/

                    </div>
                </Link>
            ))
        </div>
    );

export default Blog

这是 JSON...

[

"id": "90ee0723-aeb5-4d64-a970-332aa8f819f6",
"slug": "first-post",
"date": "2020-04-21",
"Related to Notion API Worker (Column)": [
"0976bfa6-392a-40b0-8415-94a006dba8d9"
],
"imgUrl": "https://www.notion.so/image/https:%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F689883de-2434-4be3-8179-a8ba62a7bc1e%2Fsnowmountain.jpg?table=block&id=90ee0723-aeb5-4d64-a970-332aa8f819f6&cache=v2",
"image": [

"name": "snowmountain.jpg",
"url": "https://www.notion.so/image/https:%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F689883de-2434-4be3-8179-a8ba62a7bc1e%2Fsnowmountain.jpg?table=block&id=90ee0723-aeb5-4d64-a970-332aa8f819f6&cache=v2",
"rawUrl": "https://s3-us-west-2.amazonaws.com/secure.notion-static.com/689883de-2434-4be3-8179-a8ba62a7bc1e/snowmountain.jpg"

],
"title": "My first blogpost bruce"

]

【问题讨论】:

你可以试试post.image[0].url ..由于图像是一个数组,我认为你需要尝试[0]来获取第一个元素.. @codemonkey,这与 Nextjs 有关,默认情况下会在预渲染页面上调用。参考:nextjs.org/docs/basic-features/… 【参考方案1】:

postimage 属性是一个数组,如第 1 行末尾的括号所示:

1. "image": [
2.   
3.     "name": "snowmountain.jpg",
4.     "url": "https://www.notion.so/image/https:%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F689883de-2434-4be3-8179-a8ba62a7bc1e%2Fsnowmountain.jpg?table=block&id=90ee0723-aeb5-4d64-a970-332aa8f819f6&cache=v2",
5.     "rawUrl": "https://s3-us-west-2.amazonaws.com/secure.notion-static.com/689883de-2434-4be3-8179-a8ba62a7bc1e/snowmountain.jpg"
6.   
7. ],

如果您知道总会有一个图像,您可以通过引用第一个数组项直接访问它。

function Blog( posts ) 
    return (
        <div>
            posts.map((post) => (
                <Link href="/blog/[slug]" as=`/blog/$post.slug`>
                    <div>
                        <div className='text-6xl'>post.title</div>
                        <img className='w-24' src=post.imgUrl></img>

                        
                        post.image && post.image[0].rawUrl

                    </div>
                </Link>
            ))
        </div>
    );

请注意,如果数组是 undefined / null 或者它是空的,这可能会出错,所以你应该通过只显示存在的东西来保护它。

【讨论】:

是的,出现了这个错误:Cannot read property '0' of undefined。即使我尝试过post.image[0].name !== undefined ? 'yes' : nullpost.image[0].rawUrl === undefined ? 'yes' : 'no' 已解决:post.image &amp;&amp; post.image[0].rawUrl【参考方案2】:

如果使用async\await,则无需调用then()方法。

As mdn says:

await 可以放在任何基于异步承诺的函数前面来暂停 您在该行的代码,直到承诺履行,然后返回 结果值。

export const getAllPosts = async () => 
    return await fetch(
        `https://notion-api.splitbee.io/v1/table/$NOTION_BLOG_ID`
    );


export async function getStaticProps() 
    const posts = await getAllPosts()
    return 
        props: 
            posts
        ,
    ;

【讨论】:

当我尝试得到错误提示数据未正确格式化为 JSON 时? @BrucevanZyl 你能在方法getStaticProps() 中显示console.log(posts) 的结果吗?

以上是关于尝试在 React 中映射子对象时出现未定义错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 SharePoint 环境中使用 AngularJS DateRangePicker 时出现未定义错误

遵循 Shopify 的 React 和 Node 教程时出现未处理的运行时错误

React:使用 API 从 Prisma 获取数据时出现未处理的错误 500

将材质应用于 gltf 对象时出现未定义错误

尝试在 if 语句中检查 json 响应时出现未捕获(承诺)错误

在ruby中编译时出现未定义的方法错误