【问题标题】:How to use or resolve enum types with graphql-tools?如何使用 graphql-tools 使用或解析枚举类型?
【发布时间】:2017-12-16 19:16:18
【问题描述】:

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

示例代码:

enum Color {
  RED
  GREEN
  BLUE
}

type Car {
  color: Color!
}

Color 的解析器是什么样的?

【问题讨论】:

    标签: graphql apollo-server


    【解决方案1】:

    您不会为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}}),您将看到我们数据中为每辆车返回的颜色。现在,将 data(不是 Enum 定义)中的一个值更改为您未定义的颜色,例如 PINK。再次运行查询,您将看到如下错误消息:

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

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

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

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

    枚举只是强制特定字段解析为的任何值都在您定义的值集中的一种方式。

    【讨论】:

    • 好的,所以这开箱即用。不知道枚举的值是如何确定的,这让我认为我必须为这些人设置一个解析器,然后我在文档中没有看到任何关于它的内容。感谢您的指导!
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2019-01-07
      • 1970-01-01
      • 2019-08-02
      • 2019-06-19
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多