GraphQL (Apollo): Можете ли вы получить доступ к директивам в функции разрешения? - PullRequest
0 голосов
/ 30 декабря 2018

Я бы хотел сделать каждое поле приватным, если иное не указано в директиве.Можно ли получить эту информацию в функции разрешения?

const typeDefs = gql`
  directive @public on FIELD_DEFINITION

  type Query {
    viewer: User @public
    secret: String
  }

  type User {
    id: ID!
  }
`

const schema = makeExecutableSchema({
  typeDefs,
  resolvers,
});

addSchemaLevelResolveFunction(schema, (parent, args, params, info) => {
  // Not possible
  if (info.fieldName.directive === 'public') {
    return parent;
  }

  throw new Error('Authentication required...');
});

const server = new ApolloServer({ schema });

1 Ответ

0 голосов
/ 30 декабря 2018

Хотя в массиве fieldNodes есть свойство directives для объекта FieldNode, насколько мне известно, оно не заполнено директивами, применимыми к этому конкретному полю.

Директивына самом деле не предназначены для использования в качестве флага для чего-то, на что можно ссылаться в преобразователе (на уровне схемы или иным образом).Вы можете рассмотреть возможность перемещения вашей логики в функцию visitFieldDefinition директивы:

const { defaultFieldResolver } = require('graphql')
const { SchemaDirectiveVisitor } = require('graphql-tools')

class PublicDirective extends SchemaDirectiveVisitor {
  visitFieldDefinition(field) {
    const { resolve = defaultFieldResolver } = field
    field.resolve = async function (source, args, context, info) {
      if (someCondition) {
        throw new SomeError()
      }
      return resolve.apply(this, [source, args, context, info])
    }
  }
}

const schema = makeExecutableSchema({
  typeDefs,
  resolvers,
  schemaResolvers: {
    public: PublicDirective,
  },
})
...