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は、「http:// ...」ではなく「https:// ...」URLです。
問題はAngular UniversalがExpressを使用しており、セキュリティがサーバーへのSSL証明書を検証することです。自己署名SSL証明書を使用しました。
解決策は、NODE_TLS_REJECT_UNAUTHORIZED=0
を環境に追加して、Node.jsでSSL検証を無効にすることです。 only開発時にこれを設定する必要があります。本番環境では非常に危険です。
@ StephanRauh に同意し、彼にいくつかのポイントを追加したい。これは、リクエストが送信されないか、何らかの理由でサーバーと通信できない場合に発生します。
理由は次のとおりです。
バックエンドとフロントエンド間で同じドメイン、同じプロトコル、同じポートにいない。
他の誰かがこれにつまずいた場合に備えて、これらの解決策はどれも私にとってはうまくいきませんでした。私のために働いたのは、uBlock Originをオフにすることでした。明らかな理由で、「ad」という単語が含まれるURLをブロックしていました。
引用 Googleグループのサンダーエリアス :
「エラー0は、リクエストが送信されないときに表示されるものです。これの最も一般的な原因は、CORSがサーバー上で正しく構成されていないことです。言い換えると、98%の場合、これはサーバー側の問題です」
私はまったく同じ問題を抱えていました。 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));
TL; DR:/etc/hosts
ドメイン名のエントリがありません。
Angular Universalでは、SSR部分がサーバー側のレンダリングがサーバーで発生するという事実(;))のためにエラーをスローするという問題がありました。
私のウェブサイトが https://myproject.com/ で利用可能であり、すべて正常に動作しているとします。 URLに直接アクセスすると、SSRが起動します。これで、SSRがAPI呼び出しを行う必要がある場合、ローカルネットワークで https://myproject.com/api/blah/show にHTTPリクエストを行うことになります。そして、これはエラーを投げていた場所です。
デバッグするために、curl https://myproject.com/api/blah/show
(VPS上)を実行しようとすると、エラーが発生します。
これを修正するには、/etc/hosts
ファイルに次の行を追加する必要がありました。
127.0.0.1 myproject.com
その後、curl
コマンドとSSRの両方が機能しました!
スタック:
IPhone/iPadデバイスからangularアプリをテストするときにこの問題に遭遇しました。アプリはデスクトップから正常に機能していました。ノードサーバーで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にアクセスできます。