Как исправить ошибку ‘TypeError: не удается прочитать свойство ‘id’ неопределенной’ ошибки в NextJS?

#reactjs #next.js

#reactjs #next.js

Вопрос:

Я настраиваю приложение 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>
  

Есть идеи?

Ответ №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 => ) . Но чтобы быть более конкретным, вы можете сделать

 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 .

Есть несколько лучших способов отладки, чтобы узнать, что происходит, но этот способ является хорошим и более заметным.

Комментарии:

1. Привет, я действительно ценю, что вы нашли время ответить. Я попытался изменить их и все равно получаю ту же ошибку. Может быть, мне следует придерживаться того, что я знаю, PHP! Не слишком уверен, что это как-то связано с выводом json из моего api, который отличается от приведенного в примере.

2. Если ошибка сохраняется, возможно, это потому map.id , что не существует. Вам нужно отладить его. Не сдавайся, чувак, reactjs и nextjs очень хороши.

3. Можете ли вы немного объяснить, что происходит в функции, где она получает данные из API? Когда я просматриваю свой api в браузере, код JSON, который он выдает, сильно отличается от примера. Я мог бы попробовать Strapi и посмотреть, получу ли я лучшие результаты. Также намного меньше кода по сравнению с PHP — вот почему я действительно хочу разобраться в этом

4. Просто отредактируйте вопрос, чтобы вы могли видеть, что происходит с вашим компонентом, и выяснить, почему у вас эта ошибка.

5. .getInitialProps определяет начальные реквизиты для вашего компонента, поэтому при его рендеринге у него есть реквизиты, которые вы предоставляете. Возможно, ваш api получает что-то другое, и именно поэтому у вас возникла эта проблема. Если вы опубликуете то, что поступает из api, это было бы здорово