如何将 GraphQL 请求字符串解析为对象
How to parse GraphQL request string into an object
我是 运行 GraphQL 的 Apollo lambda 服务器。我想从 POST 请求正文中拦截 GraphQL query/mutation 并对其进行解析,以便找出请求所要求的 query/mutation 。环境是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
突变。
我的第一个想法是去除换行符并尝试使用正则表达式来解析请求,但感觉这是一个非常脆弱的解决方案。
您可以使用 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
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
并且你可以使用 real GraphQL AST(因此很容易适应进一步的要求) - 因为 graphql-tag
不提供完整的 AST。
请参阅 AST Explorer 中查询的 AST。
您可以像这样使用 graphql-js
:
const { parse, visit } = require('graphql');
const query = `
{
books {
...rest of the query
}
}
`
const ast = parse(query);
const newAst = visit(ast, {
enter(node, key, parent, path, ancestors) {
// do some work
},
leave(node, key, parent, path, ancestors) {
// do some more work
}
});
我相信这就是 graphql 服务器实现在幕后使用的东西,不过我可能弄错了。
我是 运行 GraphQL 的 Apollo lambda 服务器。我想从 POST 请求正文中拦截 GraphQL query/mutation 并对其进行解析,以便找出请求所要求的 query/mutation 。环境是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
突变。
我的第一个想法是去除换行符并尝试使用正则表达式来解析请求,但感觉这是一个非常脆弱的解决方案。
您可以使用 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
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
并且你可以使用 real GraphQL AST(因此很容易适应进一步的要求) - 因为 graphql-tag
不提供完整的 AST。
请参阅 AST Explorer 中查询的 AST。
您可以像这样使用 graphql-js
:
const { parse, visit } = require('graphql');
const query = `
{
books {
...rest of the query
}
}
`
const ast = parse(query);
const newAst = visit(ast, {
enter(node, key, parent, path, ancestors) {
// do some work
},
leave(node, key, parent, path, ancestors) {
// do some more work
}
});
我相信这就是 graphql 服务器实现在幕后使用的东西,不过我可能弄错了。