JavaScript Fetch автоматически повторно передает запросы на потоковую передачу файловJavascript

Форум по Javascript
Ответить
Anonymous
 JavaScript Fetch автоматически повторно передает запросы на потоковую передачу файлов

Сообщение Anonymous »

Я сталкиваюсь со странной проблемой, и я не совсем понимаю, ожидается ли это или это ошибка, вызванная мне, и если да, как это исправить. < /p>
Проблема: < /h2>
при использовании функции Fetch в Javascript для загрузки файла на мой сервер, если сервер отвергает запрос и возвращает с кодами состояния 4xx или 5xx, функции Fetch или чего -то более глубокого в JavaScript, кажется, снова делает запрос несколько раз. Br />

Код: Выделить всё

2025-02-25T13:41:15.276671Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_request: started processing request
2025-02-25T13:41:15.276853Z ERROR request{method=POST uri=/upload_file version=HTTP/1.1}: web_servicer_library::axum_server::web_api_request_processor: error_message="Request failed validation: filename size exceeds 50"
2025-02-25T13:41:15.276996Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_response: finished processing request latency=0 ms status=400
2025-02-25T13:41:15.277970Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_request: started processing request
2025-02-25T13:41:15.278064Z ERROR request{method=POST uri=/upload_file version=HTTP/1.1}: web_servicer_library::axum_server::web_api_request_processor: error_message="Request failed validation: filename size exceeds 50"
2025-02-25T13:41:15.278171Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_response: finished processing request latency=0 ms status=400
2025-02-25T13:41:15.279220Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_request: started processing request
2025-02-25T13:41:15.279310Z ERROR request{method=POST uri=/upload_file version=HTTP/1.1}: web_servicer_library::axum_server::web_api_request_processor: error_message="Request failed validation: filename size exceeds 50"
2025-02-25T13:41:15.279411Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_response: finished processing request latency=0 ms status=400
2025-02-25T13:41:15.280077Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_request: started processing request
2025-02-25T13:41:15.280153Z ERROR request{method=POST uri=/upload_file version=HTTP/1.1}: web_servicer_library::axum_server::web_api_request_processor: error_message="Request failed validation: filename size exceeds 50"
2025-02-25T13:41:15.280237Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_response: finished processing request latency=0 ms status=400
2025-02-25T13:41:15.282600Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_request: started processing request
2025-02-25T13:41:15.282678Z ERROR request{method=POST uri=/upload_file version=HTTP/1.1}: web_servicer_library::axum_server::web_api_request_processor: error_message="Request failed validation: filename size exceeds 50"
2025-02-25T13:41:15.282767Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_response: finished processing request latency=0 ms status=400
2025-02-25T13:41:23.860972Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_request: started processing request
2025-02-25T13:41:23.877111Z DEBUG request{method=GET uri=/_app/immutable/assets/ProximaNova-Semibold.BI3UiExG.otf version=HTTP/1.1}: tower_http::trace::on_request: started processing request
2025-02-25T13:41:23.878281Z DEBUG request{method=GET uri=/_app/immutable/assets/ProximaNova-Semibold.BI3UiExG.otf version=HTTP/1.1}: tower_http::trace::on_response: finished processing request latency=1 ms status=200
2025-02-25T13:41:24.525978Z DEBUG request{method=POST uri=/upload_file version=HTTP/1.1}: tower_http::trace::on_response: finished processing request latency=665 ms status=200
< /code>
Это, кажется, происходит произвольное количество раз. Иногда это случается только один раз. Такое поведение не происходит для других запросов API, и, кажется, никогда не происходит, когда ответ является успешным, что заставляет меня предположить, что он связан с запросом на потоковую передачу файлов. < /P>
Может быть, потому что мой сервер Разве не начинает читать запрос и не отклоняет его вместо этого, JavaScript под капотом пытается снова сделать запрос? Это происходит и в других браузерах, кстати, а не только на хром. У кого -нибудь есть идеи, почему это будет происходить?
[*] сделан с помощью [b] rust [/b], используя библиотеки [b] axum [/b]. конец зарегистрирован, поэтому у меня есть Обзор действия. Например, он ожидает только файл определенного типа. Он также имеет слишком большие файлы проверки размера и отклоняет.  >
< /ul>
Основной функцией сервера является в основном что -то подобное (за исключением всей настройки Axum, маршрутизации сервера и реализаций признаков ржавчины): < /p>
pub async fn upload_file(
headers: HeaderMap,
req: Request,
) -> impl IntoResponse {
// Code to check headers and reject if invalid.

// Code to create directory and file and return if error

// If a size of the body is provided, check early.
let mut body: axum::body::Body = req.into_body();
if body
.size_hint()
.upper()
.is_some_and(|size| size > FILE_UPLOAD_FILE_MAX_SIZE_IN_BYTES.try_into().unwrap())
{
// return error.
}

while let Some(chunk) = body.frame().await {
match chunk {
Ok(frame) => {
if let Some(data) = frame.data_ref() {
file_size_in_bytes_tally += data.len();

// File size check.
if file_size_in_bytes_tally > FILE_UPLOAD_FILE_MAX_SIZE_IN_BYTES {
// return error.
}

// Write and check its result.
if let Err(e) = file.write_all(data).await {
// return error.
}
}
}
Err(e) => {
// return error.
}
}
}

// return success
}
frontend:
  • сделан с svelte и typescript . /> Код: < /li>
    < /ul>
    /**
    * Helper function to make a request to the server with a file as the body.
    * @param urlAndMethod The URL and HTTP method to call for this request
    * @param file The file to stream over to the server
    * @returns A response from the server
    */
    export async function MakeServerRequestWithFileBody(
    urlAndMethod: UrlAndMethodPair,
    file: File
    ): Promise {
    const headers = new Headers();
    headers.append(FILE_UPLOAD_NAME_HTTP_HEADER_KEY, file.name);

    let request: RequestInit = {
    method: urlAndMethod.method,
    headers: headers,
    body: file,
    };

    const response = await fetch(urlAndMethod.url, request);

    if (response.ok == false) {
    console.error(
    "Server could not handle " +
    urlAndMethod.url +
    " request, result code: " +
    response.status +
    " with accompanying text: " +
    response.statusText,
    request,
    response
    );
    } else {
    console.log(
    "Made successful request with to " + urlAndMethod.url,
    request,
    response
    );
    }

    return response;
    }
    < /code>

    Urlandmethodpair - это пользовательский тип, содержащий тип метода URL и HTTP. < /li>
    Ответ возвращается и обрабатывается вызовая функция.


Подробнее здесь: https://stackoverflow.com/questions/794 ... g-requests
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»