Почему Safari дублирует запрос GET, а Chrome нет? - PullRequest
3 голосов
/ 24 июня 2019

Обновление

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

Как воспроизвести

  1. Нажмите кнопку - см. Запрос GET в журнале

  2. Обновить страницуБЕЗ повторного нажатия кнопки - см. Дубликат запроса в журнале

Ожидаемое поведение

Я ожидаю, что после нажатия кнопки и перезагрузкистраница БЕЗ повторного нажатия кнопки, чтобы не было повторного запроса, но запрос действительно НЕМЕДЛЕННО дублируется запросом после перезагрузки страницы.

Журнал сервера после перезагрузки страницы Safari (ошибка):

GET / path / to / testError 304 3,206 мс - -

... (другие обычные запросы) ...

Журнал сервера после перезагрузки страницы Chrome (ожидается):

... (другие обычные запросы) ...

Изменения

Я попытался установить атрибут type для кнопки 'button' (ошибка сохраняется)

Я пытался использовать CMD + R и кнопку Обновить страницу (ошибка в обоих)

Ссылка на отчет об ошибке

Сообщение об ошибке

1 Ответ

0 голосов
/ 10 июля 2019

Исправлена ​​ошибка в WebKit.Ссылка на Changeset 247276 в наборе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...