使用 Angular HTTP_INTERCEPTOR 攔截器來記錄超時請求的一些思考

本文記錄我從我的同事,Spartacus SSR 專家 kris 那裏學到的一些心得。

我們可以使用 Angular HTTP_INTERCEPTOR 攔截器來記錄超時請求。

但是我們使用時需要小心,只將它用於調試目的,以找到出現 SSR hangs 的 root cause。 太過激進的日誌記錄策略(尤其是在通過 console.log/error 與輸出流同步完成時)可能會降低 Node Express 應用程序的性能。

如果我們還想通過使用 rxjs 運算符 timeout() 終止攔截器中長期未決的 API 調用,那麼 rxjs 流將發出錯誤。

此外,我們希望避免在 SSR 響應中返回格式錯誤的 HTML。 可能有多種方法可以將渲染標記爲格式錯誤。

無論標記技術如何,在 SSR 層(ExpressJS 應用程序)我們需要識別格式錯誤渲染的標記,然後發送 CSR index.html(所謂的 CSR fallback,帶有無緩存的 http 標頭)而不是發送 呈現的 HTML。

以下是一些將渲染標記爲格式錯誤的可能方法:

(1) 調用一些 Angular API 終止應用程序的掛起渲染並返回一個可以被平臺服務器和 ngExpressEngine 捕獲的錯誤——如果只存在這樣一個 Angular API. 理想情況下,這樣的 Angular API 還應該安全地拆除掛起的渲染(銷燬組件、服務和模塊,這將允許釋放資源)。

(2) 讓渲染完成,但 Angular 應用程序以某種方式將渲染“標記”爲格式錯誤,因此我們稍後可以在 SSR(Express js 應用程序)層中決定忽略此 html 並回退到 CSR。

目前尚未確認有任何行業標準方法可以將渲染結果標記爲格式錯誤,因此中間件可能會忽略它。

可以想象 Angular 應用程序可以通過兩種方式在 SSR 層中留下標記以供之後識別:

  • 添加一些特殊的標記 html 元素,例如頁面 <head> 中的 <meta> 標記。 然後要在 SSR 層中識別它,我們需要在原始呈現的 html 字符串上運行正則表達式。 或者

  • 在 RESPONSE 對象中設置一些特殊的標記屬性(可以在 Angular APP 中注入,最好使用裝飾器 @Optional() 來避免 CSR 中的錯誤。可以從 @nguniversal/express-engine/tokens' 導入 RESPONSE。

然後,獨立地可能有 2 個潛在的地方我們可以攔截渲染結果,識別標記並在響應中發送 CSR 回退:

  • 在 OptimizedSsrEngine 內部,在我們獲得原始 html 之後,但在將其傳遞給響應回調 (callback(err, html)) 之前。 或者
  • 編寫自定義的、獨立的 Express.js 中間件並通過 app.use(myMiddleware) 將其插入 server.ts
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章