我应该希望枚举类型能够自动解析还是仅用于限制选项?
给出以下的GraphQL模式:
type Job {
description: String!
status: Status!
}
enum Status {
PENDING_REVIEW
PENDING_APPROVAL
APPROVED
}
和类似以下查询:
query job {
description
status
}
如果我的数据库返回以下内容:
{ "description": "Some irrelevant job description", "status": 1 }
我希望GraphQL返回:
{ "description": "Some irrelevant job description", "status": "PENDING_APPROVAL" }
我设置不正确吗,或者这是预期的行为,需要我为status
编写解析器
const getQuestionStatus = ({ status }) => ['PENDING_REVIEW', 'PENDING_APPROVAL', 'APPROVED'][status];
答案 0 :(得分:1)
在GraphQL.js中,枚举类型中的每个枚举值都可能具有关联的值。设置此值是可选的。它默认为值名称的字符串表示形式。也就是说,对于像这样的枚举:
enum ExampleEnum {
FOO
BAR
}
默认情况下,FOO
的值为"FOO"
。如果您使用graphql-tools
来构建模式(或使用apollo-server
,它在后台使用graphql-tools
),则可以在解析器中直接传递Enum类型的值:
const resolvers = {
Query: {
example: () => 11, // field with ExampleEnum type
},
ExampleEnum: {
FOO: 11,
BAR: 23,
},
}
完成此操作后,我们可以在解析器中返回定义的值,并将其序列化为适当的Enum值。注意:用作参数的枚举也是如此-如果将FOO
作为参数传递,则解析程序实际上将接收到值11
。
不提供任何值等效于:
ExampleEnum: {
FOO: 'FOO',
BAR: 'BAR',
}
还值得注意的是,提供值对枚举值在响应中的显示方式没有影响。将执行结果序列化为JSON时,枚举值始终显示为与枚举值的名称匹配的字符串值(在我们的示例中为"FOO"
和"BAR"
)。
香草GraphQL.js怎么样?
如果您以编程方式定义架构,则还可以提供枚举值的值。这与上面的示例等效:
const ExampleEnumType = new GraphQLEnumType({
name: 'ExampleEnum',
values: {
FOO: {
value: 11,
},
BAR: {
value: 23,
},
},
})
答案 1 :(得分:1)
是的,您需要将枚举值写入解析器,以解析到所需的值,例如apollo-server docs for Internal values中的数字。这是在TypeScript中执行此操作的方法:
export enum Status {
DRAFT,
PENDING,
APPROVED
}
const typeDefs = gql`
enum Status {
DRAFT
PENDING
APPROVED
}
type Query {
echo(status: Status!): Int!
}
`;
const resolvers = {
Status: {
DRAFT: Status.DRAFT,
PENDING: Status.PENDING,
APPROVED: Status.APPROVED
},
Query: {
echo(_, { status }): String {
console.log(status);
return status;
}
}
};
这里是Code Sandbox showing automatic enum parsing and return。
请注意,尽管对于作为查询参数的默认枚举值而言,其行为令人怀疑-the resolver may receive the enum value as a string, or undefined
。
答案 2 :(得分:0)
我认为您需要为此实现解析器。
但是,如果您使用的是1
,它具有称为Internal Values的功能,您可以在其中使用Apollo Server
作为解析器的内部值,PENDING_APPROVAL
将自动映射返回响应时将其发送到{{1}}。
答案 3 :(得分:0)
这取决于您实现GraphQL所使用的语言。GraphQL中的枚举类型是 just 枚举类型,仅此而已。例如,这意味着您的APPROVED
枚举类型不会计算任何值。这为开发人员提供了更多的空间来处理他们想要的事情。如果您希望枚举映射到整数,则需要使用您所描述的解析器。
来自GraphQL article的架构和类型:
请注意,各种语言的GraphQL服务实现将具有其自己的特定于语言的方式来处理枚举。在支持枚举为一等公民的语言中,实现可能会利用这种优势。在不支持枚举的JavaScript之类的语言中,这些值可能会在内部映射到一组整数。