我正在开发Angular 5应用程序。我必须从我的后端应用程序下载一个文件,为此,我只需调用如下函数:
public executeDownload(id: string): Observable<Blob> {
return this.http.get(this.replaceUrl('app/download', denunciaId), {responseType: 'blob'}).map(result => {
return result;
});
}
字符串
要调用我刚才调用的下载服务,请执行以下操作:
public onDownload() {
this.downloadService.executeDownload(this.id).subscribe(res => {
saveAs(res, 'file.pdf');
}, (error) => {
console.log('TODO', error);
// error.error is a Blob but i need to manage it as RemoteError[]
});
}
型
当后端应用程序处于特定状态时,它不会返回Blob,而是返回一个HttpErrorResponse
,在其error
字段中包含RemoteError数组。RemoteError是我编写的一个接口,用于管理远程错误。
在catch函数中,error.error是一个Blob。如何将Blob属性转换为RemoteError[]
数组?
先谢了。
6条答案
按热度按时间6rqinv9w1#
这是一个已知的Angular issue,在该线程中,JaapMosselman提供了一个非常好的解决方案,包括创建一个
HttpInterceptor
,它将Blob转换回JSON。使用这种方法,您不必在整个应用程序中进行转换,并且当问题得到解决时,您可以简单地删除它。
字符串
在AppModule或CoreModule中声明它:
型
cfh9epnr2#
使用
FileReader
的建议对我来说是不够的,因为它们不适用于HttpTestingController
(因为blob到json的转换是异步的)。在我的情况下,业力测试总是在那个承诺被解决之前完成。这意味着我不能用这种方法来写业力测试来测试不快乐的道路。我将建议一个同步地将blob转换为json的解决方案。服务类别:
字符串
Angular 测试:
型
error子句中解析的
errorJson
现在将包含{error-msg: 'get call failed'}
。7uzetpgm3#
可能像大多数人一样,我希望我的错误消息是同步的。我把它放在一个警告框中来处理这个问题:
字符串
bihw5rsg4#
正如docs中的“从Blob中读取内容的唯一方法是使用FileReader。”https://developer.mozilla.org/en-US/docs/Web/API/Blob。
编辑:如果你需要blob的一部分,你可以做一个切片,它返回新的Blob,然后使用文件读取器。
uz75evzq5#
这个问题可以通过在标头中添加'Content-Type':'application/json'来解决。
9ceoxa926#
响应应该是一个Blob,但显然不是这样。要避免此错误,请将responseType从blob更改为arraybuffer。
字符串