Axios не работает, а fetch работает

я хочу получить данные (массив) из /{url}, и я пробовал этот код

// Fetch the list on first mount
componentDidMount() {
this.getList();
}

// Retrieves the list of items from the Express app
getList = () => {

fetch('/main')
.then(res => res.json())
.then(list => this.setState({ list }))
}

это работает нормально, но потом я решил переключиться на axios и попробовал буквально тот же код

  // Fetch the list on first mount
componentDidMount() {
this.getList();
}

 // Retrieves the list of items from the Express app
 getList = () => {
 axios.get('/main')
.then(res=> res.json())
.then(list => this.setState({list}))

}

но это не сработало и дало мне ошибку в этой строке: .then(res=> res.json()) поэтому я не знаю, в чем проблема, если кто-нибудь знает ключ, я буду рад, если вы скажете мне

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 925
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это связано с тем, что аксиомы имеют другой ответ, вместо res.json() возвращают данные уже как: return res.data или передают их непосредственно в состояние что-то вроде

getList = () => {
 axios.get('/main')
   .then(res=> this.setState({list: res.data}))

это сработало, но вы можете сказать, почему? какой тип ответа у axios?

ilia 24.02.2019 13:47

ответ от axios - это объект данных (оболочка с большим количеством дополнительных данных) для доступа к данным, обслуживаемым с экспресс-сервера, вам необходимо получить доступ data внутри такого объекта, как response.data

Maielo 24.02.2019 13:51

и какой тип экземпляра является ответом от выборки?

ilia 24.02.2019 13:53

здесь проверьте документы axios github.com/аксиос/аксиос и это о выборке. scotch.io/tutorials/… ...

Maielo 24.02.2019 13:55
Ответ принят как подходящий
// Fetch the list on first mount
componentDidMount() {
  this.getList();
}

// Retrieves the list of items from the Express app
getList = () => {
 axios.get('/main')
 .then(res=> res.data)
 .then(list => this.setState({list}))
 .catch(error => this.setState({error: error.message}))
}

я бы порекомендовал некоторые изменения в вашем дизайне, так как я успешно использую axios во многих проектах, это не требование, но помогает и работает очень надежно:

Создайте сервис наподобие api.js

import axios from 'axios';

export default axios.create({
  baseURL: `http://my.api.url/`
});

Тогда вы можете использовать его так

import API from '../Services/api'; // this is your service you created before

LoadStats = async event => {
    try {
        var response = await API.get('api/targetroute');
        if (response.data != null) {
            this.setState({
                stats: {
                    mydata: response.data
                }
            });
            console.info('Receiving result: '+JSON.stringify(response.data));
        }
    } catch (error) {
        console.info('ERROR: '+error)
    }
}

спасибо, как я заметил, вы изменили код на асинхронный, но я думал, что axios уже был асинхронным с Promise API

ilia 14.03.2019 16:37

axios всегда возвращает обещание, поэтому всегда возникает асинхронный вопрос, как обрабатывать обещание в вашем коде. есть несколько способов: использование подписок или обработка промисов с помощью /catch или использование асинхронного декоратора — все они обрабатывают промисы с другим дизайном программного обеспечения. я обычно предпочитаю использовать асинхронный декоратор, так как я исхожу из С#, и мне нравится поток программирования, который он позволяет ... конечно, иногда лучше просто подписаться на событие, я лично думаю, что цепочка обещаний, тогда / catch - это не так, как это абсолютный беспорядок, но это мое личное мнение

xzesstence 14.03.2019 16:40

если вы спросите меня, нет необходимости в baseUrl (по крайней мере, в моем случае), потому что я его не использую, и он все еще не блокирует запрос на перекрестное происхождение

ilia 14.03.2019 16:45

мне нравится ясность и красота, поэтому, используя несколько API / маршрутов / сервисов, мне нужно только изменить базовые URL-адреса, изменить серверы и т. д. обычно у вас есть несколько маршрутов для каждого API, поэтому в целом все маршруты имеют базовый URL-адрес, конечно, это личный дизайн, делайте, как хотите :) что вы подразумеваете под ... все еще не блокирующим CORS?

xzesstence 14.03.2019 16:50

о, я забыл сказать, что я использую модуль cors на стороне сервера, но я думаю, что все было бы хорошо, если бы у меня его не было, да, он не блокирует CORS

ilia 14.03.2019 16:53

я буду рад, если вы сможете помочь мне с вопросом, это действительно раздражает stackoverflow.com/questions/55167140/…

ilia 14.03.2019 17:06

Ну, запросы от клиентов блокируются, если они выполняются в соответствии с той же политикой происхождения, и на стороне сервера не определено исключение CORS. В целом это проблема безопасности браузера/клиента. Перед отправкой запроса (из браузера/клиента) браузер отправляет предварительный запрос параметров, чтобы проверить, разрешен ли запрос CORS.. (если это не SOP) в большинстве случаев вы можете установить плагин браузера cors для разработки целей. в производстве вы определяете CORS на стороне сервера. это не влияет на дизайн программного обеспечения с использованием службы и базового URL-адреса

xzesstence 14.03.2019 17:11

Эй, @Jake, я посмотрел, но как раз в этот момент кто-то дал хороший ответ. если у вас есть дополнительные вопросы, просто дайте нам знать :)

xzesstence 14.03.2019 17:15

я тоже проголосовал за вас и ваш комментарий, возможно, есть проблема в Stackoverflow

ilia 18.03.2019 11:10

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