为 GraphQL 中的所有查询添加架构指令

cos*_*arc 6 apollo graphql graphql-js apollo-server express-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. DirectiveLocation最终会是什么?对象或查询/突变?

Ami*_*yar 2

为了访问对象(你是对的 Query 是)使用visitObject和特定 api 端(查询中的任何方法)使用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;
Run Code Online (Sandbox Code Playgroud)

在 graphQL 模式中

directive @authorization(requires: Role) on OBJECT | FIELD_DEFINITION
Run Code Online (Sandbox Code Playgroud)

在模式构建器或服务器中包含

resolvers,
schemaDirectives: {
    authorization: authDirective
}
Run Code Online (Sandbox Code Playgroud)