簡體   English   中英

使用堆棧 Angular/Express/MongoDB 拆分 HTTP 請求

[英]Split HTTP request with stack Angular/Express/MongoDB

我有數百個元素可以從 MongoDB 數據庫中獲取並在前端打印出來。 將所有內容提取到單個請求中可能會降低性能,因為它在主體響應中攜帶大量有效負載。 因此,我正在尋找一種解決方案,將我的 Angular 請求拆分為多個,並且約束要同時進行。

例子:

MONGODB 集合:元素(_id,名稱,孩子,...)文檔:10000+

但我們只需要~100-500 個元素

ANGULAR:

    const observables = [];
    const iteration = 5, idParent = 'eufe4839ffcdsj489483'; // example
    for (let i = 0; i < iteration; i++) {
      observables.push(
        this.myHttpService.customGetMethod<Element>(COLLECTION_NAME, endpoint, 'idParent=' + idParent + '&limit=??')); // url with query
    }

    forkJoin(observables).subscribe(
      data => {
           this.elements.push(data[0]);
           this.elements.push(data[1]);
      },
      err => console.error(err)
    );

我使用 forkJoin 是因為我需要同時請求以獲得更好的性能。 思路是通過不同的limit參數值向后端發送多個請求,最后將整組元素放入數據object中。 唯一的目的是拆分請求以避免由於有效負載主體的大小而可能出現錯誤的大延遲。

如何繼續使用給定的堆棧來執行此操作? 我想避免使用 websockets。

我認為fork.join當你想並行解決所有的 observable 時使用,但是你需要等待所有的請求,如果一個失敗怎么辦? forkJoin將在遇到第一個錯誤時立即完成,您有點不知道它來自哪個可觀察對象,但是如果您在內部可觀察對象中處理錯誤,則可以輕松實現。

const observables = [];
    const iteration = 5, idParent = 'eufe4839ffcdsj489483'; // example
    for (let i = 0; i < iteration; i++) {
      observables.push(
        this.myHttpService.customGetMethod<Element>(COLLECTION_NAME, endpoint, 'idParent=' + idParent + '&limit=??')).pipe(catchError(() => {
       throw `an Error request #: ${i}`;
     }); // url with query
    }

    forkJoin(observables).subscribe(
      data => {
           this.elements.push(data[0]);
           this.elements.push(data[1]);
      },
      err => console.error(err)
    );

如果要將數據顯示為列表,另一種方法可能是引入無限滾動ngx-無限滾動

如果符合您的要求,您還可以在前端添加分頁。 有一個庫可以幫助您: Syncfusion grids 也可以有其他方法來提高后端的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM