【问题标题】:How to fix 'TypeError: Cannot read property 'id' of undefined' error in NextJS?如何修复 NextJS 中的“TypeError:无法读取未定义的属性“id”错误?
【发布时间】:2019-04-14 13:47:26
【问题描述】:

我正在我的本地主机上设置一个 NextJS 应用程序,并按照网站上的精彩教程进行操作,但是在插入我的本地 API 时我遇到了问题。

更改 JS 代码时出现错误。错误是

  TypeError: Cannot read property 'id' of undefined
   (anonymous function)
   /Users/mattcohen/hello-
next/.next/server/static/development/pages/index.js:1611:17

这是我对 api 的声明:

Index.getInitialProps = async function() {
  const res = await fetch('http://localhost:8888/api/mods')
  const data = await res.json()

  console.log(`Show data fetched. Count: ${data.length}`)

  return {
    mods: data.mods.map(entry => entry.show)
  }
}

export default Index

这是我的页面布局代码

import Layout from '../components/MyLayout.js'
import Link from 'next/link'
import fetch from 'isomorphic-unfetch'

const Index = (props) => (
  <Layout>
    <h1>Batman TV Shows</h1>
    <ul>
      {props.mods.map(mod => (
        <li key={mod.id}>
          <Link as={`/p/${show.id}`} href={`/post?id=${mod.id}`}>
            <a>{mod.brand_name}</a>
          </Link>
        </li>
      ))}
    </ul>

有什么想法吗?

【问题讨论】:

    标签: reactjs next.js


    【解决方案1】:

    我觉得你写错了

    ...
    <ul>
      {props.mods.map(mod => (
        <li key={mod.id}>
          //              here
          <Link as={`/p/${show.id}`} href={`/post?id=${mod.id}`}>
            <a>{mod.brand_name}</a>
          </Link>
        </li>
      ))}
    </ul>
    

    不应该是 mod.id 而不是 show.id 吗?没有show 变量。

    或者应该是mod.show.id

    编辑:调试它以了解错误是什么

    首先,您可以检查来自props 的内容。

    const Index = (props) => (
      <Layout>
        <h1>Batman TV Shows</h1>
        <p>{JSON.stringfy(props, null, 2)}</p>
        <ul>
          {props.mods.map(mod => (
            <li key={mod.id}>
              <Link as={`/p/${show.id}`} href={`/post?id=${mod.id}`}>
                <a>{mod.brand_name}</a>
              </Link>
            </li>
          ))}
        </ul>
    )
    

    通过这种方式,您将看到正在进入您的组件的所有内容。在那里您可以查看您要显示的数据mod.id 是否在mods.map(mod =&gt; ) 中。但更具体地说,你可以这样做

    const Index = (props) => (
      <Layout>
        <h1>Batman TV Shows</h1>
        <ul>
          {props.mods.map((mod, i) => (
            <li key={i}>
              <p>{JSON.stringify(mod, null, 2)}</p>
            </li>
          ))}
        </ul>
    )
    

    这样你就可以准确地看到mods里面有什么,看看是否有属性id

    有一些更好的方法可以调试它以了解发生了什么,但这种方法更好更明显。

    【讨论】:

    • 您好,非常感谢您抽出宝贵时间回复。我试过改变这些,但仍然得到同样的错误。也许我应该坚持我所知道的,PHP!不太确定它是否与我的 api 的 json 输出有关,与示例中的不同。
    • 如果错误仍然存​​在,可能是因为map.id 不存在。你需要调试它。不放弃 man,reactjs 和 nextjs 都很好。
    • 您能否解释一下从 API 获取数据的函数中发生了什么?当我在浏览器中查看我的 api 时,它吐出的 JSON 代码与示例完全不同。我可能会给 Strapi 一个机会,看看我是否能得到更好的结果。与 PHP 相比,代码也少了很多 - 这就是为什么我真的想进入这个
    • 只需编辑问题,您就可以看到您的组件发生了什么,并找出您出现该错误的原因。
    • .getInitialProps 正在为您的组件定义初始道具,因此当它呈现时,它具有您提供的道具。也许你的 api 得到了一些不同的东西,这就是你遇到这个问题的原因。如果您发布来自 api 的内容,那就太好了
    猜你喜欢
    • 1970-01-01
    • 2019-08-19
    • 2020-01-20
    • 2021-10-03
    • 2021-10-28
    • 2021-03-15
    • 2020-10-01
    • 2022-01-12
    • 2022-11-22
    相关资源
    最近更新 更多