Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 832
Dallas Avatar asked Jul 12 '17 11:07

Dallas


2 Answers

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.

like image 134
Daniel Rearden Avatar answered Sep 22 '22 19:09

Daniel Rearden


By default, the enum is represented with the same string : enum Color { RED } is 'RED'. You can override this by adding a resolver to the enum:

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

More info: https://www.apollographql.com/docs/graphql-tools/scalars.html#internal-values

like image 24
azazdeaz Avatar answered Sep 24 '22 19:09

azazdeaz