Javascript 为什么Safari复制GET请求,而Chrome没有?

Javascript 为什么Safari复制GET请求,而Chrome没有?,javascript,node.js,safari,duplicates,fetch,Javascript,Node.js,Safari,Duplicates,Fetch,更新 TL;DR:这可能是Safari和/或Webkit中的一个错误 较长的TL;DR:在Safari中,在使用Fetch API发出GET请求后,即使发出请求的代码被删除,Safari也会在页面重新加载时自动(无意)重新运行请求 新发现的最小可复制代码(以下由Kaido提供): 前端 fetch(“/url”) 原创帖子 我有一个javascript web应用程序,它使用FetchAPI在Node.js(express)服务器上发出GET请求 在Safari中(问题在于): 请求按预期完成

更新

TL;DR:这可能是Safari和/或Webkit中的一个错误

较长的TL;DR:在Safari中,在使用Fetch API发出GET请求后,即使发出请求的代码被删除,Safari也会在页面重新加载时自动(无意)重新运行请求

新发现的最小可复制代码(以下由Kaido提供):

前端

fetch(“/url”)
原创帖子

我有一个javascript web应用程序,它使用FetchAPI在Node.js(express)服务器上发出GET请求

在Safari中(问题在于): 请求按预期完成

但是

当我重新加载页面时,它将重新发送GET请求,从而导致重复

在铬中(作为控制): 一切正常

HTML


前端JS

class ErrorReproduce{
     constructor(){}

     makeButton(){
          let button = document.createElement('button');
          button.innerText = 'Send get request';
          button.onclick = ()=>{
               this.asyncMethod();
          };
          buttonTarget.appendChild(button);
     }//end makeButton()

     async asyncMethod(){
          let data = await fetch('path/to/testError', {
               method: 'GET',
               cache:'no-cache',
               credentials: 'same-origin',
               headers: {
                    'Content-Type': 'application/json',
               },
          }).then(response => response.json());
     }//end asyncMethod
}//end ErrorReporduce

let errRepro = new ErrorReproduce();
errRepro.makeButton();
后端JS

router.get('path/to/testError',(req,res)=>{
     res.send({ok:true});
})

如何复制

  • 单击按钮-查看日志中的GET请求

  • 无需重新单击按钮即可重新加载页面-请参阅日志中的重复请求

  • 预期行为

    我希望在单击按钮并重新加载页面而不再次按下按钮后,不会出现重复请求,但在页面重新加载后,浏览器确实会立即复制请求

    页面重新加载Safari后的服务器日志(错误):

    GET/path/to/Tester错误304 3.206毫秒--

    。。。(其他正常请求)

    页面重新加载Chrome后的服务器日志(预期):

    。。。(其他正常请求)

    编辑

    我尝试将按钮的type属性设置为“button”(错误仍然存在)

    我试着使用CMD+R和重新加载页面按钮(两者都有bug)

    错误报告链接


    WebKit中的错误已修复。链接到

    您的意思是,您先单击该按钮,然后重新加载页面,在不再次单击按钮的情况下,浏览器会自动发出请求?你是如何重新加载页面的?如果您将您的
    类型
    属性设置为
    “button”
    ,该怎么办?@kaido更正:(1)单击按钮-查看日志中的请求(2)在不再次按下按钮的情况下重新加载页面(我使用CMD+R)-再次查看日志中的请求。我将尝试你的建议,并编辑我的问题,以包括新的信息。谢谢。@kaido我试过button.type='button'和button.setAttribute('button'),但错误仍然存在。我将尝试一个不同的页面重新加载。终于有一点时间来测试它,我可以重新加载。。。在使用XMLHttpRequest时也会发生这种情况,在解析时从全局范围执行请求时也会发生这种情况。这意味着一个最小的复制就是
    fetch('/url')
    然后重新加载,看看每次重新加载时如何得到两个对/url的请求,然后即使删除了
    标记,仍然是一个来自任何地方的请求。我再一次用完了进一步挖掘的时间,但老实说,我会认为这是一个错误,并建议您打开WebKIT的Bug Trrace.Ps上的一个问题。应该注意的是,这些请求是从网络面板中隐藏的,即使是“保存日志”。注释不是永久的,您至少可以在这个答案中包含bug报告的链接。