Should/Can 我对嵌套解析器上的数据进行了更改?
Should/Can I make changes to data on nested resolvers?
假设我有一个 MemberType
这样的
import {
GraphQLID,
GraphQLList,
GraphQLNonNull,
GraphQLObjectType,
GraphQLString
} from 'graphql'
import readPhoneNumbersByMemberId from '../resolvers/readPhoneNumbersByMemberId'
import PhoneNumberType from './PhoneNumberType'
const MemberType = new GraphQLObjectType({
name: 'Member',
fields: {
id: {
type: new GraphQLNonNull(GraphQLID)
},
firstName: {
type: new GraphQLNonNull(GraphQLString)
},
lastName: {
type: new GraphQLNonNull(GraphQLString)
},
phoneNumbers: {
type: new GraphQLList(PhoneNumberType),
resolve: readPhoneNumbersByMemberId
}
}
})
export default MemberType
还有一个像这样的PhoneNumberType
import {
GraphQLNonNull,
GraphQLObjectType,
GraphQLString
} from 'graphql'
const PhoneNumberType = new GraphQLObjectType({
name: 'PhoneNumber',
fields: {
value: {
type: new GraphQLNonNull(GraphQLString)
}
}
})
export default PhoneNumberType
和这样的QueryType
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
readMembers: {
type: new GraphQLList(MemberType),
resolve: readMembers
}
}
})
现在,如果我查询 GraphQL 模式以检索成员,解析函数 readMembers
和 readPhoneNumbersByMemberId
将被调用以从源中获取数据。
是否可以对突变使用相同的机制?
可以,但不应该。字段解析器实际上是用来获取数据的。将 create/update/delete 逻辑放入嵌套的解析器中可能很快就会出现问题,并引入您希望使用 graphql 解决的相同问题。
Facebook 为作为参数发送给突变(或查询)的任何复合对象创建了一个名为 input
的完整特殊类型,这令人非常沮丧。
如果您能解释拆分变异逻辑的好处,GraphQL 规范接受每个字段的变异函数可能是一个很好的 RFC,这样您将保持变异逻辑分离,同时实现相同的嵌套性质。
如果您仍然想尝试,您可以 return 在根解析器的 returned 对象上添加一个 action
字段,然后在嵌套的仅当您看到该字段时才使用解析器。确保你 return 在嵌套解析器上更改的数据。
假设我有一个 MemberType
这样的
import {
GraphQLID,
GraphQLList,
GraphQLNonNull,
GraphQLObjectType,
GraphQLString
} from 'graphql'
import readPhoneNumbersByMemberId from '../resolvers/readPhoneNumbersByMemberId'
import PhoneNumberType from './PhoneNumberType'
const MemberType = new GraphQLObjectType({
name: 'Member',
fields: {
id: {
type: new GraphQLNonNull(GraphQLID)
},
firstName: {
type: new GraphQLNonNull(GraphQLString)
},
lastName: {
type: new GraphQLNonNull(GraphQLString)
},
phoneNumbers: {
type: new GraphQLList(PhoneNumberType),
resolve: readPhoneNumbersByMemberId
}
}
})
export default MemberType
还有一个像这样的PhoneNumberType
import {
GraphQLNonNull,
GraphQLObjectType,
GraphQLString
} from 'graphql'
const PhoneNumberType = new GraphQLObjectType({
name: 'PhoneNumber',
fields: {
value: {
type: new GraphQLNonNull(GraphQLString)
}
}
})
export default PhoneNumberType
和这样的QueryType
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
readMembers: {
type: new GraphQLList(MemberType),
resolve: readMembers
}
}
})
现在,如果我查询 GraphQL 模式以检索成员,解析函数 readMembers
和 readPhoneNumbersByMemberId
将被调用以从源中获取数据。
是否可以对突变使用相同的机制?
可以,但不应该。字段解析器实际上是用来获取数据的。将 create/update/delete 逻辑放入嵌套的解析器中可能很快就会出现问题,并引入您希望使用 graphql 解决的相同问题。
Facebook 为作为参数发送给突变(或查询)的任何复合对象创建了一个名为 input
的完整特殊类型,这令人非常沮丧。
如果您能解释拆分变异逻辑的好处,GraphQL 规范接受每个字段的变异函数可能是一个很好的 RFC,这样您将保持变异逻辑分离,同时实现相同的嵌套性质。
如果您仍然想尝试,您可以 return 在根解析器的 returned 对象上添加一个 action
字段,然后在嵌套的仅当您看到该字段时才使用解析器。确保你 return 在嵌套解析器上更改的数据。