Неперехваченная (в обещании) синтаксическая ошибка: Неожиданный токен в реакции

#reactjs

Вопрос:

я получил эту ошибку

 VM305:1 Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0
 

и я не знаю, почему. Мои данные json:

 [
  {
   "id": 1,
    "title": "Avatar",
    "distributor": "20th Century Fox",
    "year": 2009,
    "amount": "$2,787,965,087",
    "img": {
      "src": "media/avatar.jpg",
      "alt": "avatar"
    },
    "ranking": 1
  },
  {
    "id": 2,
    "title": "Titanic",
    "distributor": "20th Century Fox",
    "year": 1997,
    "amount": "$2,187,463,944",
    "img": {
      "src": "media/titanic.jpg",
      "alt": "titanic"
    },
    "ranking": 2
  },
  {
    "id": 3,
    "title": "Star Wars: The Force Awakens",
    "distributor": "Walt Disney Studios Motion Pictures",
    "year": 2015,
    "amount": "$2,068,223,624",
    "img": {
      "src": "media/star_wars_the_force_awakens.jpg",
      "alt": "star_wars_the_force_awakens"
    },
    "ranking": 3
  },
  {
    "id": 4,
    "title": "Avengers: Infinity War",
    "distributor": "Walt Disney Studios Motion Pictures",
    "year": 2018,
    "amount": "$2,048,359,754",
    "img": {
      "src": "media/avengers_infinity_war.jpg",
      "alt": "avengers_infinity_war"
    },
    "ranking": 4
  },
  {
    "id": 5,
    "title": "Jurassic World",
    "distributor": "Universal Pictures",
    "year": 2015,
    "amount": "$1,671,713,208",
    "img": {
      "src": "media/jurassic_world.jpg",
      "alt": "jurassic_world"
    },
    "ranking": 5
  }
]
 
 class List extends Component {
  constructor() {
    super();
    this.state = {
      data: [],
      loading: true,
    };
  }

  async componentDidMount() {
    
    const movies = await fetch('../../assets/data.json');
    const moviesJSON = await movies.json();
  
    console.log(moviesJSON);
    if (moviesJSON) {
      this.setState({
        data: moviesJSON,
        loading: false,
      });
    }
  }

  render() {
    const { data, loading } = this.state;

    if (loading) {
      return <div>Loading...</div>;
    }

    return (
      <div className='row'>
        {data.map(movie => (
          <div key={movie.id} className='col-sm-2'>
            <Card movie={movie} />
          </div>
        ))}
      </div>
    );
  }
}

export default List;
 

Ответ №1:

URL-адрес, по которому вы получаете json, почти наверняка не возвращает файл json, как вы думаете, а вместо этого отображает страницу с ошибкой HTML (которая начинается с < ). Добавьте a console.log(movies) после выборки, чтобы отладить это.

Кроме того, URL-адрес, который у вас есть, является путем (включая .. ), а не URL-адресом. Вопрос в том, где этот файл обслуживается вашим веб-сервером.

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

1. Согласился Кристиан.

Ответ №2:

 const movies = await fetch('../../assets/data.json');
 

вместо этого вам следует импортировать json в верхней части файла

 import movies from '../../assets/data.json';
 

Затем вы можете получить доступ movies в componentDidMount. Поскольку это локальные данные, вам не нужно вызывать api

Ответ №3:

Вы получаете эту ошибку, когда fetch не возвращает допустимые данные json. Это строка, вызывающая ошибку.

 const moviesJSON = await movies.json();
 

Вы можете попробовать изменить movies.json() movies.text() и войти в систему, чтобы просмотреть данные.

 const moviesJSON = await movies.text();
console.log((moviesJSON));