Bas*_*sie 0 extract-error-message arraybuffer typescript vue.js vue-resource
我有以下下载文件的请求(使用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);
});
Run Code Online (Sandbox Code Playgroud)
在我的后端(C# asp.net core)中,我抛出这样的异常:
throw new DomainException("ErrorMessage");
Run Code Online (Sandbox Code Playgroud)
我可以在 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'];
Run Code Online (Sandbox Code Playgroud)
这只会引发更多错误:
myMixin.ts:257 未捕获(承诺中)语法错误:VueComponent 的 JSON.parse () 处的 JSON 输入意外结束。(myMixin.ts:257)
再次尝试上述操作,但传入new Uint8Array(errorResponse.body)给了我
myMixin.ts:257 未捕获(承诺中)语法错误:VueComponent 的 JSON.parse () 的位置 0 处的 JSON 中出现意外的标记 N。(myMixin.ts:257)
删除后, { responseType: 'arraybuffer' },我可以看到错误消息存在于errorResponse.bodyText.
为什么会发生这种情况?我怎样才能得到错误消息 - 正如我在网络选项卡中看到的那样,该错误消息显然存在 - 并将其记录在控制台上?
我终于在这里找到了我需要的解决方案:
let message = String.fromCharCode.apply(
null,
new Uint8Array(errorResponse.body));
Run Code Online (Sandbox Code Playgroud)
但是,因为我使用的是 TypeScript,所以我收到了一些关于errorResponse.body无法分配给 type 的烦人消息number[],所以我这样做:
let message = String.fromCharCode.apply(
null,
new Uint8Array(errorResponse.body) as any);
Run Code Online (Sandbox Code Playgroud)
另请注意,由于我的响应正文包含奇数个字符,Uint8Array因此我必须使用Uint16Array. 有关详细信息,请参阅这个有用的答案。
| 归档时间: |
|
| 查看次数: |
3484 次 |
| 最近记录: |