19

我在看graphql。是否可以定义具有任意属性的对象?假设我有一些数据,例如:

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

这是在:

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

假设 editOptions 从不具有相同的结构,有时没有颜色是有用的,只是为了举例。在猫鼬中,可以将类型定义为:

编辑选项:{}

这些 editOptions 通常对于每个框都是唯一的。有些属性是共享的,但大多数是独一无二的。

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

谢谢你。

4

3 回答 3

12

使用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 },
    // ...
  },
});
于 2015-12-11T17:52:05.963 回答
11

你有两个选择。

1.接口

如果editOptions可能因类型而异,但对于该特定类型是一致的,则可以使用接口node.js 示例)。

假设您有两个对象,一个盒子和一个球体。您可以定义一个同时实现的对象接口:

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 中,框将具有boxessize下的字段editOptions,而球体将具有spheres

有时没有颜色是有用的

如果某些框没有颜色,则该字段将为空(但仍存在于架构中)。

2.JSON

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

于 2015-12-09T18:30:27.720 回答
4

尝试 GraphQL.js 的 JSON 标量类型:graphql-type-json。这对我很有效。

将 SDL 与 GraphQL 工具一起使用时,将 GraphQLJSON 定义为架构中适当标量类型的解析器:

import { makeExecutableSchema } from 'graphql-tools';
import GraphQLJSON from 'graphql-type-json';

const typeDefs = `
  scalar JSON

  type MyType {
    editOptions: JSON
  }
`;

const resolvers = {
  JSON: GraphQLJSON,
};

export default makeExecutableSchema({ typeDefs, resolvers });

您还可以在以编程方式构建的模式中使用它。

有关此软件包的更多详细信息,请参阅

于 2018-11-30T12:15:41.850 回答