如何将 GraphQL 请求字符串解析为对象

新手上路,请多包涵

我正在为 GraphQL 运行 Apollo lambda 服务器。我想从 POST 请求正文中拦截 GraphQL 查询/变更并对其进行解析,以便我可以找出请求所要求的查询/变更。环境是 Node.js。

请求不是 JSON,它是 GraphQL 查询语言。我环顾四周,试图找到一种方法将其解析为一个我可以导航的对象,但我画的是一片空白。

Apollo 服务器必须以某种方式解析它以定向请求。有谁知道可以执行此操作的库或有关如何解析请求的指示?请求主体的示例以及我想要在下面检索的内容。

 {"query":"{\n  qQueryEndpoint {\n    id\n  }\n}","variables":null,"operationName":null}

我想确定这是一个查询,要求查询 qQueryEndpoint

 {"query":"mutation {\\n  saveSomething {\\n    id\\n  }\\n}","variables":null}

我想确定这是一个突变,并且正在使用 saveSomething 突变。

我的第一个想法是去除换行符并尝试使用正则表达式来解析请求,但感觉这是一个非常脆弱的解决方案。

原文由 Nick Ramsbottom 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 392
2 个回答

您可以使用 graphql-tag

 const gql = require('graphql-tag');

const query = `
  {
    qQueryEndpoint {
      id
    }
  }
`;

const obj = gql`
  ${query}
`;

console.log('operation', obj.definitions[0].operation);
console.log('name', obj.definitions[0].selectionSet.selections[0].name.value);

打印出来:

 operation query
name qQueryEndpoint

随着你的突变:

 operation mutation
name saveSomething

原文由 Gabriel Bleu 发布,翻译遵循 CC BY-SA 3.0 许可协议

graphql-tag 建立在核心 graphql 库(并因此安装它) - 如果你只是想获得操作的类型和它的名称你可以这样做,通过使用 graphql 直接分析解析的 GraphQL 操作的完整 AST:

 const { parse } = require('graphql');

const query = `
{
  qQueryEndpoint {
    id
  }
}
`;

const mutation = `
mutation {
  saveSomething {
    id
  }
}
`;
const firstOperationDefinition = (ast) => ast.definitions[0];
const firstFieldValueNameFromOperation = (operationDefinition) =>  operationDefinition.selectionSet.selections[0].name.value;

const parsedQuery = parse(query);
const parsedMutation = parse(mutation);

console.log('operation', firstOperationDefinition(parsedQuery).operation);
console.log('firstFieldName', firstFieldValueNameFromOperation(firstOperationDefinition(parsedQuery)));

console.log('operation', firstOperationDefinition(parsedMutation).operation);
console.log('firstFieldName', firstFieldValueNameFromOperation(firstOperationDefinition(parsedMutation)));

这样你就不需要依赖 graphql-tag 你可以使用 真正的 GraphQL AST(从而轻松适应进一步的要求) - 因为 graphql-tag 不提供完整的 AST。

AST Explorer 中查看查询的 AST。

原文由 Christian Ulbrich 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题