Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将GraphQL请求字符串解析为对象_Javascript_Node.js_Graphql_Apollo Server - Fatal编程技术网

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

Javascript 如何将GraphQL请求字符串解析为对象,javascript,node.js,graphql,apollo-server,Javascript,Node.js,Graphql,Apollo Server,我正在为GraphQL运行Apollo lambda服务器。我想从POST请求主体截取GraphQL查询/变异并对其进行解析,以便找出请求请求的查询/变异。环境是Node.js 请求不是JSON,而是GraphQL查询语言。我环顾四周,试图找到一种方法,将其解析为一个我可以导航的对象,但我画的是一个空白 Apollo服务器必须以某种方式对其进行解析以引导请求。是否有人知道有一个库可以这样做,或者我可以如何解析请求?下面是请求主体的示例以及我想要检索的内容 {"query":"{\n qQuer

我正在为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
突变

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

您可以使用:

打印出:

operation query
name qQueryEndpoint
还有你的变异:

operation mutation
name saveSomething

graphql标记
构建在核心
graphql
库上(并随之安装)-如果您只想获取操作类型和名称,可以直接使用
graphql
并分析解析的graphql操作的完整AST:

const{parse}=require('graphql');
常量查询=`
{
qQueryEndpoint{
身份证件
}
} 
`;
常数突变=`
突变{
节省{
身份证件
}
}
`;
常量firstOperationDefinition=(ast)=>ast.definitions[0];
const firstFieldValueNameFromOperation=(operationDefinition)=>operationDefinition.selectionSet.selections[0].name.value;
const parsedQuery=解析(查询);
const parsedMutation=解析(变异);
log('operation',firstOperationDefinition(parsedQuery).operation);
log('firstFieldName',firstFieldValueNameFromOperation(firstOperationDefinition(parsedQuery)));
log('operation',firstOperationDefinition(parsedMutation).operation);
log('firstFieldName',firstFieldValueNameFromOperation(firstOperationDefinition(ParsedMutate)));
这样,您就不需要依赖于
graphql标记
,而且您可以使用真正的graphql AST(因此可以轻松地适应进一步的需求)-因为
graphql标记
不提供完整的AST


有关中的查询,请参见AST。

您可以使用
graphql js
如下所示:

const{parse,visit}=require('graphql');
常量查询=`
{
书{
…问题的其余部分
}
}
`
const ast=解析(查询);
const newAst=访问(ast{
输入(节点、键、父级、路径、父级){
//做些工作
},
离开(节点、键、父级、路径、祖先){
//多做些工作
}
});

我相信这就是graphql服务器实现在引擎盖下使用的,但我可能弄错了。

我的问题可能是错误的。请求是GraphQL查询语言,而不是AST。我编辑过。谢谢你的意见@GabrielBleu根据我对文档的理解,该包从对象生成查询,而不是从查询生成对象。它解析查询字符串并返回一个对象,但似乎更受欢迎。这太棒了!谢谢你帮我,我很感激。我们有类似的歌朗吗?
operation mutation
name saveSomething