Мне интересно, в чем разница между 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