具有自定义标量类型的 GraphQL.js 突变

Posted

技术标签:

【中文标题】具有自定义标量类型的 GraphQL.js 突变【英文标题】:GraphQL.js mutation with custom scalar type 【发布时间】:2017-07-18 21:37:52 【问题描述】:

我在 GraphQL 中有一个基于 GeoJSON 的 API,我正在尝试对其进行突变。我正在使用 graphql-geojson 中的一些类型。输入类型和变异的定义如下:

# ... from graphql-geojson ...
var CoordinatesScalar = new ScalarType(
 name: 'GeoJSONCoordinates',
 description: 'A (multidimensional) set of coordinates following x, y, z order.',
 serialize: coerceCoordinates,
 parseValue: coerceCoordinates,
 parseLiteral: parseCoordinates)


# ... schema.js ...
var waypointInputType = new GraphQLInputObjectType(
  name: 'WaypointInput',
  fields: ... schema.js ...]
var waypointInputType = new GraphQLInputObjectType(
  name: 'WaypointInput',
  fields: 
    type: type: GraphQLString,
    coordinates: type: CoordinatesScalar
  
);
var missionInputType = new GraphQLInputObjectType(
  name: 'MissionInput',
  fields: () => (
    waypoints: type: waypointInputType,
    max_groundspeed: type: GraphQLFloat
  )
);

var createMission = 
  type: missionType,
  description: 'Create a new mission.',
  args: 
    mission: type: missionInputType
  ,
  resolve(value, mission) 
    return models.Mission.create(mission).then(mission => mission);
  
;

# ... in schema definition ...
mutation: new GraphQLObjectType(
name: 'RootMutationType',
fields: 
  createMission

)

在 graphiql 中,我正在发出类似的突变

mutation 
  createMission(mission: 
    waypoints: 
      type: "LineString",
      coordinates: [[1, 2], [3, 4]]
    
  ) 
    id
  

保存一些新坐标并查询创建的任务ID。但是,graphql 会抛出 Argument mission has invalid value [...] coordinates: expected type GeoJSONCoordinates, found [[1, 2], [3, 4]] 的错误。我可以将任意字符串放在坐标中,但嵌套数组似乎不起作用。使用引号中的嵌套数组,我在查询时得到一个字符串:


 "waypoints": 
          "type": "LineString",
          "bbox": null,
          "coordinates": "[[1, 2], [3, 3]]"
      

我可以使用 CoordinatesScalar 作为输入类型,还是需要定义一个 CoordinatesScalar 可以专门为输入解析的输入类型?

【问题讨论】:

【参考方案1】:

如果您使用完整的语法来发出突变,您可以指定输入的类型:

mutation CreateMission(mission: MissonInput) 
  createMission(mission: $mission) 
    id
  

然后你可以提供变量:


  mission: 
    waypoints: 
      type: "LineString",
      coordinates: [[1, 2], [3, 4]]
    
  

我不确定这是否能解决问题,请告诉我! :)

【讨论】:

我遇到的问题是我使用了一个奇怪地序列化/反序列化的第 3 方标量(进入数据库的文本,但在退出时没有进入 JSON) - 你的答案严格来说是正确的,但是这是一个不同的问题。不过谢谢! @shadowchris 那么您是否避免使用graphql-geojson,或者您是否找到了解决方法?尝试使用该库时,我遇到了与您相同的问题。 我认为graphql-geojson 中的类型很好,如果您确保您使用的任何数据库层在输出时返回正确类型的对象,否则您必须编写反序列化程序。对我来说,我想我正在使用 sequelize,正如我所提到的,它对字符串和 json 做了一些古怪的事情。

以上是关于具有自定义标量类型的 GraphQL.js 突变的主要内容,如果未能解决你的问题,请参考以下文章

您如何使用具有多个突变的自定义文件正确播种 prisma DB?

如何使用 graphene-django 定义突变的自定义输出类型?

Flutter / GraphQL - 以自定义类型为参数的突变

GraphQL 突变中的自定义类型

自定义损失函数返回 - InvalidArgumentError:第二个输入必须是标量,但它具有形状 [64]

如何手动将 apollo 自定义标量映射到客户端类型