如何使用graphql-tools来使用或解析枚举类型?

时间:2017-07-12 11:24:38

标签: graphql apollo-server

我在graphql-tools文档中的任何地方都找不到如何在enum中提供的模式中使用makeExecutableSchema类型。任何人都知道这是怎么做到的?

示例代码:

enum Color {
  RED
  GREEN
  BLUE
}

type Car {
  color: Color!
}

Color的解析器会是什么样的?

2 个答案:

答案 0 :(得分:8)

你不会为Color写一个解析器。这是一个简单,可运行的例子:

const bodyParser = require('body-parser');
const { graphqlExpress, graphiqlExpress } = require('graphql-server-express');
const { makeExecutableSchema } = require('graphql-tools');
const app = require('express')();

const carsData = [
  {color: 'RED'},
  {color: 'GREEN'},
  {color: 'BLUE'},
];

const typeDefs = `
  enum Color {
    RED
    GREEN
    BLUE
  }
  type Car {
    color: Color!
  }
  type Query {
    cars: [Car!]!
  }
`;

const resolvers = {
  Query: {
    cars: () => carsData,
  }
};

const schema = makeExecutableSchema({
  typeDefs,
  resolvers,
});

app.use('/graphql', bodyParser.json(), graphqlExpress({ schema }));
app.use('/graphiql', graphiqlExpress({ endpointURL: '/graphql' }));

app.listen(3000);

GraphiQL中运行cars查询({cars {color}}),您会在我们的数据中看到为每辆车返回的颜色。现在,将数据(不是枚举定义)中的一个值更改为您未定义的颜色,例如PINK。再次运行查询,您将看到如下错误消息:

"Expected a value of type \"Color\" but received: PINK"

这也适用于解析器,所以如果我通过为Car添加一个解析器来覆盖数据:

Car: {
  color: () => 'RED'
}

查询将显示所有以RED为颜色的汽车。如果您将解析程序返回的值更改为BLACK,则查询将再次出错。

枚举只是一种强制执行,即特定字段所解析的任何值都在您定义的值集合中。

答案 1 :(得分:1)

默认情况下,枚举使用相同的字符串表示:enum Color { RED }'RED'。 您可以通过向枚举添加解析器来覆盖它:

Color: {
  RED: '#ff0000',
  GREEN: '#00ff00'
},
Query {...

更多信息:https://www.apollographql.com/docs/graphql-tools/scalars.html#internal-values