API не возвращает правильный JSON (реагирует / экспресс / axios) - PullRequest
0 голосов
/ 17 декабря 2018

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

У меня есть 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.log(res.data);
    });
}

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

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

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

Ответ на вопрос заключается в том, чтобы переключить логику клиента и сервера на axios.post и отправить json, как показано вОригинальный пост.

0 голосов
/ 17 декабря 2018

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

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

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

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

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

И измените свой бэкэнд:

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

Идентификатор будет доступен в req.params.id

...