Fetch дает пустой ответ во время ожидания в течение длительного периода - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть приложение, созданное с реакцией и узлом.

Приложение реагирования должно выполнить вызов API для приложения узла, которое приложение узла запускает на порту 5100.Я столкнулся с проблемой, когда я получаю пустой ответ net_err в консоли после долгого ожидания.Дело в том, что мой API требует 200 с, чтобы получить ответ от сервера.

Когда я нажимаю

http://localhost:5100/api/users/wait-ip

Я получаю ответ через 200 секунд Но когда я нажимаю это в приложении реагирования

fetch('/api/users/wait-ip')

Я получаю следующую ошибку на консоли

 GET http://localhost:3000/api/users/wait-ip net::ERR_EMPTY_RESPONSE

Это моя функция для API

router.get('/api/users/wait-ip',(req,res)=>{
//Others things happen here
 setTimeout(()=>{
    return res.json({
        data:1
    })
},150000)
})

Это ответ, который я получаю при прямом нажатии на браузер через 150 секунд

Browser response Любая помощь о том, как решить эту проблему, будет оценена

Ответы [ 4 ]

2 голосов
/ 19 апреля 2019

Использование Node.js API с React является распространенным случаем. Я думаю, что причина получения ответа заключается в том, что вы используете fetch вызов синхронно. Всегда используйте async / await для этого.

async function getUsers() {

  let response = await fetch('/api/users/wait-ip');
  let users= await response.json();
  //...
  return users;
}

Использование функции:

getUsers().then(result => {console.log(JSON.stringify(result));});

Надеюсь, это поможет.

1 голос
/ 24 апреля 2019

Для меня проблема была как на клиенте, так и на сервере.Я прочитал некоторые из постов о том, как исправить время ожидания на сервере.Один из них был

const server = http.listen(port, () => console.log(`Server running on port ${port}`));
server.timeout = 200000;

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

Для асинхронного вызова мне нужно установить его для каждой функции, где я хотел, вот так

 router.get('/wait-ip',(req,res)=>{
 req.timeout =160000;
     setTimeout(()=>{
         return res.json({
             data:1
         })
     },150000)
})

И для клиентской части с pxoy это не работало должным образом.Итак, то, что я сделал, было опубликовано полный URL

fetch('http://localhost:5100/api/users/wait-ip')

Я надеюсь, что это помогает и с другим человеком

1 голос
/ 24 апреля 2019

Возможно, это из-за заголовка перекрестного общего ресурса (CORS). Обычно при вызове из браузера выполняется вызов «OPTION», за которым следует, в данном случае, «GET».

Я бы попробовал

fetch('/api/users/wait-ip',  {
  mode: 'no-cors' // 'cors' by default
})

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

ref: https://developers.google.com/web/ilt/pwa/working-with-the-fetch-api

раздел: запросы между источниками

0 голосов
/ 18 апреля 2019

Это проблема API. Я бы установил контрольные точки в вашем API и удостоверился, что для ответа заполнены правильные поля.

Node.js Руководство по отладке ...

...