如何将突变中的 GraphQLEnumType 作为字符串值传递

kri*_*nan 5 graphql graphql-js

我有以下 GraphQLEnumType

const PackagingUnitType = new GraphQLEnumType({
  name: 'PackagingUnit',
  description: '',
  values: {
    Carton: { value: 'Carton' },
    Stack: { value: 'Stack' },
  },
});
Run Code Online (Sandbox Code Playgroud)

在突变查询中,如果我将 PackagingUnit 值作为 Carton(不带引号)传递,它会起作用。但是如果我作为字符串 'Carton' 传递,它会抛出以下错误

In field "packagingUnit": Expected type "PackagingUnit", found "Carton"
Run Code Online (Sandbox Code Playgroud)

有没有办法从客户端将枚举作为字符串传递?

编辑:我的前端有一个表单,我从用户那里收集 PackagingUnit 类型以及其他字段。PackagingUnit 类型在前端表示为字符串(不是 graphQL Enum 类型),由于我没有使用 Apollo Client 或 Relay,所以我必须自己构建 graphQL 查询字符串。现在我正在收集表单数据作为 JSON,然后执行 JSON.stringify(),然后删除属性上的双引号以获得最终的 graphQL 兼容查询。

例如。我的表单有两个字段 PackagingUnitType (An GraphQLEnumType) 和 noOfUnits (An GraphQLFloat) 我的 json 结构是

{ 
  packagingUnitType: "Carton",
  noOfUnits: 10
}
Run Code Online (Sandbox Code Playgroud)

使用 JSON.stringify() 将其转换为字符串

'{"packagingUnitType":"Carton","noOfUnits":10}'
Run Code Online (Sandbox Code Playgroud)

然后删除属性上的双引号

{packagingUnitType:"Carton",noOfUnits:10}
Run Code Online (Sandbox Code Playgroud)

现在这可以传递给 graphQL 服务器,如

newStackMutation(input: {packagingUnitType:"Carton", noOfUnits:10}) {
...
}
Run Code Online (Sandbox Code Playgroud)

仅当枚举值没有任何引号时才有效。像下面

newStackMutation(input: {packagingUnitType:Carton, noOfUnits:10}) {
...
}
Run Code Online (Sandbox Code Playgroud)

谢谢

yac*_*aka 2

GraphQL 查询可以接受变量。这对您来说会更容易,因为您不必进行一些棘手的字符串连接。

我想你使用 GraphQLHttp - 或类似的。要随查询发送变量,请发送带有query键和variables键的 JSON 正文:

// JSON body
{
  "query": "query MyQuery { ... }",
  "variables": {
    "variable1": ...,
  }
}
Run Code Online (Sandbox Code Playgroud)

查询语法为:

query MyMutation($input: NewStackMutationInput) {
  newStackMutation(input: $input) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将变量传递为:

{
  "input": {
    "packagingUnitType": "Carton",
    "noOfUnits": 10
  }
}
Run Code Online (Sandbox Code Playgroud)

GraphQL 会理解packagingUnitType它是 Enum 类型,并会为您进行转换。