Обработка сообщений об ошибках при получении blob через AJAX

как я могу выполнить вызов AJAX, который может возвращать blob или текстовую строку в зависимости от ответа сервера?

Я использую AJAX для преобразования пользовательского видео в аудио blob (для использования в <audio> tag). Процесс преобразования работает нормально, но всегда возможно, что с видео что-то не так, и в этом случае сервер вернет код состояния HTTP 500 с сообщением об ошибке в теле ответа в виде открытого текста. В таком случае, я нужен открытый текст ответа, но попытка использовать responseText приводит к этому сообщению об ошибке:

Uncaught InvalidStateError: Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'blob').

вот упрощенная версия мой код:

function convertToAudio(file) {
    var form = new FormData();
    form.append("Video", file, file.name);

    var request = new XMLHttpRequest();
    request.onreadystatechange = function() {
        if(request.readyState == 4 && request.status == 200) {
            console.log(typeof request.response); // should be a blob
        } else if(request.readyState == 4 && request.responseText != "") {
            console.log(request.responseText);
        }
    };
    request.open("POST", "video_to_audio", true);
    request.responseType = "blob";
    request.send(form);
}

Я использую jQuery в другом месте моего кода (поэтому ответы jQuery приемлемы), но, насколько я знаю, jQuery не обрабатывает капли.

1 ответов


Установите тип ответа, когда readyState равен 2.

на responseType значение может быть изменено в любое время до readyState достигает 3. Когда readyState достигает 2, у вас есть доступ к заголовки ответа, чтобы принять решение.

обновлен пример кода:

function convertToAudio(file) {
    var form = new FormData();
    form.append("Video", file, file.name);

    var request = new XMLHttpRequest();
    request.onreadystatechange = function() {
        if(request.readyState == 4) {
            if(request.status == 200) {
                console.log(typeof request.response); // should be a blob
            } else if(request.responseText != "") {
                console.log(request.responseText);
            }
        } else if(request.readyState == 2) {
            if(request.status == 200) {
                request.responseType = "blob";
            } else {
                request.responseType = "text";
            }
        }
    };
    request.open("POST", "video_to_audio", true);
    request.send(form);
}