使用循环引用动态创建 graphql 模式
Dynamically creating graphql schema with circular references
通过使用 graphql-js,我需要通过迭代一些数据数组来动态创建 graphql 模式,例如:
[{
name: 'author',
fields: [{
field: 'name'
}, {
field: 'books',
reference: 'book'
}]
}, {
name: 'book',
fields: [{
field: 'title'
}, {
field: 'author',
reference: 'author'
}]
}]
问题是循环引用。当我创建 AuthorType 时,我需要 BookType 已经创建,反之亦然。
因此生成的架构应如下所示:
type Author : Object {
id: ID!
name: String,
books: [Book]
}
type Book : Object {
id: ID!
title: String
author: Author
}
我该如何解决这个问题?
引用自官方文档
http://graphql.org/docs/api-reference-type-system/
When two types need to refer to each other, or a type needs to refer
to itself in a field, you can use a function expression (aka a closure
or a thunk) to supply the fields lazily.
var AddressType = new GraphQLObjectType({
name: 'Address',
fields: {
street: { type: GraphQLString },
number: { type: GraphQLInt },
formatted: {
type: GraphQLString,
resolve(obj) {
return obj.number + ' ' + obj.street
}
}
}
});
var PersonType = new GraphQLObjectType({
name: 'Person',
fields: () => ({
name: { type: GraphQLString },
bestFriend: { type: PersonType },
})
});
另请参阅循环类别-子类别类型的相关 answer
我通过对 fields 字段使用 thunk 解决了这个问题。
const User = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: { type: GraphQLID }
})
});
当您将字段设为 thunk 而不是对象文字时,您可以使用稍后在文件中定义的类型。
请参阅此 post 了解更多信息
基于此post我认为这是正确的做法。
通过使用 graphql-js,我需要通过迭代一些数据数组来动态创建 graphql 模式,例如:
[{
name: 'author',
fields: [{
field: 'name'
}, {
field: 'books',
reference: 'book'
}]
}, {
name: 'book',
fields: [{
field: 'title'
}, {
field: 'author',
reference: 'author'
}]
}]
问题是循环引用。当我创建 AuthorType 时,我需要 BookType 已经创建,反之亦然。
因此生成的架构应如下所示:
type Author : Object {
id: ID!
name: String,
books: [Book]
}
type Book : Object {
id: ID!
title: String
author: Author
}
我该如何解决这个问题?
引用自官方文档
http://graphql.org/docs/api-reference-type-system/
When two types need to refer to each other, or a type needs to refer to itself in a field, you can use a function expression (aka a closure or a thunk) to supply the fields lazily.
var AddressType = new GraphQLObjectType({
name: 'Address',
fields: {
street: { type: GraphQLString },
number: { type: GraphQLInt },
formatted: {
type: GraphQLString,
resolve(obj) {
return obj.number + ' ' + obj.street
}
}
}
});
var PersonType = new GraphQLObjectType({
name: 'Person',
fields: () => ({
name: { type: GraphQLString },
bestFriend: { type: PersonType },
})
});
另请参阅循环类别-子类别类型的相关 answer
我通过对 fields 字段使用 thunk 解决了这个问题。
const User = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: { type: GraphQLID }
})
});
当您将字段设为 thunk 而不是对象文字时,您可以使用稍后在文件中定义的类型。
请参阅此 post 了解更多信息
基于此post我认为这是正确的做法。