应该/我可以更改嵌套解析器上的数据吗?

时间:2016-11-19 16:43:58

标签: graphql graphql-js

说我有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架构以检索成员,则将调用解析函数readMembersreadPhoneNumbersByMemberId来从源中获取数据。

是否可以对突变使用相同的机制?

1 个答案:

答案 0 :(得分:1)

你可以你不应该。字段解析器实际上是为了获取数据。将创建/更新/删除逻辑放在嵌套解析器中很快就会出现问题,并引入您想用graphql解决的相同问题。

对于任何复合对象创建了一个名为<-done的完整特殊类型,它被作为突变(或查询)的参数发送,这是非常沮丧的。

如果你可以解释拆分变异逻辑的好处,那么GraphQL规范可能是一个很好的RFC接受每个字段的mutate函数,这样你就可以保持变异逻辑分离,同时实现相同的嵌套特性。

如果您仍想尝试这样做,您只需从根解析器返回返回对象上的input字段,并且只有在看到该字段时才能在嵌套解析器上进行所需的更改。确保返回嵌套解析器上更改的数据。