1

角度の普遍化を実装し、サーバーサイドのレンダリングでhtmlの静的な部分をレンダリングできました。私が直面している問題は、httpコールの完了を待たずにAPI呼び出しが行われ、サーバーがhtmlをレンダリングしていることです。したがって、私のテンプレートがapi呼び出しから得られたデータに依存する部分はサーバー上でレンダリングされません。レンダリング前にhttp呼び出しが完了するまでサーバーは待機しません - 角度4のサーバー側のレンダリング

さらに情報:

私は、ユーザーが認証され、応答にクッキーを設定している場合にのみ、インデックスHTMLを果たすノードサーバで認証を使用します。

私は角度からAPI呼び出しを行うたびに、依存サービスがトークンを使ってユーザーを検証するので、ヘッダーとしてもCookieを送信します。サーバー側のレンダリングでは、サーバーレベルでCookieが使用できないため、リクエストを挿入してAPI呼び出しのCookieを選択します。 API呼び出しは成功しますが、約束が解決されるまでサーバーはレンダリングを待っていません。ノー成功を収めて試してみました

ステップ:

示唆したように、私はそれ以上の情報が必要な場合は私に知らせてくださいこのコメントにhttps://github.com/angular/universal-starter/issues/181#issuecomment-250177280

を自分のゾーン・バージョンを変更しました。

httpコールが関係している角度のある汎用的な定型文を私に指示すると、助けになります。

+0

ニュースはありますか?大きな問題のように思える – Toolkit

答えて

1

最後に、解決策は、外部API非同期呼び出しをマクロタスクとしてスケジュールすることでした。このissueの説明が助けになりました。外部API非同期呼び出しのためのヘルパーラッパークラスのようなZoneMacroTaskWrapperを実装すると、レンダリングプロセスは外部の約束を待っていました。

現在、ZoneMacroTaskWrapperはパブリックAPIに公開されていません。しかし、ドキュメンテーションを提供するという約束があります。

0

私のニーズに合ったソリューションを作成しました。多分それは私たちの両方を助けているでしょう:

const obs = new Observable<Item<any>>(subscriber => { 
    this.thirdPartyService.getItem(itemId).then((item) => { 
    subscriber.next(item); 
    subscriber.complete(); 
    return item; 
    }); 
}); 
return obs.map(item => item.data); 
関連する問題