Как я могу заставить свою ошибку выборки отображать код состояния http?

У меня есть компонент реакции, и я делаю сетевой вызов, чтобы установить состояние. В конце концов я хочу передать это другим дочерним компонентам, но на данный момент просто заставляю работать сантехнику.

Я пытаюсь правильно отловить ошибки при вызове моего бэкэнда (экспресс-сервера в приложении). Я попытался вызвать ошибку, извлекая данные из конечной точки, которой не существует. Это должно вызвать ошибку 404, поскольку его не существует, верно? Как я могу вывести эту ошибку в операторе catch? Прямо сейчас моя ошибка SyntaxError: Unexpected token < in JSON at position 0 at eval (app.js:61)

export default class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
      data: null
    };
  }

  componentDidMount() { 
    fetch('/api/wrong_endpoint').then((data) => {
      return data.json();
    }).then((body) => {
      this.setState({data: body})
    }).catch(err => console.info(err));

  }

  render() {
    console.info('logging the states');
    console.info(this.state.data);
    return (
      <div>
        <ContactList />
        <ContactDetail />
        <AddContactModal />
      </div>
    );
  }
}

Взгляните на документы негодяй. Это библиотека-оболочка для fetch(). Она ответит на ваш вопрос и, возможно, вам будет интересно использовать ее для обработки ошибок. 404 не перейдет к fetch() catch, если вы не проверите статус (прежде чем вернуть data.json() и выдать свою собственную ошибку

charlietfl 01.04.2019 04:50

Вы пытаетесь распечатать код/сообщение об ошибке или что-то в этом роде?

wentjun 01.04.2019 04:53

@charlietfl хорошо. Достаточно ли стандартно проверять такой статус и печатать ошибку? Это где я делаю сетевой вызов, не так ли? В конечном итоге этот код будет перемещен из компонента в какой-либо файл, предназначенный для связи с сервером.

intA 01.04.2019 04:59

@wentjun да, это то, что я пытаюсь сделать.

intA 01.04.2019 05:00

Да... вам нужно создать собственную шаблонную обработку ошибок при использовании fetch(). Я предпочитаю, чтобы библиотека сделала это за меня. Также упрощает публикацию данных

charlietfl 01.04.2019 05:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
2 808
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

постараюсь идти поэтапно

  1. fetch метод не выдает ошибку, даже если вы получаете коды ответа 4xx или 5xx. Пожалуйста, внимательно прочитайте о Fetch API, я думаю, вы можете найти много интересного, о чем вы не знали.

  2. Вы можете легко проверить статус ответа следующим образом (пожалуйста, прочитайте об объекте Response и его методах/свойствах):

fetch('/api/wrong_endpoint').then((response) => {
    console.info('status code', response.status)
})
  1. Трудно сказать, действительно ли ваш сервер возвращает код 404, потому что я не знаю вашей экспресс-настройки. Если вы установите какой-нибудь резервный обработчик, например app.get('*', ...), он также может вернуть код успеха 200. Вы можете проверить статус ответа и его тело в devTools браузера. Но я считаю, что лучше настроить хотя бы свой /api роутер так, чтобы он возвращал ошибку 404, если запрошенный /api/... маршрут не найден.

  2. В чем я действительно уверен, так это в том, что ваш сервер возвращает HTML-макет в ответе. И вы пытаетесь разобрать его как строку JSON через data.json() и, конечно же, получаете синтаксическую ошибку, поскольку это не JSON (разметка html начинается с символа <, отсюда и ошибка: SyntaxError: Unexpected token <)

Хороший подробный ответ

charlietfl 01.04.2019 05:19

Как правило, если вы используете fetch API, ошибки 40x и 50x не попадут в последующие блоки, так как обещание от fetch отклоняет только сетевые ошибки (а не ошибки HTTP или что-то еще). Поэтому запрос данных из «неправильной» конечной точки будет обрабатываться в первом блоке then.

Я бы порекомендовал вам использовать проверку тела ответа http на основе свойства Response.Ok. Успешные ответы будут обрабатываться в рамках этого условия, тогда как любые другие ответы (ok: false) будут обрабатываться в другом операторе.

fetch('/api/wrong_endpoint')
  .then(response => {
    console.info(response) // full response body
    console.info(response.status); // get only the response.status
    if (!response.ok) {
      // http errors 40x and 50x will go into this statement
      // do something to handle it
    } else if (response.ok) {
      // handles status code 200
    }
  })
  .then(
    // ...

Другие вопросы по теме