防止使用 fetch 发送多个 http 请求

Posted

技术标签:

【中文标题】防止使用 fetch 发送多个 http 请求【英文标题】:prevent multiple http request send by using fetch 【发布时间】:2021-03-22 16:57:53 【问题描述】:

我正在创建一个 chrome 扩展程序,在其中我使用提示符获取输入并使用 HTTP 请求将其发送到服务器。通过这样做,我面临着数据重复,这意味着扩展正在向服务器发送多个请求,我想防止这种情况发生。 (注意:只有在发送相同数据的多个请求时才从提示中获取数据)

示例代码: 前端:

var data = prompt("Enter your data here");
if (data !== null || data !== '')
fetch('http://localhost:3000/post', 
  method: 'POST',
  body: JSON.stringify(
    data: data
  ),
  headers: 
    'Content-Type': 'application/json',
  
).then((res) => 
  console.log("wait for whole req");
  return res.json();
).then((resData) => 
  console.log(resData);
  console.log("req send successfully");
  // note = null;
).catch((error) => 
  // note = null;
  console.log(error.message);
  // alert(error.message);
);

后端:

app.post("/post", function(req, res) 
    const data = req.body.data;
    dataList.push(data);
    res.status(200).json(
       status: "uploaded"
    );
);

在这里,data 是一个数组,用于存储从用户那里获取的数据。

【问题讨论】:

多次请求是什么原因?用户输入? 是的,用户输入可能是那个问题,也许它正在创建多个线程。我不知道 【参考方案1】:

你可以通过一个标志来限制并发请求

var data = null, 
isLoading = false, // perhaps you need to make this persistent depending on your overall architecture
if (!isLoading) 

   data = prompt("Enter your data here");

if (data !== null || data !== '')
isLoading = true;
fetch('http://localhost:3000/post', 
  method: 'POST',
  body: JSON.stringify(
    data: data
  ),
  headers: 
    'Content-Type': 'application/json',
  
).then((res) => 
  console.log("wait for whole req");
  
  return res.json();
).then((resData) => 
  console.log(resData);
  console.log("req send successfully");
  isLoading = false
  // note = null;
).catch((error) => 
  // note = null;
  console.log(error.message);
  isLoading = false
  // alert(error.message);
);

【讨论】:

以上是关于防止使用 fetch 发送多个 http 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 fetch 从通过 golang 提供的 HTML 文件发送请求

原fetch跨域请求附带cookie(credentials)

Chrome 拓展开发 Service Worker 无法使用 XMLHttpRequest 发送 HTTP 请求

提高 Javascript 中多个 FETCH 请求的性能

POST 请求 Fetch API 防止重定向

Fetch