簡體   English   中英

以編程方式將 API 響應過濾為查詢參數

[英]Filtering API responses as query params programmatically

我試圖通過允許端點接收查詢參數來過濾來自節點應用程序中 api 的響應。

const server = http.createServer((req, res) => {

const serverLogs = logs.data;
const urlQueryParams = url.parse(req.url, true).query;

//Looping through all logs
for(var i in serverLogs){
  var spd = serverLogs[i];
  level = spd.level;
  serverID = spd.serverId; 

  //console.log(serverID, level);
}

  console.log(`Log Level Query Param: ${urlQueryParams.level}`);
  res.end(JSON.stringify(serverLogs));
});

以編程方式,我想讓級別可查詢,因此當我跳入 Postman 時,我可以按特定級別獲取所有數據。

郵遞員圖片

關於如何接近的任何想法?

幾點建議:

  1. 將日志獲取與日志過濾分離

一般來說,每個套路應該有一份工作,而且只有一份工作。 這被稱為 單一職責原則

它將幫助您正確完成每個部分,並且還將有助於編寫測試。

一個可能適合划定邊界的地方是編寫一個函數,該函數接受單個日志條目和過濾條件,並返回一個布爾值,指示該條目是否滿足條件。 您可以在這個基本構建塊上構建各種東西。

  1. 考慮使用 Streams 進行日志訪問

任何依賴於在過濾行之前將整個日志讀入 RAM 的模式都會產生糟糕的性能。 從您的片段中不清楚logs.data是什么,但我的猜測是它是FS.readFileSync或類似的結果。 這會將整個文件加載到 RAM 中,然后讓您對其進行操作,但擴展性會很差。

Cehiro 建議使用 DB 將通過將過濾推入 DB 引擎來解決這個問題,這減輕了您的節點處理工作,但它至少有兩個您可能不喜歡的后果:(1)它限制了您的匹配操作DB 支持,並且 (2) DB 是一個重量級的復雜層。

根據我的經驗,日志通常要么以純文本形式寫入磁盤,要么通過即發即棄消息(有時兩者兼而有之)傳輸到專用日志存儲。 我懷疑您將處理磁盤上的日志文件。

Node 對Streams有很好的支持,這會讓你高效地掃描日志數據,而不會犧牲編寫完全適合你需求的過濾邏輯的自由。

  1. 盡可能多地使用現成的組件

我實際上編寫了一個庫來了解簡單的查詢語法,這可能是一個不錯的起點。 我為類似的用例設計了它,因此它可能適合您的需求。 當然,如果你不喜歡我的,可能還有其他人滿意。

暫無
暫無

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

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