2015-11-20 63 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