Можно ли обнаружить немедленное обнаружение при отправке короткого запроса POST с помощью AXIOS - PullRequest
0 голосов
/ 06 августа 2020

Я использую AX IOS в веб-клиенте, чтобы отправить файл на сервер express в качестве загрузки. Поскольку и размер файла, и пропускная способность пользователя-клиента являются переменными, для завершения sh запроса POST может потребоваться определенное время. На бэкэнде применяется некоторый лог c, и запрос немедленно отклоняется.

Проблема в том, что клиент получает ответ только после завершения запроса, что может длиться несколько секунд.

Я уже проверял, что это не ошибка серверной части, так как поведение такое же при POSTing на любой произвольный URL-адрес с поддержкой публикации в Интернете, независимо от технологии. Вот (более) упрощенный пример случая.

Вот действие публикации. Обратите внимание на одобренный запрос на произвольный URL-адрес с включенной публикацией. Он ведет себя точно так же:

try{
    console.log("posting....")
    const res = await axios.post("http://localhost:4000/upload", formData)
    // const res = await axios.post("https://github.com/logout", formData)
    console.log("result:")
    console.log(res)
}catch(err){
    console.error(err)
}

И демонстрационный express бэкэнд-маршрут:

app.post("/upload", (req, res) => {
    console.log("Rejecting...")
    res.status(403).send()
    console.log("Rejected.")
    return
})

В целях тестирования я выбираю файл размером 3,7 МБ и уменьшаю пропускную способность моего браузера до предустановка Fast 3G.

Бэкэнд немедленно выводит:

Rejecting ... Rejected.

Тогда как запрос ожидает обработки около 43 секунд до возврат ошибки 403:

devtools запросить проверку

Я упустил что-то очевидное? Это настолько распространенная функция, что заставляет меня сомневаться, что это правильный способ обработки. И если это действительно так, то есть ли у нас какая-либо информация о том, активен ли поток express в это время, или это просто неудобство для клиента?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Кажется, что сначала отправка заголовков ответа и затем ручное уничтожение запроса делает трюк:

app.post("/upload", (req, res) => {
    console.log("Rejecting...")
    res.status(403).send("Some message")
    return req.destroy()
})

Запрос AX IOS остается в ожидании до тех пор, пока не будет загружен только текущий фрагмент, а затем немедленно приведет к правильному статусу и сообщению. В примере с уменьшенным быстрым 3g время ожидания уменьшилось с 43 до 900 мс. все еще будет заинтересован в решении, ориентированном на AX IOS, если оно существует.

0 голосов
/ 06 августа 2020

Я считаю, что вы могли бы просто использовать res.status (403) вместо res.status (403) .send ().

Вы также можете попробовать использовать res.status (403) .end () и Я не уверен, почему вы должны использовать оператор return в части маршрутизатора.

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