могут ли все местоположения директив быть реализованы с помощью directiveResolvers в makeExecutableSchema - PullRequest
0 голосов
/ 27 мая 2020

Мне интересно, в чем разница между directiveResolvers и schemaDirectives в makeExecutableSchema? Есть ли способ реализовать расположение всех директив с помощью directiveResolvers?

Сначала кажется, что они одинаковы, но потом я понял, что у них другая подпись schemaDirectives использует SchemaDirectiveVisitor для обработки директивы и directiveResolvers использует attachDirectiveResolvers для обработки директив.

Когда я пытаюсь разрешить директиву для объекта

directive @auth on OBJECT | FIELD_DEFINITION

, я получаю эту ошибку

SchemaDirectiveVisitor for @auth must implement visitObject method

Полный пример

import { ApolloServer, gql, makeExecutableSchema } from 'apollo-server-express';
import express from 'express';

const app = express();

const server = new ApolloServer({
  schema: makeExecutableSchema({
    typeDefs: gql`
      directive @auth on OBJECT | FIELD_DEFINITION

      type User {
        email: String! @auth
      }

      type Query {
        hi: String @auth
      }
    `,
    resolvers: {
      Query: {
        hi: () => 'hi',
      },
    },
    directiveResolvers: {
      auth: (fieldResolver) => {
        console.log('executed');
        return fieldResolver();
      },
    },
  }),
});
server.applyMiddleware({ app });

app.listen({ port: 4444 }, () =>
  console.log(`? Server ready at http://localhost:4444${server.graphqlPath}`),
);

Подробности реализации: https://github.com/ardatan/graphql-tools/blob/38eca1c6567b22d4576e1498403e97038a8475e8/packages/schema/src/makeExecutableSchema.ts#L69 -L77

https://github.com/ardatan/graphql-tools/blob/master/packages/schema/src/attachDirectiveResolvers.ts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...