如何从数组缓冲区中获取错误消息
How to get error message from array buffer
我有以下下载文件的请求(使用 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 核心)我正在抛出这样的执行:
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 (in promise) SyntaxError: Unexpected end of JSON input
at JSON.parse ()
at VueComponent. (myMixin.ts:257)
再次尝试上述但传入 new Uint8Array(errorResponse.body)
给了我
myMixin.ts:257 Uncaught (in promise) SyntaxError: Unexpected token N in JSON at position 0
at JSON.parse ()
at VueComponent. (myMixin.ts:257)
删除 , { responseType: 'arraybuffer' }
,我可以看到 errorResponse.bodyText
中存在错误消息。
为什么会这样?我怎样才能得到错误消息——它显然确实存在,正如我在网络选项卡中看到的那样——并将其记录在控制台上?
我终于找到了我需要的解决方案here:
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
。有关详细信息,请参阅 this helpful answer。
我有以下下载文件的请求(使用 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 核心)我正在抛出这样的执行:
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 (in promise) SyntaxError: Unexpected end of JSON input at JSON.parse () at VueComponent. (myMixin.ts:257)
再次尝试上述但传入 new Uint8Array(errorResponse.body)
给了我
myMixin.ts:257 Uncaught (in promise) SyntaxError: Unexpected token N in JSON at position 0 at JSON.parse () at VueComponent. (myMixin.ts:257)
删除 , { responseType: 'arraybuffer' }
,我可以看到 errorResponse.bodyText
中存在错误消息。
为什么会这样?我怎样才能得到错误消息——它显然确实存在,正如我在网络选项卡中看到的那样——并将其记录在控制台上?
我终于找到了我需要的解决方案here:
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
。有关详细信息,请参阅 this helpful answer。