Вам нужно будет проанализировать объект 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-resol-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, иликак угодно) соответственно.