GraphQl中的动态(唯一)对象

Dio*_*oso 14 javascript graphql graphql-js

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

editOptions : { boxes : 3 , size : { width: 23,height:32} , color: #434343 }, etc...}
Run Code Online (Sandbox Code Playgroud)

这是在:

{ ... , box : { editOptions : {...} }, ... }
Run Code Online (Sandbox Code Playgroud)

假设editOptions永远不会具有相同的结构,有时对于获得颜色没有用,例如sakes.在mongoose中,可以将类型定义为:

editOptions:{}

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

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

谢谢.

小智 10

使用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 },
    // ...
  },
});
Run Code Online (Sandbox Code Playgroud)

  • 现在,您可以在https://www.npmjs.com/package/graphql-type-json上找到这个公共模块. (4认同)

Pet*_*ela 8

你有两个选择.

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]
}
Run Code Online (Sandbox Code Playgroud)

在您的查询中,您将返回一个Object,以及基于每种类型的请求选项:

query Query {
  objects(filter: "...") {
    ... on Box {
      editOptions {
        boxes
        size
      }
    }
    ... on Sphere {
      editOptions {
        spheres
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在返回的JSON中,框将包含boxessize字段editOptions,并且球将具有spheres.

有时没有颜色有用

如果对于某些您没有颜色的框,该字段将只是空(但仍存在于模式中).

2. JSON

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


Yuc*_*uci 5

尝试 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 });
Run Code Online (Sandbox Code Playgroud)

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

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