Angular 4:“(未知URL)的Http失败响应:0未知错误”

19

我正在尝试调用一个API URL。我使用以下代码调用API。

import {HttpClient, HttpClientModule, HttpParams} from "@angular/common/http";

@Injectable()
export class PropertyPrefService {

    constructor(private http: HttpClient,
                private configurationService:Configuration) {}

    public searchProjects(propFilter:string):any{
        let temp:any;
        const options = propFilter ?
        {
            params: new HttpParams().set('query', propFilter)
        } : {};

        return this.http.get<any>(this.configurationService.propertySystemApiUrl, options)
                    .subscribe((results:any) => {
                        console.log(results);
                    });
    }

在Angular代码中,我没有得到任何响应,而且出现了错误:

(未知URL)的Http失败响应: 0 未知错误。

然而,当我发出请求时,在Chrome上打开开发者工具,我可以看到从服务器接收到响应。

该URL是"https://..."而不是"http://..."。


只需尝试使用return this.http.get(this.configurationService.propertySystemApiUrl,options) .subscribe((results:any) => {
console.log(results);
});即可。我相信api网址是正确的。
- Rohan Kangale
乍一看似乎没问题。你确定 this.configurationService.propertySystemApiUrl 真的是你的 URL 吗?在 http 请求之前尝试使用控制台日志。你在哪里调用这个方法?我认为你可能需要在 subscribe 内部添加一个返回语句。return results(在 console.log(results) 之后)。 - John
你能分享一下 "configurationService" 的代码吗? - axl-code
是的,链接是正确的。我收到了响应,但我在Chrome开发者工具中看不到它。通过这个Angular代码,它会出现错误。 - user8300647
状态码 200 - user8300647
显示剩余3条评论
10个回答

9

问题在于Angular Universal使用了Express,而安全验证SSL证书到服务器上;我使用的是自签名的SSL证书。

解决方法是将 NODE_TLS_REJECT_UNAUTHORIZED=0 添加到您的环境中,以在Node.js中禁用SSL验证。您应该在开发环境中设置此项;在生产环境中这非常危险。


你能否在“安全验证SSL证书”附近看一下,并在需要时进行修复(通过编辑您的答案)?例如,“安全性”是什么意思(它在您的答案的原始版本中)-再次通过编辑您的答案进行回应。 - Peter Mortensen
这个答案的问题在于,当没有Angular Universal存在时,OP描述的错误也会出现。 - André Werlang

3

引用Sander Elias在Google Groups上的话:

"当请求没有发送出去时,您会收到错误0。最常见的原因是服务器上CORS配置不正确。让我重新表述一下:在98%的情况下,这是服务器端问题。"


2

万一其他人也遇到了同样的问题,这些解决方案都对我无效。对我有用的是关闭uBlock Origin。由于明显的原因,它会阻止任何包含单词“ad”的url。


2

您的后端和前端不在同一域、协议和端口。


根据 Angular 的漏洞跟踪器(https://github.com/angular/angular/issues/22022#issuecomment-363602769),状态码 0 表示一个 CORS 问题。因此,这个答案不应该被投票降级。 - Stephan Rauh
这个不可理解。你能否通过编辑你的回答来修复它? - Peter Mortensen
@StephanRauh 这个回答声称在不同的协议、域名或端口上向服务器发出请求将会失败,并返回状态码0。这种说法是不准确的。a) 当正确配置时,这并不一定是真的;b) 它也可能在相同的协议/域名/端口上失败(这似乎不是这里的情况)。此外,该回答试图解释但表现较差。 - André Werlang
@AndréWerlang 你说服了我! - Stephan Rauh

1
同意@StephanRauh的观点,并想补充一些内容。当请求未能发出或由于某种原因无法与服务器通信时,就会发生这种情况。
可能的原因包括:
  1. 互联网连接速度非常慢,无法连接到服务器,或者根本没有可用的连接。
  2. 服务器本身已经停止运行,即没有处理我们的请求的程序。

0

我曾经遇到过完全相同的问题。我能够在Chrome开发者工具中看到结果,但总是收到“Http failure response for (unknown url): 0 Unknown Error”错误消息。

在我的情况下,原因是我使用了“responseType:'text'”来查询有效载荷“text/html”。但由于某种原因,这不兼容。我不得不切换到“responseType:'blob'”,并使用“FileReader”将blob转换为字符串。

所以我猜当返回的内容与您配置的“responseType”不匹配时,您也会遇到同样的问题。顺便说一句,默认情况下它是“json”。

   this.httpClient.get(url, {responseType: 'blob'})
        .subscribe(data => {
          const reader = new FileReader();
          reader.onloadend = (e) => {
            const readerResult = reader.result;
            console.log(readerResult); // Print blob content as text
          };
          reader.readAsText(data, 'UTF-8');

        }, error => console.log(error));

0

当我在 iPhone/iPad 设备上测试 Angular 应用程序时,遇到了这个问题。从桌面电脑运行良好。虽然在 node 服务器上启用了 cors,但仍然出现错误。因此,我采取以下步骤来解决它。

使用 IP 运行 ng serve:ng serve --host 192.168.1.10

使用 IP 指向 API: 在 environment.ts 中,我将 URL 更改为以下内容:

apiUri: 'http://192.168.1.10:9000/api'

现在我可以从移动设备访问URL了。


0
我在尝试在我的Angular项目中使用Azure搜索服务时遇到了这个问题。当我启用接受所有来源请求的CORS后,我开始收到响应。
请检查您Chrome浏览器中的开发者工具(控制台),它可能会为您提供有关请求的一些见解。

0

我从Node 8切换到Node 12,这个问题神奇地消失了。


0

简而言之:/etc/hosts 文件缺少域名条目。

在 Angular Universal 中,我遇到了一个问题,即 SSR 部分由于服务器端渲染发生在服务器上(;)),导致出现错误。

假设我的网站可在 https://myproject.com/ 上访问并正常运行。当您直接访问任何 URL 时,SSR 就会启动。现在,如果 SSR 必须进行 API 调用,则会在本地网络中向 https://myproject.com/api/blah/show 发送 HTTP 请求。这就是它出错的地方。

为了调试,我尝试在 VPS 上运行 curl https://myproject.com/api/blah/show,但是我收到了一个错误。

为了解决这个问题,我不得不在我的 /etc/hosts 文件中添加以下行:

127.0.0.1 myproject.com

之后,curl命令和SSR都能正常工作!

使用的技术栈:

  • Ubuntu 16 & 18
  • Nginx
  • Let's Encrypt SSL
  • Angular Universal
  • Express

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接