如何使用 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 突变解析器的参数不是 v > 0.8.0 中的对象?
如何使用 graphql-tools 从两个源位置加载 GraphQL 模式?
使用 graphql-tools 打印远程模式时出现 getDirectives 错误
自定义针对 graphql-tools 中的类型定义的模拟数据
使用 graphql-tools、apollo-link-schema 和 react-hooks 在模拟时总是返回 undefined