Почему пользовательская директива apollo server не работает?

Я пытаюсь реализовать настраиваемую директиву с сервером apollo. Я взял пример с официального сайта.

Мой запрос выглядит следующим образом:

directive @upper on FIELD_DEFINITION

type Query {
  hello: String @upper
}

Мой преобразователь выглядит следующим образом:

Query:{
        async hello(){
            return "hello world";
        }
    }

Вот моя конфигурация сервера apollo для настраиваемой директивы:

const { ApolloServer, SchemaDirectiveVisitor } = require('apollo-server-express');
const { defaultFieldResolver } = require("graphql");

class UpperCaseDirective extends SchemaDirectiveVisitor {
    visitFieldDefinition(field) {
      const { resolve = defaultFieldResolver } = field;
      field.resolve = async function (...args) {
        const result = await resolve.apply(this, args);
        if (typeof result === "string") {
          return result.toUpperCase();
        }
        return result;
      };
    }
  }

const server = new ApolloServer({
    schema,
    schemaDirectives: {
        upper: UpperCaseDirective
    },
    introspection: true,
    playground: true,
    cors: cors()

});

На выходе я всегда получаю:

{
  "data": {
    "hello": "hello world"
  }
} 

Почему не активирована кастомная директива? Почему вывод не в верхнем регистре?


person Fozle Rabbi Shafi    schedule 21.04.2020    source источник


Ответы (1)


Вы бы передали schemaDirectives конструктору ApolloServer, если ApolloServer строил вашу схему для вас, то есть если вы также передавали resolvers и typeDefs. Если вы передаете существующую схему, она уже создана, и ApolloServer не будет применять директивы. Если вы используете makeExecutableSchema, вы можете передать ему свой schemaDirectives. Также можно вручную просмотреть все директивы, например:

SchemaDirectiveVisitor.visitSchemaDirectives(schema, schemaDirectives)

Это единственный способ заставить директивы работать с определенными библиотеками, такими как graphql-modules.

person Daniel Rearden    schedule 21.04.2020
comment
Большое спасибо, он работает, когда я передаю makeExecutableSchema - person Fozle Rabbi Shafi; 22.04.2020