Graphql 为什么阿波罗服务器自定义指令不起作用?

Graphql 为什么阿波罗服务器自定义指令不起作用?,graphql,apollo,apollo-server,Graphql,Apollo,Apollo Server,我正在尝试用apollo服务器实现一个自定义指令。我从官方网站上取了这个例子 我的问题如下: directive @upper on FIELD_DEFINITION type Query { hello: String @upper } Query:{ async hello(){ return "hello world"; } } 我的解析器如下所示: directive @upper on FIELD_DEFINIT

我正在尝试用apollo服务器实现一个自定义指令。我从官方网站上取了这个例子

我的问题如下:

directive @upper on FIELD_DEFINITION

type Query {
  hello: String @upper
}
Query:{
        async hello(){
            return "hello world";
        }
    }
我的解析器如下所示:

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"
  }
} 

为什么自定义指令未激活?为什么输出不是大写?

如果
ApolloServer
正在为您构建模式,也就是说,如果您也在传递
解析程序
typeDefs
,那么您会将
schemaDirectives
传递给
ApolloServer
的构造函数。如果您正在传入一个现有的模式,那么它已经生成,ApolloServer将不会应用这些指令。如果您使用的是
makeExecutableSchema
,您可以将
schemaDirectives
传递给它。还可以手动访问以下所有指令:

SchemaDirectiveVisitor.visitSchemaDirectives(schema, schemaDirectives)

这是让指令与某些库一起工作的唯一方法,例如
graphql模块

非常感谢,当我传入“makeExecutableSchema”时,它就起作用了