Javascript GraphQl中的动态(唯一)对象
我在看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中,可以将类型定义为: 编辑选项:{
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\”。
。你知道问题出在哪里吗?看来你现在可以在上找到这个公共模块了。