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

Posted

技术标签:

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

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

示例代码:

enum Color 
  RED
  GREEN
  BLUE


type Car 
  color: Color!

Color 的解析器是什么样的?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何使用 graphql-tools 使用或解析枚举类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 graphql-tools 调用查询

graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?

如何使用 graphql-tools 从两个源位置加载 GraphQL 模式?

使用 graphql-tools 打印远程模式时出现 getDirectives 错误

自定义针对 graphql-tools 中的类型定义的模拟数据

使用 graphql-tools、apollo-link-schema 和 react-hooks 在模拟时总是返回 undefined