How to use or resolve enum types with graphql-tools?

Dallas picture Dallas · Jul 12, 2017 · Viewed 7.6k times · Source

I cannot find anywhere in the graphql-tools documentation how one should go about utilizing enum types in schemas that are fed to makeExecutableSchema. Anyone have a clue how this done?

Example code:

enum Color {
  RED
  GREEN
  BLUE
}

type Car {
  color: Color!
}

What would the resolver for Color look like?

Answer

Daniel Rearden picture Daniel Rearden · Jul 12, 2017

You wouldn't write a resolver for Color. Here's a simple, runnable example:

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);

Run a cars query ({cars {color}}) in GraphiQL and you will see a color returned for each car in our data. Now, change one of the values in the data (not the Enum definition) to a color you didn't define, like PINK. Run the query again and you will see an error message like:

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

This works with resolvers too, so if I override the data by adding a resolver for Car like this:

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

The query will show all the cars with RED as their color. If you change the value returned by the resolver to BLACK, the query will error out again.

Enums are just a way of enforcing that whatever value a particular field resolves to is within the set of values you define.