我应该期望枚举类型自动解析,还是这些类型的存在只是为了限制选项?
给定以下内容的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];
在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,
},
},
})
是的,您需要根据内部值的apollo服务器文档,将枚举值写入所需的解析程序,例如数字。以下是如何在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;
}
}
};
这里有一个代码沙盒,显示了自动枚举解析和返回。
请注意,对于作为查询参数的默认枚举值,其行为是可疑的——解析器可能会以字符串或undefined
的形式接收枚举值。
这取决于实现GraphQL的语言。GraphQL中的枚举类型只是枚举类型,仅此而已。这意味着,例如,APPROVED
枚举类型的计算结果不为任何值。这让开发人员有更多的空间用它们做他们想做的事情。如果您希望枚举映射到整数,则需要一个如您所述的解析器。
来自GraphQL关于模式和类型的文章:
注意,各种语言的GraphQL服务实现将有自己的特定于语言的方式来处理枚举。在支持enums作为一级公民的语言中,实现可能会利用这一点;在像JavaScript这样不支持枚举的语言中,这些值可能在内部映射到一组整数。
我认为您需要为它实现解析器。
但是,如果您使用Apollo Server
,它有一个名为"内部值"的功能,您可以在解析程序中使用1
作为内部值,Apollo Server
将在返回响应时自动将其映射到PENDING_APPROVAL
。