以编程方式将API响应过滤为查询参数

问题描述

我试图通过允许端点接受查询参数来过滤节点应用程序中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时,我可以按特定级别捕获所有数据。

Postman Img

关于如何处理的任何想法?

解决方法

一些建议:

  1. 将日志采集与日志过滤分开

通常来说,每个例程应该只有一个工作,而只有一个工作。这就是所谓的the Single Responsibility Principle

这将帮助您正确设置各个部分,并有助于编写测试。

绘制边界的一个好地方是编写一个函数,该函数接受单个日志条目和过滤条件,并返回一个布尔值,指示该条目是否满足条件。您可以在此基本构建块之上构建各种东西。

  1. 考虑使用Streams进行日志访问

任何依赖于在过滤行之前将整个日志读入RAM的模式都会导致性能下降。从您的摘要中尚不清楚logs.data是什么,但是我猜测是FS.readFileSync或类似结果。这样会将整个文件加载到RAM中,然后 then 可以对其进行操作,并且扩展性很差。

Cehhiro建议使用DB来解决此问题,方法是将过滤推送到DB引擎中,这减轻了您的节点处理工作的负担,但是它至少会带来两个您可能不喜欢的结果:(1)它限制了您只能使用数据库支持的匹配操作,以及(2)数据库是复杂性的重量级。

以我的经验,日志通常要么以纯文本形式写入磁盘,要么通过“一劳永逸”消息(或有时两者)传输到专用日志存储。我怀疑您将要处理磁盘上的日志文件。

Node对Streams有很好的支持,它将使您有效地扫描日志数据,而不会牺牲编写完全适合您的需求的过滤逻辑的自由。

  1. 使用尽可能多的现成组件

我实际上写了library for grokking a simple query syntax,这也许是一个不错的起点。我为类似的用例设计了它,因此它可能满足您的需求。当然,如果您不喜欢我的,那么也许会有其他人满意。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...