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