【问题标题】:Regular expression to get variables in Graphql query在 Graphql 查询中获取变量的正则表达式
【发布时间】:2022-02-15 17:40:38
【问题描述】:

我有一个 graphql 查询,我想获取变量名称和类型。我正在使用 Apollo Client 来处理我的查询,但我相信没有提供任何东西来获取变量名称。是否有提供该信息的 API 或库?

查询示例:

query Integrations($count: Int, $isAdmin: Boolean, $services: String) {
  repository(uri: "$count: Int, $isAdmin: Boolean, $services: String") {
    integrations(
      filter: { limit: $count, ignoreCase: $isAdmin, id: $services }
    ) {
      id
    }
  }
}

我想收到这样的对象:

{
  "count": "Int",
  "isAdmin": "Boolean",
  "services": "String"
}

请注意,这种情况可以通过正则表达式来处理,例如:

[^"$\s]*\$([a-zA-Z0-9]*):\s*(String|Int|Float|Boolean)[^"$\s]*

不幸的是,还要匹配字符串中的变量(第 2 行)

有什么想法吗?

【问题讨论】:

  • 如果你匹配引号之间的字符串作为替代呢?见(?<!\\)(?:\\{2})*"[^"\\]*(?:\\.[^"\\]*)*"|\$([^\W_]*):\s*(String|Int|Float|Boolean)demo。只取第一组不为空的匹配项。
  • 感谢您的回答@WiktorStribiżew。效果很好:)。您能否回答问题,以便我标记为已回答?
  • 您是否使用gql`…` 文字进行查询?
  • 在这种情况下,使用正则表达式非常麻烦,并且无法很好地扩展。对于快速的一次性更改是可以的,但否则我宁愿为此使用像 graphql-parser 这样的专用库。
  • @Bergi,是的,我愿意。

标签: javascript regex graphql apollo-client


【解决方案1】:

是否有提供该信息的 API 或库?

是的。 Apollo 客户端使用graphql-tag,它使用官方graphql-js parser 生成查询的AST。

您应该使用相同的 API 找到变量名称和类型:

import { parse, print, getOperationAST } from 'graphql';

const document = parse('…');
// const query = document.definitions.find(def => def.operation == "query" && def.name.value == 'Integrations');
const query = getOperationAST(document, 'Integrations');
for (const varDef of query.variableDefinitions) {
    console.log(`Variable '${varDef.name.value}' has type ${print(varDef.type)}.`);
}

不要使用临时正则表达式。

【讨论】:

  • 感谢您的回答,但是如果您不知道查询的名称怎么办。在这种情况下是“集成”,但也可以是其他任何东西。
  • @GabrielMuñumel 如果文档中有多个查询,您需要某种方法来找到您正在使用的查询的定义。您也可以使用getOperationAST,其中操作名称是可选的
  • 会试一试。谢谢。
猜你喜欢
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多