在架构中未定义graphql枚举

时间:2019-05-14 19:29:03

标签: javascript node.js enums graphql

我目前正在学习GraphQL,但偶然发现了此错误。如何在仍使用GraphQLEnumType对象的同时修复它。

const { ApolloServer, gql } = require('apollo-server');
const { GraphQLEnumType } = require('graphql');

const Bonus = new GraphQLEnumType({
    name: 'Bonus',
    values: {
        BIG: {
            value: "Big",
        },
        SMALL: {
            value: "Small",
        }
    },
});

const typeDefs = gql`

enum Bonus {
  BIG
  SMALL
}
`;

const resolvers = {
    Bonus : Bonus
}

const server = new ApolloServer({
    typeDefs,
    resolvers
});

server.listen().then(({ url }) => {
    console.log(`  Server ready at ${url}`);
});

以下是错误:

  

/home/jonas/Projects/javascript-questions-flow4b/backend/node_modules/graphql-tools/dist/generate/addResolveFunctionsToSchema.js:53                       抛出新的_1.SchemaError(typeName +“。” + fieldName +“已在解析程序中定义,但枚举不在架构中”);                       ^

     

错误:Bonus.name是在解析器中定义的,但枚举不在架构中

2 个答案:

答案 0 :(得分:1)

如果使用GraphQLEnumTypetypeDefs配置ApolloServer,则不能使用resolvers。相反,如果要为枚举值提供自定义值,则将适当的对象作为resolvers的一部分传递,如the docs所示。

const resolvers: {
  Bonus: {
    BIG: 'Big',
    SMALL: 'Small', 
  },
}

请注意,仅当您想在内部将枚举值映射到名称之外的其他内容时,才需要执行此操作。默认情况下,BIG将映射到"BIG",而SMALL将映射到"SMALL",因此,如果您只需要这些,就不要在解析器中包含Bonus完全没有。

答案 1 :(得分:0)

如果要使用typeDefs和解析器配置ApolloServer,则可以实际使用GraphQLEnumType。

在typeDefs对象中将BonusType定义为标量:

const BonusType = new GraphQLEnumType({
    name: 'Bonus',
    values: {
        BIG: {
            value: "Big",
        },
        SMALL: {
            value: "Small",
        }
    },
});

const typeDefs = gql`

scalar BonusType
`;

现在,每当添加BonusType对象的查询时,您都会得到以下结果: 1. BonusType枚举的名称。 2. BonusType枚举的值。

有关更多信息,请参见https://spectrum.chat/apollo/apollo-server/how-to-use-custom-enums~376c8da8-19a5-4338-9bee-4cba7a036d8f