Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
Arrays graphQL-客户端查询批处理-对键列表重复一个查询_Arrays_Graphql_Key_Client_Concat - Fatal编程技术网

Arrays graphQL-客户端查询批处理-对键列表重复一个查询

Arrays graphQL-客户端查询批处理-对键列表重复一个查询,arrays,graphql,key,client,concat,Arrays,Graphql,Key,Client,Concat,我在这方面似乎找不到什么,所以我敢问 graphQL中“客户端查询批处理”的最佳实践是什么 问题: 我想重复一个查询键列表=一个“可变对象”列表 但不支持批量查询 /graphqlendpoind返回状态400错误请求, 而/graphql/batch端点返回未找到的状态404 简单的解决方案: 将子查询合并为单个大查询 并重命名变量 偷自 现代GraphQL服务器接受一个JSON查询数组,作为 输入 不幸的是,GitHub GraphQLAPI并非如此 在我们的例子中,这里的技巧是连接所有查询

我在这方面似乎找不到什么,所以我敢问

graphQL中“客户端查询批处理”的最佳实践是什么

问题:
我想重复一个查询键列表=一个“可变对象”列表
但不支持批量查询
/graphql
endpoind返回状态400错误请求,
/graphql/batch
端点返回未找到的状态404

简单的解决方案:
将子查询合并为单个大查询
并重命名变量

偷自

现代GraphQL服务器接受一个JSON查询数组,作为 输入

不幸的是,GitHub GraphQLAPI并非如此

在我们的例子中,这里的技巧是连接所有查询和 通过添加前缀来命名它们:

{
  Q0: human(id: "1000") {
    name
  }
  Q1: human(id: "1001") {
    name
  }
  # etc...
}
在上面的请求中,将发送9个名为Q0到Q9的请求。这个 服务器回复9个结果,前缀为相同的Q0到Q9名称

在javascript中,该解决方案看起来像

//javascript中的graphQL查询批处理
//
//拒绝批处理查询的服务器的解决方法
//
// https://medium.com/mergify/batching-queries-with-graphql-94983b648c3c
// https://github.com/Mergifyio/graphql-utils
//
//概念
// 
//将多个子查询合并为一个大查询
//例如,查询键列表
//
//键=[0,1]=[a0,b0],[a1,b1]]
//
//质疑(
//$a0:Int,$b0:Int,
//$a1:Int,$b1:Int,
//   ){
//#键0的结果0
//r0:对象(a:$a0,b:$b0){
//场
//     }
//#键1的结果1
//r1:对象(a:$a1,b:$b1){
//场
//     }
//   }
//用于基本身份验证的登录数据
从“./login.js”导入{username,password}
常量url=https://api.github.com/graphql'
//添加“回购”子查询
功能qAddRepo(qObj、rIdx、vars){
/*
变量:
回购方
书名
委托人
佣金每页
*/
常量sri='.'+rIdx.toString()//字符串repo索引
//添加变量
Object.keys(vars.forEach(key=>{
qObj.variables[key+sri]=vars[key]
})
//添加查询
qObj.query+=`
r${sri}:存储库(
所有者:$repowner${sri},
名称:$repoName${sri},
) {
所有者姓名
#github上的“最新提交”
普希达特
#回购创建时间
创建数据
天文学家{
总数
}
#伊斯福克
分叉计数
DefaultBranchhref{
目标{
#总支
…提交{
历史(
在:$commitsCursor${sri}之后,
第一:$commitsPerPage${sri},
) {
#提交计数
总数
页面信息{
#委托人
结束光标
下一页
}
节点{
#提交节点
老年人
}}}}}}
`
}
//启动查询对象
函数qStart(){
返回{
变量:{},
查询:“”,
}
}
//从javascript类型获取graphQL类型
常数qVarType={
'光标':'字符串',
'字符串':'字符串!',
'number':'Int!',
'对象':'字符串',//光标?
//“字符串”可以为空
//(typeof null)==对象
}
//结束查询对象
功能qEnd(qObj)
{
const qVars=Object.keys(qObj.variables).map((key)=>{
//从变量名猜测游标数据类型
if(key.substr(key.lastIndexOf(“')-6,6)=Cursor'){
返回“$”+key+”:“+qVarType['cursor']
}
返回“$”+key+”:“+qVarType[(typeof qObj.variables[key])]
}).join(“,\n”)
qObj.query=`query(
${qVars}
){
${qObj.query}
}`
//从查询中删除空白和注释
qObj.query=qObj.query.split('\n').reduce((acc,val)=>{
常数val2=值trim()
if(val2[0]='#'| | val2==''){
//拆线
返回acc
}
否则{
返回acc+'\n'+val2
}
}, '')
}
//生成查询
设qObj=qStart()
qAddRepo(qObj,0{
repoOwner:“Mergifyio”,
repoName:'graphql utils',
提交人:null,//第一页
佣金每页:2,
})
qAddRepo(qObj,1{
报告所有者:“octokit”,
repoName:'graphql.js',
提交人:null,//第一页
佣金每页:2,
})
qEnd(qObj)
console.log('variables='+JSON.stringify(qObj.variables,null'))
console.log('query='+qObj.query)
//发送查询
const headers=新的头({
“授权”:“基本”+btoa(用户名+”:“+密码),
“内容类型”:“应用程序/json”,
“接受”:“应用程序/json”,
})
获取(url{
方法:“POST”,
标题:标题,
正文:JSON.stringify(qObj),
})
.then(r=>r.json())
。然后(响应=>{
//打印响应
log('response='+JSON.stringify(response,null,'))
})
答复:

{
  "data": {
    "r_0": {
      "nameWithOwner": "Mergifyio/graphql-utils",
      "pushedAt": "2019-07-11T21:43:00Z",
      // ....
    },
    "r_1": {
      "nameWithOwner": "octokit/graphql.js",
      "pushedAt": "2019-12-24T09:45:29Z",
      // ....
    }
  }
}
这可以扩展为允许“嵌套分页”
采用广泛优先搜索或深入优先搜索策略

朱利安·丹茹说:

就我们所见,构建这种查询没有简单的方法 而不是自己做没有库执行此操作。这就是原因 我们必须构建自己的代码

为什么不呢?只是两个人遇到了API限制吗?
还有谁等不及服务器管理员更改他们的配置呢

我仍然感到困惑