Как получить сообщение об ошибке из буфера массива - PullRequest
0 голосов
/ 16 июня 2020

У меня есть следующий запрос на загрузку файла (используя vue-resource):

this.$http.get(fileUrl, { responseType: 'arraybuffer' }).
    then(
        (response) => {
            let blob = new Blob([response.data], { type: response.headers.get('content-type') });
            let link = document.createElement('a');
            link.setAttribute("type", "hidden");
            link.href = window.URL.createObjectURL(blob);
            let disposition = response.headers.get('content-disposition');
            let matches = /.*filename=(.*);.*/.exec(disposition);
            let filename = (matches != null && matches[1])
                ? matches[1]
                : 'file';
            if (filename.startsWith('"')
                && filename.endsWith('"')) {
                filename = filename.substr(1, filename.length - 2);
            }
            link.download = filename;
            document.body.appendChild(link);
            link.click();
            link.remove();
        },
        (errorResponse) => {
            // TODO: errorResponse doesn't actually have the error message somehow
            console.error(errorResponse);
        });

В моем бэк-энде (C# asp. net core) я бросаю выполнение вот так:

throw new DomainException("ErrorMessage");

Я вижу в запросе в devtools, что сообщение "ErrorMessage" определенно отправляется обратно. Это единственное, что видно как на вкладке ответа, так и на вкладке предварительного просмотра в chrome.

Однако я не могу нигде найти это сообщение, чтобы показать пользователю.

Обычно я бы получил это из errorResponse.bodyText, но это undefined в данном случае


Я перепробовал все, начиная с вызова errorResponse.body, errorResponse.bodyText (все дает undefined) и даже пробовал читать с

var decodedString = String.fromCharCode.apply(null, errorResponse.body);
var obj = JSON.parse(decodedString);
var message = obj['message'];

, который просто вызывает больше ошибок:

myMixin.ts: 257 Uncaught (в обещании) SyntaxError: Неожиданный конец JSON ввода в JSON .parse () в VueComponent. (myMixin.ts: 257)

Повторная попытка описанного выше, но передача new Uint8Array(errorResponse.body) дает мне

myMixin.ts: 257 Uncaught (в обещании) SyntaxError: Unexpected токен N в JSON в позиции 0 в JSON .parse () в VueComponent. (myMixin.ts: 257)


Удаление , { responseType: 'arraybuffer' }, я вижу, что сообщение об ошибке существует в errorResponse.bodyText.

Почему это происходит? Как я могу просто получить сообщение об ошибке - которое явно существует, поскольку я вижу его на вкладке сети - и просто зарегистрировать его на консоли?

1 Ответ

0 голосов
/ 16 июня 2020

Я наконец нашел решение, которое мне было нужно здесь :

let message = String.fromCharCode.apply(null, new Uint8Array(errorResponse.body));

Однако, поскольку я использую TypeScript, я получал какое-то раздражающее сообщение о том, что errorResponse.body не назначается набрать number[], поэтому я делаю это так:

let message = String.fromCharCode.apply(null, new Uint8Array(errorResponse.body) as any);

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

...