Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
Graphql 如何防止基于选择集运行冲突解决程序?_Graphql_Apollo Server - Fatal编程技术网

Graphql 如何防止基于选择集运行冲突解决程序?

Graphql 如何防止基于选择集运行冲突解决程序?,graphql,apollo-server,Graphql,Apollo Server,例如: query { me { starredPosts { id } } } 服务器如何注意到只请求了id,并使用已经获取的user.starredPosts(id数组),而不是调用Posts.findOne(id)对于每个id?我们也遇到了同样的问题,并且正在公开采购我们在过去一年半的时间里为解决这些问题而在内部构建的工具: 对于这样的对象解析器,我们使用的解决方案是将它们解析为只包含ID的“存根”对象,类似于: const childField={

例如:

query {
  me {
    starredPosts {
      id
    }
  }
}

服务器如何注意到只请求了id,并使用已经获取的
user.starredPosts
(id数组),而不是调用
Posts.findOne(id)
对于每个id?

我们也遇到了同样的问题,并且正在公开采购我们在过去一年半的时间里为解决这些问题而在内部构建的工具:

对于这样的对象解析器,我们使用的解决方案是将它们解析为只包含ID的“存根”对象,类似于:

const childField={
类型:ChildType,
解析:obj=>({id:obj.childId}),
};
然后,我们使用
DataLoader
获取子对象上的附加字段,如果使用我们自己的默认解析器需要这些字段的话

我们连接到内部restapi,它支持对这些请求进行批处理,因此需要额外字段的查询可以有效地调度和解决


但是,在编写自定义解析程序时,这确实会引入潜在的错误,因为不能保证
obj
实际上具有相关字段。我们通过设置静态类型来防止对
obj

属性的未经检查的访问来解决此问题。您可以检查
info.fieldNodes[0]。selectionSet.selections
或使用
graphql fields
包:

const postsIds = user.starredPosts

const selectionSet = Object.keys(graphqlFields(info))

const onlySelectingId = isEqual(['__typename', 'id'], selectionSet.sort())
if (onlySelectingId) {
  return postIds.map(id => ({ id, __typename: 'Post' }))
} else {
  return favs.map(id => Post.findOneById(id))
}