Fetch在等待很长时间时给出空响应

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fetch在等待很长时间时给出空响应相关的知识,希望对你有一定的参考价值。

我用反应和节点做了app。

react应用程序需要对节点应用程序在端口5100上运行的节点应用程序进行api调用。我面临的问题是,在等待很长一段时间后,我在控制台中得到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如何解决这个问题的任何帮助将不胜感激

答案

将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));});

希望有所帮助。

另一答案

我可能是因为跨源资源共享(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

部分:跨源请求

另一答案

对我来说,问题出在客户端和服务器上。我已经阅读了一些关于如何修复服务器超时的帖子。其中一个是

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的客户端部分,它无法正常工作。所以我所做的就是发布了完整的网址

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

我希望这对其他人也有帮助

另一答案

这是一个API问题。我会在您的API中设置断点,并确保为响应填充了正确的字段。

Node.js Debugging Guide...

以上是关于Fetch在等待很长时间时给出空响应的主要内容,如果未能解决你的问题,请参考以下文章

带有recyclerviews的碎片需要很长时间才能加载

fetch 给出一个空的响应体

当 uWSGI 处理请求需要很长时间时 Nginx 超时

长时间等待 Service Worker 的请求

React JS Fetch 返回空响应,但 Postman 没有

Express.js 响应超时