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

时间:2019-01-25 14:53:49

标签: 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];

4 个答案:

答案 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之类的语言中,这些值可能会在内部映射到一组整数。