查询字符串- parser
为什么是查询- parser?
审议下列情况:
- 你正在制作一个标准的 CRUD 应用程序, 更多或更少跟随 JSON:API规格
- 此应用程序将接收 HTTP 以查询字符串获取请求, 如以下示例中 :
?filter[start_date][$gt]=2020-01-01?sort=-date,name&page[number]=1&page[size]=5?fields[articles]=title,body&fields[people]=name
- 您需要解析这些查询参数以获取请求的数据 。 此库为您进行查询字符串分析 .
安装
npm install @bitovi/querystring-parser
如果你打算用这个图书馆 反对 或者说 排序,不安装 @bitovi/querystring-parser。反之,安装:
使用量
const querystringParser = require("@bitovi/querystring-parser");
const { page } = querystringParser.parse("page[number]=1&page[size]=10");
console.log(page.number); // --> 1
console.log(page.size); // --> 10
排序参数
分析结果 sort 查询参数存储于 sort 属性.
其价值 sort 属性是一组“类型字段”对象。 每个"类型字段"对象都包含一个字段名称和排序方向.
参考: JSON:API - 排序
const { sort } = querystringParser.parse("sort=-date,name");
console.log(sort[0]); // --> { field: 'date', direction: 'DESC' }
console.log(sort[1]); // --> { field: 'name', direction: 'ASC' }
倾角参数
分析结果 page 查询参数存储于 page 属性。 其价值 page 属性是一个有 2 个密钥的对象 : number 财务报告和审定财务报表 size。 。 。 .
参考: JSON:API - 铺设
const { page } = querystringParser.parse("page[number]=1&page[size]=10");
console.log(page.number); // --> 1
console.log(page.size); // --> 10
包含参数
分析结果 include 查询参数存储于 include 属性。 其价值 include 属性是一组“关系路径”.
const { include } = querystringParser.parse("include=children.movies.actors.children,children.movies.actors.pets,children.pets,pets");
console.log(include[0]); // --> 'children.movies.actors.children'
console.log(include[1]); // --> 'children.movies.actors.pets'
console.log(include[2]); // --> 'children.pets'
console.log(include[3]); // --> 'pets'
字段参数
分析结果 fields[TYPE] 查询参数存储于 fields 属性。 其价值 fields 属性是一个对象。 对于该对象中的每个密钥值对,密钥是类型的名称,而该值是该类型的一个字段数组.
const { fields } = querystringParser.parse("fields[articles]=title,body&fields[people]=name");
console.log(fields.articles); // --> [ 'title', 'body' ]
console.log(fields.people); // --> [ 'name' ]
过滤参数
分析结果 filter 查询参数存储于 filter 属性。 有2个"风格"的查询字符串过滤器被支持. "MongoDB-Style"和"IBM-Style". 虽然它们有自己的惯例,但它们都产生同样的产出。 如果需要,可以使用这两种样式,但不能在同一个查询字符串中.
MongoDB- Style 过滤参数
蒙戈DB-Style的基地来自 MongoDB 比较查询操作员。 。 。 .
快速示例
| 查询过滤器 | 解析输出 |
|---|---|
| 过滤器[名]=brad | { LIKE: [ '#name', '%brad%' ] } |
| 过滤器[名称][$eq]=mike | { '=': [ '#name', 'mike' ] } |
| 过滤器[年龄][$gt]=21 | { '>': [ '#age', 21 ] } |
| 过滤器 [生 [$lte] = 2020-01-01 | { '<=': [ '#born', '2020-01-01' ] } |
| 过滤器[分 [$eq] | { 'IS NULL': '#score' } |
| 过滤器 [名称][美元] = michael, brad | { IN: [ '#name', 'michael', 'brad' ] } |
MongoDB - 样式运算符
以下是MongoDB-Style运算符及其相容值类型的完整列表.
| 运算符 | 字符串 | 数字 | 日期 | 无效 | 数组 |
|---|---|---|---|---|---|
| (单位:美元) | ✅ | ✅ | ✅ | ✅ | ❌ |
| (单位:美元) | ✅ | ✅ | ✅ | ✅ | ❌ |
| 单位 $gt | ✅ | ✅ | ✅ | ❌ | ❌ |
| $gte (单位:千美元) | ✅ | ✅ | ✅ | ❌ | ❌ |
| (单位:美元) | ✅ | ✅ | ✅ | ❌ | ❌ |
| (单位) | ✅ | ✅ | ✅ | ❌ | ❌ |
| 喜欢 | ✅ | ❌ | ❌ | ❌ | ❌ |
| (单位:美元) | ✅ | ✅ | ✅ | ✅ | ✅ |
| (单位:百万美元) | ✅ | ✅ | ✅ | ✅ | ✅ |
关闭运算符
MongoDB-Style过滤器不需要明确的运算符. 在许多情况下,数值类型足以让解析器推断出哪一个操作员可以使用. 下面的例子显示了每个值类型的操作员推论.
| 数值类型 | 示例 | 产出 |
|---|---|---|
| 字符串 | 过滤器[名]=lisa | { LIKE: [ '#name', '%lisa%' ] } |
| 编号 | 过滤器[年龄]=25 | { '=': [ '#age', 25 ] } |
| 日期 | 过滤器[生]=2020-01-01 | { '=': [ '#born', '2020-01-01' ] } |
| 无效 | 过滤器[分数]%%%%% | { 'IS NULL': '#score' } |
| 数组 | 过滤器[名]=mike, brad | { IN: [ '#name', 'mike', 'brad' ] } |
阵列
以下示例说明可如何指定数组值.
- 使用重复查询参数 :
filter[age][$in]=24&filter[age][$in]=25&filter[age][$in]=26
- 使用逗号( U)
,:filter[age][$in]=24,25,26
两种样式将产生相同的输出:
{ IN: [ '#age', 24, 25, 26 ] }
化合物过滤器
MongoDB-Style过滤器不直接支持高阶操作员(AND 编号 : OR 编号 : NOT) (中文(简体) ). 然而,如果在查询字符串中存在多个过滤器,则它们将被合并在一起 AND 时尚.
// example of 2 filters getting "AND"-ed together into a compound filter
const { filter } = querystringParser.parse("filter[name]=mike&filter[age]=25");
expect(filter).toEqual({
AND: [
{ LIKE: ["#name", "%mike%"] },
{ "=": ["#age", 25] }
]
});
IBM- Style 过滤参数
IBM-Style基于 jsonapi.net 过滤规格。 。 。 .
快速示例
| 查询过滤器 | 解析输出 |
|---|---|
| 过滤器=容器( 名称, “ brad ”) | { LIKE: [ '#name', '%brad%' ] } |
| filter=等分 (名称, “mike ”) | { '=': [ '#name', 'mike' ] } |
| 过滤器=大Than(年龄,'25') | { '>': [ '#age', 25 ] } |
| filter= less OrEqual(生,'2020-01-01') (中文(简体) ) | { '<=': [ '#born', '2020-01-01' ] } |
| filter= any (名称, “ brad” , “mike” ) | { IN: [ '#name', 'brad', 'mike' ] } |
| 过滤器=等分( 分数, null) | { 'IS NULL': '#score' } |
| filter=not(等值(年龄,'25')) | { NOT: { "=": ["#age", 25] } } |
| filter=和(任何(年龄,'10','20'),等值(名称,'mike')) | { AND: [{ IN: ["#age", 10, 20] }, { "=": ["#name", "mike"] }] } |
| filter=或(任何(年龄,'10','20'),等分(名称,'mike')) | { OR: [{ IN: ["#age", 10, 20] }, { "=": ["#name", "mike"] }] } |
IBM- Style 操作器
以下是IBM-Style操作器及其相容值类型的完整列表.
| 运算符 | 字符串 | 数字 | 日期 | 属性参考文件 | 无效 | 嵌入式运算符 |
|---|---|---|---|---|---|---|
| 等于 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| 大调 | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| 大正数 | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| 小谭 | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| 小于正数 | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| 包含 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 启动时间 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 结束 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 任意 | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| 没有 | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| 财务报告和审定财务报表 | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| 或者说 | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
属性参考
一些IBM-Style操作器可以直接比较出两个不同的属性(或"列").
以下文为例, wins 财务报告和审定财务报表 losses 是属性引用(相对于常数,例如 'emily' 或者说 '22') (中文(简体) ).
通过常规,属性引用在解析输出中被前缀为"#",以区别于常数.
// example attribute references
const { filter } = querystringParser.parse("filter=greaterThan(wins,losses)");
expect(filter).toEqual({ ">": ["#wins", "#losses"] });
化合物过滤器
IBM-Style过滤器直接支持更高级的操作员(AND 编号 : OR 编号 : NOT) (中文(简体) ). 此外,如果查询字符串中存在多个过滤器,它们将合并在一起 OR 时尚.
// example of 2 filters getting "OR"-ed together into a compound filter
const { filter } = querystringParser.parse("filter=contains(name,'mike')&filter=equals(age,'25')");
expect(filter).toEqual({
OR: [
{ LIKE: ["#name", "%mike%"] },
{ "=": ["#age", 25] }
]
});
发展/贡献
见 捐款额