Добавить директиву схемы для всех запросов в GraphQL

  1. Есть ли способ добавить директиву схемы, переопределив один из методов SchemaDirectiveVisitorдля всех запросов и мутаций? Например, чтобы проверить токен аутентификации в директиве. Было бы неплохо добавить его только один раз, а не для каждого определенного запроса / мутации.
  2. Если да, то какой из следующих методов следует перезаписать и как? Мне не удалось найти пример того, как переопределить каждый из них.

    • 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. Каким будет Директива в итоге? ОБЪЕКТ или ЗАПРОС / МУТАЦИЯ?
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
7
0
1 371
1

Ответы 1

Для посещения объектов (вы правы, 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
}

Другие вопросы по теме