2015-11-20 24 views
10

我在看graphql。是否可以定义一个具有任意属性的对象?比方说,我有一些数据,如:GraphQl中的动态(唯一)对象

editOptions : { boxes : 3 , size : { width: 23,height:32} , color: #434343 }, etc...} 

,这是在:

{ ... , box : { editOptions : {...} }, ... } 

假设editOptions是永远具有相同的结构,有时没有用有颜色的,只是举例缘故。在猫鼬可以只定义类型类似:

editOptions:{}

这些editOptions通常是每盒独特。有些属性被共享,但大多数是独特的。

所以我的问题是,有没有办法做到这一点?或者这是不好的做法,我应该改变我的模型。

谢谢。

回答

3

您有两种选择。

1.接口

如果editOptions可基于类型而有所不同,但对于该特定类型相一致,则可以使用一个Interfacenode.js example)。

比方说,你有两个对象,一个盒子和一个球体。您可以定义一个对象的接口,都实现:根据每种类型

interface Object 
type Box implements Object { 
    editOptions: BoxOptions 
} 
type BoxOptions { 
    boxes: Int, 
    size: ..., 
    color: ... 
} 
type Sphere implements Object { 
    editOptions: SphereOptions 
} 
type SphereOptions { 
    spheres: Int, 
    ... 
} 
type Query { 
    objects: [Object] 
} 

在您的查询,你会再返回一个Object,并且请求的选项:

query Query { 
    objects(filter: "...") { 
    ... on Box { 
     editOptions { 
     boxes 
     size 
     } 
    } 
    ... on Sphere { 
     editOptions { 
     spheres 
     } 
    } 
    } 
} 

在返回的JSON,盒子将在editOptions下有boxessize字段,球体将有spheres

如果一些箱子你没有颜色有时不能有颜色

有用,现场只会是空的(但在架构中仍然存在)。

2. JSON

如果editOptions可真变量,你可以将该字段定义为字符串,并发送了序列化JSON。您将失去所有类型的验证,但对于每个对象,结构可以是完全任意的。只要确保你的客户了解如何处理它。

+0

嘿,抱歉这么晚才回复,这是一个很好的解决方案确实谢谢。问题是,不会像盒子,球体,立方体等一样。我们必须让它敞开无限的可能性=)但这绝对是一种可能性。谢谢! –

7

使用GraphQLScalarType,简单地实现它想:

import { GraphQLScalarType } from 'graphql/type'; 
import { GraphQLError } from 'graphql/error'; 
import { Kind } from 'graphql/language'; 

const ObjectType = new GraphQLScalarType({ 
    name: 'ObjectType', 
    serialize: value => value, 
    parseValue: value => value, 
    parseLiteral: (ast) => { 
    if (ast.kind !== Kind.OBJECT) { 
     throw new GraphQLError(
     `Query error: Can only parse object but got a: ${ast.kind}`, 
     [ast], 
    ); 
    } 
    return ast.value; 
    }, 
}); 

const ReturnType = new GraphQLObjectType({ 
    name: 'ReturnType', 
    fields: { 
    // ... 
    editOptions: { type: ObjectType }, 
    // ... 
    }, 
}); 
+0

我试图使用这个,但我得到这个消息:''message“:”Argument \“data \”具有无效值{a:\“A \”,b:\“B \”}。\ nExpected键入\“ObjectType \”,找到{a:\“A \”,b:\“B \”}。“。任何想法是哪里的问题? –

+1

似乎你现在可以在https://www.npmjs.com/package/graphql-type-json找到这个公共模块。 – jiku