Добавить директиву схемы для всех запросов в GraphQL
- Есть ли способ добавить директиву схемы, переопределив один из методов SchemaDirectiveVisitor для всех запросов и мутаций? Например, чтобы проверить токен аутентификации в директиве. Было бы неплохо добавить его только один раз не для каждого определенного запроса / мутации.
Если да, какой из следующих методов должен быть перезаписан и как? Я не смог найти пример того, как переопределить каждый из них.
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
,
- Каким будет директивное местоположение в конце концов? ОБЪЕКТ или ЗАПРОС / МУТАЦИЯ?
1 ответ
Для посещения объектов (вы правы запрос есть) используйте 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;
В графе SQL Шема
directive @authorization(requires: Role) on OBJECT | FIELD_DEFINITION
В схему-компоновщик или сервер включите
resolvers,
schemaDirectives: {
authorization: authDirective
}