Не удается получить GET с Express. js PUT маршрута, почему? - PullRequest
0 голосов
/ 11 января 2020

Есть ли причина, по которой вы не можете выполнить запрос GET изнутри Express. js router.put ()?

У меня есть два маршрута. Точно такой же вызов API работает в маршруте router.get () и зависает в router.put ().

Я подтвердил, что

Это работает:

router.get('/:id', async (req, res) => {
  const { headers } = req;
  let result;
  try {
    result = await axios({ method:'get', url: '/some-url', headers });
  } catch(error) {
    res.status(500).send(new Error('myError');
  }
  res.send({ result });
});

Это НЕ работает:

router.put('/:id', async (req, res) => {
  const { headers } = req;
  let result;
  let finalResult;

  try {
    result = await axios({ method:'get', url: '/some-url', headers });
  } catch(error) {
    res.status(500).send(new Error('myError');
  }

  // logic based on the result of the above GET determines what the value of `finalResult`
  finalResult = { some: 'data' };

  res.send({ finalResult });
});

Даже если axios({ method:'get', url: '/some-url' }) одинаково для обоих маршрутов, оно работает в одном, а не в другом.

Маршрут router.put() всегда зависает на долгое время и в итоге Node выдает: Error: socket hang up, code: 'ECONNRESET', etc...

Цени любую помощь, я потратил целый день, ломая голову над этим.

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Root причина моей проблемы:

Заголовки http имели ключ Content-Length, который препятствовал правильному разрешению вызовов GET.

Так как эти вызовы API происходили в обратном вызове router.put (), заголовки имели Content-Length, указывающий на размер "тела" полезной нагрузки, которое начиналось с PUT.

Решение:

Удалите это поле Content-Length из моих заголовков при выполнении GET внутри router.put (), чтобы в GET были все остальные данные заголовков, кроме Content-Length

К сожалению, NodeJS только что выбросил это сообщение Error: socket hang up, которое не очень описывало основную проблему.

0 голосов
/ 11 января 2020

Нет, такого нет в express. Попробуйте нажать GET-запрос от почтальона или локона и посмотрите, будет ли ответ. Причиной root может быть неверный запрос get, который вы пытаетесь сделать, или сервер, на котором вы делаете запрос GET, может быть недоступен. Вы можете запустить следующее для проверки

app.put('/',async (req, res) => {
    let response  = await axios.get('https://google.co.in');
    console.log(response.data);
    res.send({"works": "hello"});
});
...