Javascript 具有自定义标量类型的GraphQL.js变体
我在GraphQL中有一个基于GeoJSON的API,我正在尝试对其进行修改。我正在使用graphql geojson中的一些类型。输入类型和变异的定义如下:Javascript 具有自定义标量类型的GraphQL.js变体,javascript,geojson,graphql,graphql-js,Javascript,Geojson,Graphql,Graphql Js,我在GraphQL中有一个基于GeoJSON的API,我正在尝试对其进行修改。我正在使用graphql geojson中的一些类型。输入类型和变异的定义如下: #。。。从graphql geojson。。。 var CoordinatesScalar=新的ScalarType({ 名称:“地理坐标”, 描述:“一组(多维)坐标,按x、y、z顺序排列。”, 序列化:强制坐标, parseValue:强制坐标, parseLiteral:parseCoordinates}) # ... schema
#。。。从graphql geojson。。。
var CoordinatesScalar=新的ScalarType({
名称:“地理坐标”,
描述:“一组(多维)坐标,按x、y、z顺序排列。”,
序列化:强制坐标,
parseValue:强制坐标,
parseLiteral:parseCoordinates})
# ... schema.js。。。
var waypointInputType=新的GraphQlinputObject类型({
名称:“航路点输入”,
字段:{…schema.js…]
var waypointInputType=新的GraphQlinputObject类型({
名称:“航路点输入”,
字段:{
类型:{type:GraphQLString},
坐标:{type:CoordinatesScalar}
}
});
var missionInputType=新的GraphQInputObject类型({
名称:“任务输入”,
字段:()=>({
航路点:{type:waypointInputType},
最大地面速度:{type:GraphQLFloat}
})
});
var createMission={
类型:任务类型,
描述:“创建新任务。”,
args:{
任务:{type:missionInputType}
},
解析(值,{mission}){
返回模型.Mission.create(Mission).then(Mission=>Mission);
}
};
#…在架构定义中。。。
突变:新的GraphQLObjectType({
名称:“RootMutationType”,
字段:{
创造使命
}
})
在graphiql中,我发布了一个类似
mutation {
createMission(mission: {
waypoints: {
type: "LineString",
coordinates: [[1, 2], [3, 4]]
}
}) {
id
}
}
保存一些新坐标并查询创建的任务id。但是,graphql抛出一个错误,即参数任务具有无效值[…]坐标:预期类型GeoJSONCoordinates,找到[[1,2],[3,4]]
。我可以在坐标中放置任意字符串,但嵌套数组似乎不起作用。使用引号中的嵌套数组,我可以在查询时返回字符串:
{
"waypoints": {
"type": "LineString",
"bbox": null,
"coordinates": "[[1, 2], [3, 3]]"
}
}
我可以使用CoordinatesScalar作为输入类型,还是需要定义CoordinatesScalar可以专门为输入解析的输入类型?如果使用完整语法来发出变异,可以指定输入类型:
mutation CreateMission(mission: MissonInput) {
createMission(mission: $mission) {
id
}
}
然后您可以提供变量:
{
mission: {
waypoints: {
type: "LineString",
coordinates: [[1, 2], [3, 4]]
}
}
}
我不确定这是否能解决问题,让我知道!:)我遇到的问题是,我使用了一个第三方标量,该标量以奇怪的方式序列化/反序列化(将文本转换为DB,但不会转换为JSON)-严格来说,您的答案是正确的,但这是一个不同的问题。谢谢!@shadowchris,您是否避免使用
graphql geojson
,或者找到了解决方法?我在尝试使用该库时遇到了与您相同的问题。如果您确定了任何数据库,我认为graphql geojson
中的类型都可以您正在使用的是返回正确类型的对象,否则您必须编写一个反序列化程序。对我来说,我想我使用的是sequelize,正如我所提到的,它对字符串和json做了一些奇怪的处理。