GraphQL枚举类型是否自动解析其值



我应该期望枚举类型自动解析,还是这些类型的存在只是为了限制选项?

给定以下内容的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

最新更新