为什么apollo服务器自定义指令不起作用?

问题描述 投票:1回答:1

我正在尝试用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"
  }
} 

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

graphql apollo apollo-server
1个回答
1
投票

如果schemaDirectives正在为您构建架构,即[如果您同时也在传递ApolloServerApolloServer,则将resolvers传递给typeDefs的构造函数。如果要传递现有模式,则说明它已经构建,并且ApolloServer不会应用指令。如果您使用的是makeExecutableSchema,则可以将schemaDirectives传递给它。也可以像这样手动访问所有指令:

SchemaDirectiveVisitor.visitSchemaDirectives(schema, schemaDirectives)

这是使指令与某些库一起使用的唯一方法,例如graphql-modules

© www.soinside.com 2019 - 2024. All rights reserved.