API не возвращает правильный JSON (react / express / axios)

Я чувствую, что это должен быть дубликат ... Если это так, я не нахожу нужную ветку.

У меня есть Express API (использующий mongoose) на сервере с интерфейсом React. API должен вернуть клиенту JSON.

Проблема: он отлично работает с Postman, но возвращает неправильный JSON в React

То, что я отправляю в Postman (это дает правильный ответ):

{"fileHashValue"
:
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}

Код сервера:

app.get("/userData", function(req, res) {
  const fileHashValue = req.body.fileHashValue;
  UserData = UserData.findOne(
    {
      fileHashValue
    },
    function(err, userdata) {
      res.json({
        userdata
      });
    }
  );
});

Код клиента:

componentDidMount() {
  axios
    .get(
      "http://ec2-52-53-190-3.us-west-1.compute.amazonaws.com:3000/userData",
      {
        fileHashValue:
          "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
      }
    )
    .then(res => {
      console.info(res.data);
    });
}

Кажется, что все это должно работать, но он отвечает, как будто я отправил пустой запрос. IE, если я отправлю пустой запрос в Postman, он даст мне тот же результат, что и я вхожу в React. Любая помощь приветствуется, спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
425
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Функция axios.get() ожидает конфигурацию запроса в качестве второго параметра (не ваших исходных параметров).

Вы можете установить свои параметры следующим образом:

axios.get("http://ec2-52-53-190-3.us-west-1.compute.amazonaws.com:3000/userData", {
    params: {
        fileHashValue: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    }
})
.then(res => {
        console.info(res.data);
});

Более подробное объяснение: https://flaviocopes.com/axios/#get-requests


Как упоминалось в другом ответе, использование глагола get может не соответствовать вашим потребностям. Get в основном используется для получения ресурса и не может содержать тело. Использование post может предотвратить это. Сообщение в основном используется для создания ресурса и может иметь тело:

axios.post("http://ec2-52-53-190-3.us-west-1.compute.amazonaws.com:3000/userData", {
    params: {
        fileHashValue: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    }
})
.then(res => {
        console.info(res.data);
});

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

axios.get("http://ec2-52-53-190-3.us-west-1.compute.amazonaws.com:3000/userData/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", {})
.then(res => {
        console.info(res.data);
});

И адаптируйте свой бэкэнд:

app.get("/userData/:id", function(req, res)

После этого идентификатор будет доступен в req.params.id.

Спасибо за ответ. К сожалению, здесь отображается тот же журнал, что и в исходном вопросе.

Hanley Soilsmith 17.12.2018 16:44

Странно, вы можете распечатать, что находится в вашей переменной req.body на сервере?

Treycos 17.12.2018 16:47

Кроме того, что печатается в сетевой части консоли вашего браузера после отправки запроса?

Treycos 17.12.2018 16:50
postman возвращает e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852‌ b855 react возвращает "undefined" Спасибо за вашу помощь, мне нужно уйти к чему-то другому на несколько часов, хорошего дня :)
Hanley Soilsmith 17.12.2018 16:53

это когда я добавляю console.info(req.body.fileHashValue) в свой серверный код

Hanley Soilsmith 17.12.2018 16:54

Хорошо, понятно, не могли бы вы показать мне, как выглядит сетевая консоль вашего браузера после отправки вашего запроса

Treycos 17.12.2018 16:56

Консоль браузера регистрирует create_date: "2018-12-16T11:34:42.703Z" myID: "b2092b3e6f270099fe4433a67e9f32dedf19fb6a1de2a0229da2" __v: 0 _id: "5c16385222e88522785c9758". Это запись в базе данных. Это та же запись, которую вы получите, если отправите пустой запрос почтальону.

Hanley Soilsmith 18.12.2018 02:59

Хорошо, я обновил свой пост, скажите, если у вас все еще есть проблемы

Treycos 18.12.2018 09:04

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

Hanley Soilsmith 18.12.2018 20:30

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

Treycos 18.12.2018 20:41

Согласно инструкциям в этом потоке, не рекомендуется использовать .get (на самом деле, вообще). Как новичок, я никогда не припомню, чтобы в каких-либо обучающих материалах упоминалось об этом.

HTTP GET с телом запроса

Ответ на вопрос - переключить логику клиента и сервера на axios.post и отправить json, как показано в исходном сообщении.

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