gpt4 book ai didi

javascript - 验证 Node.js 中 REST api 请求的查询参数

转载 作者:行者123 更新时间:2023-12-02 23:53:56 24 4
gpt4 key购买 nike

对于向 API 发出 GET 请求的每种对象类型,我都有一个包含有效查询参数的对象。

var queryFields = {
'organisation': ['limit', 'page', 'id', 'search'],
'actor': ['limit', 'page', 'id', 'search'],
'version': ['limit', 'page', 'search'],
'product': ['limit', 'page', 'search', 'id', 'type', 'brand', 'model', 'manufacturerSpid'],
'asset': ['limit', 'page', 'search', 'order', 'sort', 'id', 'name', 'currentCustodianSpid', 'currentLocationSpid', 'productSpid', 'search'],
'location': ['limit', 'page', 'search', 'id'],
'workorder': ['limit', 'page', 'search', 'id', 'type', 'status', 'requirementSpid', ],
'move': ['limit', 'page', 'search'],
'transfer': ['limit', 'page', 'search'],
'requirement': ['limit', 'page', 'search', 'id', 'type', 'source', 'productSpid', 'status', ],
'artefact': ['limit', 'page', 'search'],
'attestation': ['limit', 'page', 'search'],
};

我想使用此函数来确保请求只接受这些有效参数。现在,promise 使用有效、无效或 0 参数解析 false。这似乎是我过滤方式的问题。我传入对象类型和请求。如果请求有查询参数,我想从对象中获取有效参数,并检查 req 中的参数是否与对象中的参数均有效匹配。如果有任何无效,我想解决false。如果没有参数,我想解析true。如果只有有效参数,我想解析true。我可以对此函数进行一些调整以获得该结果吗?

function getQueryFields(object) {
if (utils.isDefined(queryFields[object])) return queryFields[object];
return [];
}

function fieldValidator (objType, req) {
return new Promise(function(resolve) {
if (utils.isDefined(req.query)) {
var fields = getQueryFields(objType);
//Only resolve true with valid fields
fields = fields.filter(function(field) { return Object.keys(req.query).indexOf(field) > -1;});
if (Object.keys(req.query) !== Object.keys(fields)) {
resolve(false);
} else {
resolve (true);
}
} else {
resolve(true);
}
});
}

最佳答案

您的函数存在一些问题。我想在解决实际问题之前解决第一个问题,因为这会大大增加清晰度。第一:你不需要 Promises,这是一个同步函数。

重写#1:

function getQueryFields(object) {
if (utils.isDefined(queryFields[object])) return queryFields[object];
return [];
}

function fieldValidator (objType, req) {
if (utils.isDefined(req.query)) {
var fields = getQueryFields(objType);
//Only resolve true with valid fields
fields = fields.filter(function(field) {
return Object.keys(req.query).indexOf(field) > -1;
});
if (Object.keys(req.query) !== Object.keys(fields)) {
return false;
} else {
return true;
}
}
} else {
return true;
}

该函数可以使用的另一件事是“提前”返回。这使得更容易跟踪正在发生的事情并减少分支数量:

重写#2:

function fieldValidator (objType, req) {
if (req.query === undefined) {
return true;
}

var fields = getQueryFields(objType);
//Only resolve true with valid fields
fields = fields.filter(function(field) {
return Object.keys(req.query).indexOf(field) > -1;
});
return (Object.keys(req.query) === Object.keys(fields));
}

这些都不能回答您的问题,但我需要它来更清楚地了解您在做什么 =)

问题实际上在于比较Object.keys()Object.keys() 返回一个迭代器,但它返回的每个迭代器都是唯一的。

Javascript 中的对象无法真正“按值”进行比较。按值比较对象的唯一方法是一一检查它们的键。

由于您希望属性完全匹配,我想我会将其更改为:

  1. 检查查询参数的数量是否相同。
  2. 检查传递的每个查询参数是否都出现在有效查询参数集中。

基于此,我认为这将是我的版本:

function fieldValidator(objType, req) {
if (!req.query || Object.keys(req.query).length === 0) {
// Covers the 'undefined' and 'empty object' case
return true;
}

const fields = getQueryFields(objType);
const keys = Object.keys(req.query);

// Do we have enough query parameters?
if (keys.length !== fields.length) return false;

// Does every query parameter appear in the list?
for(const key of keys) {
if (!fields.includes(key)) return false;
}
return true;
}

关于javascript - 验证 Node.js 中 REST api 请求的查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55498129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com