Если да, то какой из следующих методов следует перезаписать и как? Мне не удалось найти пример того, как переопределить каждый из них.
visitSchema(schema: GraphQLSchema)visitScalar(scalar: GraphQLScalarType)visitObject(object: GraphQLObjectType)visitFieldDefinition(field: GraphQLField<any, any>)visitArgumentDefinition(argument: GraphQLArgument)visitInterface(iface: GraphQLInterfaceType)visitUnion(union: GraphQLUnionType)visitEnum(type: GraphQLEnumType)visitEnumValue(value: GraphQLEnumValue)visitInputObject(object: GraphQLInputObjectType)visitInputFieldDefinition(field: GraphQLInputField)Моя интуиция подсказывает, что visitObject(object: GraphQLObjectType), поскольку type Query - это GraphQLObjectType.


Для посещения объектов (вы правы, Query) используйте visitObject, а для конкретного API-интерфейса (любой метод в Query) используйте visitFieldDefinition.
Я реализовал это следующим образом:
class authDirective extends SchemaDirectiveVisitor {
visitObject(type) {
this.ensureFieldsWrapped(type);
type._requiredAuthRole = this.args.requires;
}
visitFieldDefinition(field, details) {
this.ensureFieldsWrapped(details.objectType);
field._requiredAuthRole = this.args.requires;
}
ensureFieldsWrapped(objectType){
const fields = objectType.getFields();
//your logic to resolve directive
}
}
module.exports = authDirective;
В схеме graphQL
directive @authorization(requires: Role) on OBJECT | FIELD_DEFINITION
В построителе схемы или сервере включают
resolvers,
schemaDirectives: {
authorization: authDirective
}