2015-11-20 18 views
10

Tôi đang xem đồ thị. Có thể định nghĩa một đối tượng với các thuộc tính tùy ý không? Hãy nói rằng tôi có một số dữ liệu như:Đối tượng động (độc đáo) trong GraphQl

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

và điều này là trong:

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

Hãy nói rằng editOptions là không bao giờ với cấu trúc tương tự, đôi khi không thể hữu ích để có màu sắc, chỉ ví dụ sakes. Trong mongoose một chỉ có thể xác định loại một cái gì đó như:

editOptions: {}

Những editOptions thường duy nhất cho mỗi hộp. Với một số thuộc tính được chia sẻ nhưng hầu hết là duy nhất.

Vì vậy, câu hỏi của tôi là, có cách nào để thực hiện việc này không? hoặc là thực hành tồi tệ này và tôi nên thay đổi mô hình của mình.

Cảm ơn bạn.

Trả lời

3

Bạn có hai tùy chọn.

1. Giao diện

Nếu editOptions có thể thay đổi dựa trên loại, nhưng phù hợp cho loại cụ thể, bạn có thể sử dụng một Interface (node.js example).

Giả sử bạn có hai đối tượng, một hộp và hình cầu. Bạn có thể định nghĩa một giao diện đối tượng mà cả hai thực hiện:

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] 
} 

Trong truy vấn của bạn, sau đó bạn muốn trả về một Object, và các tùy chọn yêu cầu dựa cho từng loại:

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

Trong JSON trở lại, các hộp sẽ có các trường boxessize dưới editOptions và các hình cầu sẽ có spheres.

đôi khi không thể hữu ích để có màu

Nếu vì một số hộp bạn không có màu sắc, lĩnh vực này sẽ chỉ đơn giản là được sản phẩm nào (nhưng vẫn còn tồn tại trong lược đồ).

2. JSON

Nếu editOptions có thể thực sự thay đổi, bạn chỉ có thể xác định lĩnh vực này như String, và gửi qua JSON serialized. Bạn sẽ mất tất cả các loại xác thực nhưng cấu trúc có thể hoàn toàn tùy ý cho từng đối tượng. Chỉ cần chắc chắn rằng khách hàng của bạn hiểu phải làm gì với nó.

+0

Này, xin lỗi vì sự chậm trả lời, đó là một giải pháp tốt thực sự cảm ơn bạn. Vấn đề là sẽ không giống như hộp, hình cầu, hình lập phương, v.v. Chúng ta phải để nó mở ra khả năng vô hạn =) nhưng đó chắc chắn là một khả năng. cảm ơn bạn! –

7

Sử dụng GraphQLScalarType, chỉ cần thực hiện nó thích:

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

Tôi đang cố gắng sử dụng điều này, nhưng tôi nhận được thông báo này: "" message ":" Đối số \ "dữ liệu \" có giá trị không hợp lệ {a: \ "A \", b: \ "B \"}. \ NĐược xác định gõ \ "ObjectType \", tìm thấy {a: \ "A \", b: \ "B \"}. "'. Bất kỳ ý tưởng nào là vấn đề? –

+1

Có vẻ như bây giờ bạn có thể tìm thấy điều này như một mô-đun công cộng tại https://www.npmjs.com/package/graphql-type-json. – jiku

Các vấn đề liên quan