Обновление
TL; DR : Это потенциально ошибка в Safari и / или Webkit.
Long TL;DR : в Safari после использования API Fetch для выполнения запроса GET Safari автоматически (и непреднамеренно) повторно выполнит запрос при перезагрузке страницы , даже если код, который выполняет запрос,удалено .
Недавно обнаруженный минимальный воспроизводимый код (любезно предоставлено Kaiido ниже):
Front end
<script>fetch('/url')</script>
Исходное сообщение
У меня есть веб-приложение javascript, которое использует API выборки для выполнения запроса GET на сервере Node.js (экспресс).
В Safari (где проблема): запрос завершается, как и ожидалось.
НО
Когда я перезагружаю страницу, она повторно отправляет запрос GET и, таким образом, вызывает дубликаты.
В Chrome (действует как контроль): все работает (т.е. не дублируется)).
HTML
<div id="buttonTarget"></div>
Front End 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();
Backend JS
router.get('path/to/testError',(req,res)=>{
res.send({ok:true});
})
Как воспроизвести
Нажмите кнопку - см. Запрос GET в журнале
Обновить страницуБЕЗ повторного нажатия кнопки - см. Дубликат запроса в журнале
Ожидаемое поведение
Я ожидаю, что после нажатия кнопки и перезагрузкистраница БЕЗ повторного нажатия кнопки, чтобы не было повторного запроса, но запрос действительно НЕМЕДЛЕННО дублируется запросом после перезагрузки страницы.
Журнал сервера после перезагрузки страницы Safari (ошибка):
GET / path / to / testError 304 3,206 мс - -
... (другие обычные запросы) ...
Журнал сервера после перезагрузки страницы Chrome (ожидается):
... (другие обычные запросы) ...
Изменения
Я попытался установить атрибут type для кнопки 'button' (ошибка сохраняется)
Я пытался использовать CMD + R и кнопку Обновить страницу (ошибка в обоих)
Ссылка на отчет об ошибке
Сообщение об ошибке