我写了一个如下的grapqhl查询
例如
posts {
author {
comments {
}
}
comments
}
我想从posts
解析器中了解-我如何才能获得有关预先需要的other resolvers
的详细信息?
我想这样做是为了避免解析器的嵌套调用,我编写了一个api服务器,它通过'DataSources
'调用graphql-server来获取数据。
我可以更改api服务器以一次获取所有数据。
我正在使用apollo-server 2.0,也欢迎使用任何其他避免嵌套调用的方式。
答案 0 :(得分:1)
在这里,您可以使用几个要点来优化查询的性能。
答案 1 :(得分:1)
您需要解析作为解析器第四个参数传递到解析器的info
对象。这是对象的类型:
type GraphQLResolveInfo = {
fieldName: string,
fieldNodes: Array<Field>,
returnType: GraphQLOutputType,
parentType: GraphQLCompositeType,
schema: GraphQLSchema,
fragments: { [fragmentName: string]: FragmentDefinition },
rootValue: any,
operation: OperationDefinition,
variableValues: { [variableName: string]: any },
}
您可以自己横过该领域的AST,但是最好使用现有的库。我建议graphql-parse-resolve-info。还有许多其他库,但是graphql-parse-resolve-info
是一个非常完整的解决方案,实际上postgraphile
在后台使用。用法示例:
posts: (parent, args, context, info) => {
const parsedResolveInfo = parseResolveInfo(info)
console.log(parsedResolveInfo)
}
这将沿以下行记录对象:
{
alias: 'posts',
name: 'posts',
args: {},
fieldsByTypeName: {
Post: {
author: {
alias: 'author',
name: 'author',
args: {},
fieldsByTypeName: ...
}
comments: {
alias: 'comments',
name: 'comments',
args: {},
fieldsByTypeName: ...
}
}
}
}
您可以遍历结果对象并相应地构造SQL查询(或API请求集,或其他)。