Javascript GraphQl中的动态(唯一)对象

Javascript GraphQl中的动态(唯一)对象,javascript,graphql,graphql-js,Javascript,Graphql,Graphql Js,我在看graphql。是否可以定义具有任意属性的对象?假设我有一些数据,比如: editOptions : { boxes : 3 , size : { width: 23,height:32} , color: #434343 }, etc...} 这是在: { ... , box : { editOptions : {...} }, ... } 假设editOptions永远不会具有相同的结构,有时使用颜色是没有用的,例如sakes。在mongoose中,可以将类型定义为: 编辑选项:{

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

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

{ ... , box : { editOptions : {...} }, ... }
假设editOptions永远不会具有相同的结构,有时使用颜色是没有用的,例如sakes。在mongoose中,可以将类型定义为:

编辑选项:{}

对于每个框,这些编辑选项通常是唯一的。有些属性是共享的,但大多数是唯一的

所以我的问题是,有没有办法做到这一点?或者这是一种糟糕的做法,我应该改变我的模式

谢谢。

您有两个选择

1.接口 如果
editOptions
可能因类型而异,但与该特定类型一致,则可以使用()

假设有两个对象,一个长方体和一个球体。您可以定义一个对象接口,这两个接口都实现:

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]
}
在查询中,然后返回一个
对象
,以及基于每种类型请求的选项:

query Query {
  objects(filter: "...") {
    ... on Box {
      editOptions {
        boxes
        size
      }
    }
    ... on Sphere {
      editOptions {
        spheres
      }
    }
  }
}
在返回的JSON中,框将在
editOptions
下具有
box
size
字段,球体将具有
spheres

有时,有颜色是没有用的

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

2.JSON
如果
editOptions
确实是可变的,您可以将字段定义为字符串,然后发送序列化的JSON。您将丢失所有类型验证,但每个对象的结构可以是完全任意的。只需确保您的客户了解如何使用它。

使用
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 },
    // ...
  },
});

尝试GraphQL.js的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 });
您还可以在以编程方式构造的模式中使用它


请参见

嘿,很抱歉回复太晚,这是一个很好的解决方案,谢谢。问题是不会有像长方体、球体、立方体等那样的东西。我们必须让它向无限的可能性开放(=),但这绝对是一种可能性。非常感谢。我正试图使用它,但我收到了以下消息:
“消息”:“参数\“数据\”具有无效值{a:\“a\”,b:\“b\”}。\n预期类型\“ObjectType\”,找到了{a:\“a\”,b:“b\”。
。你知道问题出在哪里吗?看来你现在可以在上找到这个公共模块了。